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

Function handleRead

plugins/esi/serverIntercept.cc:137–207  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

135}
136
137static bool
138handleRead(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.

Callers 2

serverInterceptFunction · 0.70
do_read_callMethod · 0.50

Calls 15

TSIOBufferReaderAvailFunction · 0.85
TSHttpHdrParseReqFunction · 0.85
TSMimeHdrFieldFindFunction · 0.85
TSHandleMLocReleaseFunction · 0.85
TSVIONDoneSetFunction · 0.85
TSVIONDoneGetFunction · 0.85
TSVIOReenableFunction · 0.85
TSErrorFunction · 0.50
TSIOBufferReaderStartFunction · 0.50
TSIOBufferBlockReadStartFunction · 0.50
TSIOBufferBlockNextFunction · 0.50

Tested by

no test coverage detected