| 92 | const int LOCAL_PORT = 8080; |
| 93 | |
| 94 | static int |
| 95 | handleFetchEvents(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); |
nothing calls this directly
no test coverage detected