* Process a chunk of the connection stream. * * @param[in] sd * @param[in] direction * @param[in] hlf */
| 217 | * @param[in] hlf |
| 218 | */ |
| 219 | void process_stream_data(stream_data *sd, int direction, struct half_stream *hlf) { |
| 220 | chunk_t *chunk = NULL; |
| 221 | int rc; |
| 222 | |
| 223 | //printf("#DATA direction %d bytes %d\n", sd->direction, hlf->count_new); |
| 224 | |
| 225 | if (sd->direction == direction) { |
| 226 | // Inbound data |
| 227 | |
| 228 | switch(sd->connp->in_status) { |
| 229 | case HTP_STREAM_NEW : |
| 230 | case HTP_STREAM_DATA : |
| 231 | // Send data to parser |
| 232 | |
| 233 | rc = htp_connp_req_data(sd->connp, 0, hlf->data, hlf->count_new); |
| 234 | if (rc == HTP_STREAM_DATA_OTHER) { |
| 235 | // Encountered inbound parsing block |
| 236 | |
| 237 | // Store partial chunk for later |
| 238 | chunk = calloc(1, sizeof(chunk_t)); |
| 239 | // TODO |
| 240 | chunk->len = hlf->count_new - htp_connp_req_data_consumed(sd->connp); |
| 241 | chunk->data = malloc(chunk->len); |
| 242 | // TODO |
| 243 | memcpy(chunk->data, hlf->data + htp_connp_req_data_consumed(sd->connp), chunk->len); |
| 244 | htp_list_add(sd->inbound_chunks, chunk); |
| 245 | } else |
| 246 | if (rc != HTP_STREAM_DATA) { |
| 247 | // Inbound parsing error |
| 248 | sd->log_level = 0; |
| 249 | fprintf(stderr, "[#%d] Inbound parsing error: %d\n", sd->id, rc); |
| 250 | // TODO Write connection to disk |
| 251 | } |
| 252 | break; |
| 253 | |
| 254 | case HTP_STREAM_ERROR : |
| 255 | // Do nothing |
| 256 | break; |
| 257 | |
| 258 | case HTP_STREAM_DATA_OTHER : |
| 259 | // Store data for later |
| 260 | chunk = calloc(1, sizeof(chunk_t)); |
| 261 | // TODO |
| 262 | chunk->len = hlf->count_new; |
| 263 | chunk->data = malloc(chunk->len); |
| 264 | // TODO |
| 265 | memcpy(chunk->data, hlf->data, chunk->len); |
| 266 | htp_list_add(sd->inbound_chunks, chunk); |
| 267 | break; |
| 268 | } |
| 269 | } else { |
| 270 | // Outbound data |
| 271 | switch(sd->connp->out_status) { |
| 272 | case HTP_STREAM_NEW : |
| 273 | case HTP_STREAM_DATA : |
| 274 | // Send data to parser |
| 275 | |
| 276 | rc = htp_connp_res_data(sd->connp, 0, hlf->data, hlf->count_new); |
no test coverage detected