| 198 | } |
| 199 | |
| 200 | static int |
| 201 | handle(TSCont c, TSEvent e, void * /* d ATS_UNUSED */) |
| 202 | { |
| 203 | Self *const self = static_cast<Self *const>(TSContDataGet(c)); |
| 204 | assert(self != nullptr); |
| 205 | switch (e) { |
| 206 | case TS_EVENT_ERROR: |
| 207 | Dbg(dbg_ctl, "HttpTransaction: ERROR"); |
| 208 | self->t_.error(); |
| 209 | self->abort(); |
| 210 | close(self); |
| 211 | TSContDataSet(c, nullptr); |
| 212 | break; |
| 213 | case TS_EVENT_VCONN_EOS: |
| 214 | Dbg(dbg_ctl, "HttpTransaction: EOS"); |
| 215 | goto here; |
| 216 | |
| 217 | case TS_EVENT_VCONN_READ_COMPLETE: |
| 218 | Dbg(dbg_ctl, "HttpTransaction: Read Complete"); |
| 219 | goto here; |
| 220 | |
| 221 | case TS_EVENT_VCONN_READ_READY: |
| 222 | Dbg(dbg_ctl, "HttpTransaction: Read"); |
| 223 | here: { |
| 224 | assert(self->in_ != nullptr); |
| 225 | assert(self->in_->reader != nullptr); |
| 226 | assert(self->in_->vio != nullptr); |
| 227 | const int64_t available = TSIOBufferReaderAvail(self->in_->reader); |
| 228 | if (available > 0) { |
| 229 | if (self->parsingHeaders_) { |
| 230 | if (self->parser_.parse(*self->in_)) { |
| 231 | if (isChunkEncoding(self->parser_.buffer_, self->parser_.location_)) { |
| 232 | assert(self->chunkDecoder_ == nullptr); |
| 233 | self->chunkDecoder_ = new ChunkDecoder(); |
| 234 | } |
| 235 | self->t_.header(self->parser_.buffer_, self->parser_.location_); |
| 236 | self->parsingHeaders_ = false; |
| 237 | } |
| 238 | } |
| 239 | if (!self->parsingHeaders_) { |
| 240 | if (self->chunkDecoder_ != nullptr) { |
| 241 | int64_t i = self->chunkDecoder_->decode(self->in_->reader); |
| 242 | do { |
| 243 | assert(i <= available); |
| 244 | self->t_.data(self->in_->reader, i); |
| 245 | TSIOBufferReaderConsume(self->in_->reader, i); |
| 246 | i = self->chunkDecoder_->decode(self->in_->reader); |
| 247 | } while (i > 0); |
| 248 | } else { |
| 249 | const int64_t l = self->t_.data(self->in_->reader, available); |
| 250 | TSIOBufferReaderConsume(self->in_->reader, l); |
| 251 | } |
| 252 | } |
| 253 | } |
| 254 | if (e == TS_EVENT_VCONN_READ_COMPLETE || e == TS_EVENT_VCONN_EOS) { |
| 255 | self->t_.done(); |
| 256 | close(self); |
| 257 | TSContDataSet(c, nullptr); |
nothing calls this directly
no test coverage detected