| 135 | } |
| 136 | |
| 137 | static bool |
| 138 | handleRead(SContData *cont_data, bool &read_complete) |
| 139 | { |
| 140 | int avail = TSIOBufferReaderAvail(cont_data->input.reader); |
| 141 | if (avail == TS_ERROR) { |
| 142 | TSError("[server_intercept][%s] Error while getting number of bytes available", __FUNCTION__); |
| 143 | return false; |
| 144 | } |
| 145 | |
| 146 | Dbg(dbg_ctl, "[%s] Parsed header, avail: %d", __FUNCTION__, avail); |
| 147 | |
| 148 | int consumed = 0; |
| 149 | if (avail > 0) { |
| 150 | int64_t data_len; |
| 151 | const char *data; |
| 152 | TSIOBufferBlock block = TSIOBufferReaderStart(cont_data->input.reader); |
| 153 | while (block != nullptr) { |
| 154 | data = TSIOBufferBlockReadStart(block, cont_data->input.reader, &data_len); |
| 155 | if (!cont_data->req_hdr_parsed) { |
| 156 | const char *endptr = data + data_len; |
| 157 | if (TSHttpHdrParseReq(cont_data->http_parser, cont_data->req_hdr_bufp, cont_data->req_hdr_loc, &data, endptr) == |
| 158 | TS_PARSE_DONE) { |
| 159 | Dbg(dbg_ctl, "[%s] Parsed header", __FUNCTION__); |
| 160 | TSMLoc content_len_loc = |
| 161 | TSMimeHdrFieldFind(cont_data->req_hdr_bufp, cont_data->req_hdr_loc, TS_MIME_FIELD_CONTENT_LENGTH, -1); |
| 162 | if (!content_len_loc) { |
| 163 | TSError("[server_intercept][%s] request doesn't contain content length header [%s]", __FUNCTION__, |
| 164 | TS_MIME_FIELD_CONTENT_TYPE); |
| 165 | return false; |
| 166 | } |
| 167 | cont_data->req_content_len = |
| 168 | TSMimeHdrFieldValueIntGet(cont_data->req_hdr_bufp, cont_data->req_hdr_loc, content_len_loc, 0); |
| 169 | TSHandleMLocRelease(cont_data->req_hdr_bufp, cont_data->req_hdr_loc, content_len_loc); |
| 170 | Dbg(dbg_ctl, "[%s] Got content length as %d", __FUNCTION__, cont_data->req_content_len); |
| 171 | if (cont_data->req_content_len <= 0) { |
| 172 | TSError("[server_intercept][%s] Invalid content length [%d]", __FUNCTION__, cont_data->req_content_len); |
| 173 | return false; |
| 174 | } |
| 175 | if (endptr - data) { |
| 176 | Dbg(dbg_ctl, "[%s] Appending %ld bytes to body", __FUNCTION__, static_cast<long int>(endptr - data)); |
| 177 | cont_data->body.append(data, endptr - data); |
| 178 | } |
| 179 | cont_data->req_hdr_parsed = true; |
| 180 | } |
| 181 | } else { |
| 182 | Dbg(dbg_ctl, "[%s] Appending %" PRId64 " bytes to body", __FUNCTION__, data_len); |
| 183 | cont_data->body.append(data, data_len); |
| 184 | } |
| 185 | consumed += data_len; |
| 186 | block = TSIOBufferBlockNext(block); |
| 187 | } |
| 188 | } |
| 189 | |
| 190 | TSIOBufferReaderConsume(cont_data->input.reader, consumed); |
| 191 | |
| 192 | Dbg(dbg_ctl, "[%s] Consumed %d bytes from input vio, avail: %d", __FUNCTION__, consumed, avail); |
| 193 | |
| 194 | // Modify the input VIO to reflect how much data we've completed. |
no test coverage detected