/** * Handles request parser state changes. At the moment, this function is used only * to configure data receivers, which are sent raw connection data. * * @param[in] connp * @return HTP_OK, or a value returned from a callback. */ static htp_status_t htp_res_handle_state_change(htp_connp_t *connp) { if (connp->out_state_previous == connp->out_state) return HTP_OK; if (connp->out_state == htp_connp_RES_HEADERS) { htp_status_t rc; switch (connp->out_tx->progress) { case HTP_RESPONSE_HEADERS: rc = htp_connp_res_receiver_set(connp, connp->out_tx->cfg->hook_response_header_data); break; case HTP_RESPONSE_TRAILER: rc = htp_connp_res_receiver_set(connp, connp->out_tx->cfg->hook_response_trailer_data); break; default: break; } if (rc != HTP_OK) return rc; } // Same comment as in htp_req_handle_state_change(). connp->out_state_previous = connp->out_state; return HTP_OK; }
/** * Handles request parser state changes. At the moment, this function is used only * to configure data receivers, which are sent raw connection data. * * @param[in] connp * @return HTP_OK, or a value returned from a callback. */ static htp_status_t htp_res_handle_state_change(htp_connp_t *connp) { if (connp->out_state_previous == connp->out_state) return HTP_OK; if (connp->out_state == htp_connp_RES_HEADERS) { htp_status_t rc = HTP_OK; switch (connp->out_tx->response_progress) { case HTP_RESPONSE_HEADERS: rc = htp_connp_res_receiver_set(connp, connp->out_tx->cfg->hook_response_header_data); break; case HTP_RESPONSE_TRAILER: rc = htp_connp_res_receiver_set(connp, connp->out_tx->cfg->hook_response_trailer_data); break; default: // Do nothing; receivers are currently used only for header blocks. break; } if (rc != HTP_OK) return rc; } // Same comment as in htp_req_handle_state_change(). Below is a copy. // Initially, I had the finalization of raw data sending here, but that // caused the last REQUEST_HEADER_DATA hook to be invoked after the // REQUEST_HEADERS hook -- which I thought made no sense. For that reason, // the finalization is now initiated from the request header processing code, // which is less elegant but provides a better user experience. Having some // (or all) hooks to be invoked on state change might work better. connp->out_state_previous = connp->out_state; return HTP_OK; }