MCPcopy Create free account
hub / github.com/apache/trafficserver / state_read_push_response_header

Method state_read_push_response_header

src/proxy/http/HttpSM.cc:997–1086  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

995}
996
997int
998HttpSM::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

Callers

nothing calls this directly

Calls 12

http_parser_clearFunction · 0.85
ink_get_hrtimeFunction · 0.85
get_entryMethod · 0.80
get_txnMethod · 0.80
block_read_availMethod · 0.80
version_getMethod · 0.80
read_availMethod · 0.45
get_remote_readerMethod · 0.45
startMethod · 0.45
parse_respMethod · 0.45
consumeMethod · 0.45
reenableMethod · 0.45

Tested by

no test coverage detected