| 995 | } |
| 996 | |
| 997 | int |
| 998 | HttpSM::state_read_push_response_header(int event, void *data) |
| 999 | { |
| 1000 | STATE_ENTER(&HttpSM::state_read_push_response_header, event); |
| 1001 | ink_assert(_ua.get_entry()->read_vio == (VIO *)data); |
| 1002 | ink_assert(t_state.current.server == nullptr); |
| 1003 | |
| 1004 | switch (event) { |
| 1005 | case VC_EVENT_EOS: |
| 1006 | _ua.get_entry()->eos = true; |
| 1007 | // Fall through |
| 1008 | |
| 1009 | case VC_EVENT_READ_READY: |
| 1010 | case VC_EVENT_READ_COMPLETE: |
| 1011 | // More data to parse |
| 1012 | break; |
| 1013 | |
| 1014 | case VC_EVENT_ERROR: |
| 1015 | case VC_EVENT_INACTIVITY_TIMEOUT: |
| 1016 | case VC_EVENT_ACTIVE_TIMEOUT: |
| 1017 | // The user agent is hosed. Send an error |
| 1018 | set_ua_abort(HttpTransact::ABORTED, event); |
| 1019 | call_transact_and_set_next_state(HttpTransact::HandleBadPushRespHdr); |
| 1020 | return 0; |
| 1021 | } |
| 1022 | |
| 1023 | int state = PARSE_RESULT_CONT; |
| 1024 | while (_ua.get_txn()->get_remote_reader()->read_avail() && state == PARSE_RESULT_CONT) { |
| 1025 | const char *start = _ua.get_txn()->get_remote_reader()->start(); |
| 1026 | const char *tmp = start; |
| 1027 | int64_t data_size = _ua.get_txn()->get_remote_reader()->block_read_avail(); |
| 1028 | ink_assert(data_size >= 0); |
| 1029 | |
| 1030 | ///////////////////// |
| 1031 | // tokenize header // |
| 1032 | ///////////////////// |
| 1033 | state = t_state.hdr_info.server_response.parse_resp(&http_parser, &tmp, tmp + data_size, |
| 1034 | false); // Only call w/ eof when data exhausted |
| 1035 | |
| 1036 | int64_t bytes_used = tmp - start; |
| 1037 | |
| 1038 | ink_release_assert(bytes_used <= data_size); |
| 1039 | _ua.get_txn()->get_remote_reader()->consume(bytes_used); |
| 1040 | pushed_response_hdr_bytes += bytes_used; |
| 1041 | client_request_body_bytes += bytes_used; |
| 1042 | } |
| 1043 | |
| 1044 | // We are out of data. If we've received an EOS we need to |
| 1045 | // call the parser with (eof == true) so it can determine |
| 1046 | // whether to use the response as is or declare a parse error |
| 1047 | if (_ua.get_entry()->eos) { |
| 1048 | const char *end = _ua.get_txn()->get_remote_reader()->start(); |
| 1049 | state = t_state.hdr_info.server_response.parse_resp(&http_parser, &end, end, true // We are out of data after server eos |
| 1050 | ); |
| 1051 | ink_release_assert(state == PARSE_RESULT_DONE || state == PARSE_RESULT_ERROR); |
| 1052 | } |
| 1053 | // Don't allow 0.9 (unparsable headers) since TS doesn't |
| 1054 | // cache 0.9 responses |
nothing calls this directly
no test coverage detected