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

Function handleFetchEvents

src/tscpp/api/AsyncHttpFetch.cc:94–154  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

92const int LOCAL_PORT = 8080;
93
94static int
95handleFetchEvents(TSCont cont, TSEvent event, void *edata)
96{
97 LOG_DEBUG("Received fetch event = %d, edata = %p", event, edata);
98 AsyncHttpFetch *fetch_provider = static_cast<AsyncHttpFetch *>(TSContDataGet(cont));
99 AsyncHttpFetchState *state = utils::internal::getAsyncHttpFetchState(*fetch_provider);
100
101 if (state->streaming_flag_ == AsyncHttpFetch::STREAMING_DISABLED) {
102 if (event == static_cast<int>(AsyncHttpFetch::RESULT_SUCCESS)) {
103 TSHttpTxn txn = static_cast<TSHttpTxn>(edata);
104 int data_len;
105 const char *data_start = TSFetchRespGet(txn, &data_len);
106 if (data_start && (data_len > 0)) {
107 const char *data_end = data_start + data_len;
108 TSHttpParser parser = TSHttpParserCreate();
109 state->hdr_buf_ = TSMBufferCreate();
110 state->hdr_loc_ = TSHttpHdrCreate(state->hdr_buf_);
111 TSHttpHdrTypeSet(state->hdr_buf_, state->hdr_loc_, TS_HTTP_TYPE_RESPONSE);
112 if (TSHttpHdrParseResp(parser, state->hdr_buf_, state->hdr_loc_, &data_start, data_end) == TS_PARSE_DONE) {
113 TSHttpStatus status = TSHttpHdrStatusGet(state->hdr_buf_, state->hdr_loc_);
114 state->body_ = data_start; // data_start will now be pointing to body
115 state->body_size_ = data_end - data_start;
116 utils::internal::initResponse(state->response_, state->hdr_buf_, state->hdr_loc_);
117 LOG_DEBUG("Fetch result had a status code of %d with a body length of %ld", status, state->body_size_);
118 } else {
119 LOG_ERROR("Unable to parse response; Request URL [%s]; transaction %p", state->request_->getUrl().getUrlString().c_str(),
120 txn);
121 event = static_cast<TSEvent>(AsyncHttpFetch::RESULT_FAILURE);
122 }
123 TSHttpParserDestroy(parser);
124 } else {
125 LOG_ERROR("Successful fetch did not result in any content. Assuming failure");
126 event = static_cast<TSEvent>(AsyncHttpFetch::RESULT_FAILURE);
127 }
128 state->result_ = static_cast<AsyncHttpFetch::Result>(event);
129 }
130 } else {
131 LOG_DEBUG("Handling streaming event %d", event);
132 if (event == static_cast<TSEvent>(TS_FETCH_EVENT_EXT_HEAD_DONE)) {
133 utils::internal::initResponse(state->response_, TSFetchRespHdrMBufGet(state->fetch_sm_),
134 TSFetchRespHdrMLocGet(state->fetch_sm_));
135 LOG_DEBUG("Response header initialized");
136 state->result_ = AsyncHttpFetch::RESULT_HEADER_COMPLETE;
137 } else {
138 state->body_size_ = TSFetchReadData(state->fetch_sm_, state->body_buffer_, sizeof(state->body_buffer_));
139 LOG_DEBUG("Read %zu bytes", state->body_size_);
140 state->result_ = (event == static_cast<TSEvent>(TS_FETCH_EVENT_EXT_BODY_READY)) ? AsyncHttpFetch::RESULT_PARTIAL_BODY :
141 AsyncHttpFetch::RESULT_BODY_COMPLETE;
142 }
143 }
144 if (!state->dispatch_controller_->dispatch()) {
145 LOG_DEBUG("Unable to dispatch result from AsyncFetch because promise has died.");
146 }
147
148 if ((state->streaming_flag_ == AsyncHttpFetch::STREAMING_DISABLED) || (state->result_ == AsyncHttpFetch::RESULT_BODY_COMPLETE)) {
149 LOG_DEBUG("Shutting down");
150 utils::internal::deleteAsyncHttpFetch(fetch_provider); // we must always cleans up when we're done.
151 TSContDestroy(cont);

Callers

nothing calls this directly

Calls 15

TSContDataGetFunction · 0.85
TSFetchRespGetFunction · 0.85
TSHttpParserCreateFunction · 0.85
TSMBufferCreateFunction · 0.85
TSHttpHdrCreateFunction · 0.85
TSHttpHdrTypeSetFunction · 0.85
TSHttpHdrParseRespFunction · 0.85
TSHttpHdrStatusGetFunction · 0.85
TSHttpParserDestroyFunction · 0.85
TSFetchRespHdrMBufGetFunction · 0.85
TSFetchRespHdrMLocGetFunction · 0.85
TSFetchReadDataFunction · 0.85

Tested by

no test coverage detected