unsigned int flags;
/** Transaction progress. Look for the TX_PROGRESS_* constants for more information. */
- unsigned int progress;
+ unsigned int progress[2];
};
/** This structure is used to pass transaction data to callbacks. */
char *htp_connp_in_state_as_string(htp_connp_t *connp);
char *htp_connp_out_state_as_string(htp_connp_t *connp);
-char *htp_tx_progress_as_string(htp_tx_t *tx);
+char *htp_tx_progress_as_string(htp_tx_t *tx, int direction);
bstr *htp_unparse_uri_noencode(htp_uri_t *uri);
if (connp->in_tx->request_method_number == M_CONNECT) {
connp->in_state = htp_connp_REQ_CONNECT_WAIT_RESPONSE;
connp->in_status = STREAM_STATE_DATA_OTHER;
- connp->in_tx->progress = TX_PROGRESS_WAIT;
+ connp->in_tx->progress[0] = TX_PROGRESS_WAIT;
return HTP_DATA_OTHER;
}
int htp_connp_REQ_CONNECT_WAIT_RESPONSE(htp_connp_t *connp) {
// Check that we saw the response line of the current
// inbound transaction.
- if (connp->in_tx->progress <= TX_PROGRESS_RES_LINE) {
+ if (connp->in_tx->progress[0] <= TX_PROGRESS_RES_LINE) {
return HTP_DATA_OTHER;
}
} else if (connp->in_chunked_length == 0) {
// End of data
connp->in_state = htp_connp_REQ_HEADERS;
- connp->in_tx->progress = TX_PROGRESS_REQ_TRAILER;
+ connp->in_tx->progress[0] = TX_PROGRESS_REQ_TRAILER;
} else {
// Invalid chunk length
htp_log(connp, HTP_LOG_MARK, HTP_LOG_ERROR, 0,
// Done
connp->in_state = htp_connp_REQ_IDLE;
- connp->in_tx->progress = TX_PROGRESS_WAIT;
+ connp->in_tx->progress[0] = TX_PROGRESS_WAIT;
return HTP_OK;
}
}
connp->in_state = htp_connp_REQ_BODY_CHUNKED_LENGTH;
- connp->in_tx->progress = TX_PROGRESS_REQ_BODY;
+ connp->in_tx->progress[0] = TX_PROGRESS_REQ_BODY;
} else
// Next check for the presence of the Content-Length header
if (cl != NULL && cl->value != NULL) {
if (connp->in_content_length != 0) {
connp->in_state = htp_connp_REQ_BODY_IDENTITY;
- connp->in_tx->progress = TX_PROGRESS_REQ_BODY;
+ connp->in_tx->progress[0] = TX_PROGRESS_REQ_BODY;
} else {
connp->in_state = htp_connp_REQ_IDLE;
- connp->in_tx->progress = TX_PROGRESS_WAIT;
+ connp->in_tx->progress[0] = TX_PROGRESS_WAIT;
}
}
} else {
// This request does not have a body, which
// means that we're done with it
connp->in_state = htp_connp_REQ_IDLE;
- connp->in_tx->progress = TX_PROGRESS_WAIT;
+ connp->in_tx->progress[0] = TX_PROGRESS_WAIT;
}
// Host resolution
}
// Move onto the next processing phase
- if (connp->in_tx->progress == TX_PROGRESS_REQ_HEADERS) {
+ if (connp->in_tx->progress[0] == TX_PROGRESS_REQ_HEADERS) {
// Determine if this request has a body
//connp->in_state = htp_connp_REQ_BODY_DETERMINE;
connp->in_state = htp_connp_REQ_CONNECT_CHECK;
// We've completed parsing this request
connp->in_state = htp_connp_REQ_IDLE;
- connp->in_tx->progress = TX_PROGRESS_WAIT;
+ connp->in_tx->progress[0] = TX_PROGRESS_WAIT;
}
return HTP_OK;
if (connp->in_tx->protocol_is_simple == 0) {
// Switch to request header parsing.
connp->in_state = htp_connp_REQ_HEADERS;
- connp->in_tx->progress = TX_PROGRESS_REQ_HEADERS;
+ connp->in_tx->progress[0] = TX_PROGRESS_REQ_HEADERS;
} else {
// We're done with this request.
connp->in_state = htp_connp_REQ_IDLE;
- connp->in_tx->progress = TX_PROGRESS_WAIT;
+ connp->in_tx->progress[0] = TX_PROGRESS_WAIT;
}
return HTP_OK;
// Change state into request line parsing
connp->in_state = htp_connp_REQ_LINE;
- connp->in_tx->progress = TX_PROGRESS_REQ_LINE;
+ connp->in_tx->progress[0] = TX_PROGRESS_REQ_LINE;
return HTP_OK;
}
#ifdef HTP_DEBUG
fprintf(stderr, "htp_connp_req_data: in state=%s, progress=%s\n",
htp_connp_in_state_as_string(connp),
- htp_tx_progress_as_string(connp->in_tx));
+ htp_tx_progress_as_string(connp->in_tx, 0));
#endif
// Return if there's been an error
} else if (connp->out_chunked_length == 0) {
// End of data
connp->out_state = htp_connp_RES_HEADERS;
- connp->out_tx->progress = TX_PROGRESS_RES_TRAILER;
+ connp->out_tx->progress[1] = TX_PROGRESS_RES_TRAILER;
} else {
// Invalid chunk length
htp_log(connp, HTP_LOG_MARK, HTP_LOG_ERROR, 0,
// end of the response body (and the end of the transaction).
if ((connp->out_content_length == -1) && (connp->out_status == STREAM_STATE_CLOSED)) {
connp->out_state = htp_connp_RES_IDLE;
- connp->out_tx->progress = TX_PROGRESS_DONE;
+ connp->out_tx->progress[1] = TX_PROGRESS_DONE;
return HTP_OK;
} else {
// Done
connp->out_state = htp_connp_RES_IDLE;
- connp->out_tx->progress = TX_PROGRESS_DONE;
+ connp->out_tx->progress[1] = TX_PROGRESS_DONE;
return HTP_OK;
}
{
connp->out_status = STREAM_STATE_TUNNEL;
connp->out_state = htp_connp_RES_IDLE;
- connp->out_tx->progress = TX_PROGRESS_DONE;
+ connp->out_tx->progress[1] = TX_PROGRESS_DONE;
return HTP_OK;
}
table_clear(connp->out_tx->response_headers);
connp->out_state = htp_connp_RES_LINE;
- connp->out_tx->progress = TX_PROGRESS_RES_LINE;
+ connp->out_tx->progress[1] = TX_PROGRESS_RES_LINE;
connp->out_tx->seen_100continue++;
return HTP_OK;
}
connp->out_state = htp_connp_RES_BODY_CHUNKED_LENGTH;
- connp->out_tx->progress = TX_PROGRESS_RES_BODY;
+ connp->out_tx->progress[1] = TX_PROGRESS_RES_BODY;
}// 3. If a Content-Length header field (section 14.14) is present, its
// value in bytes represents the length of the message-body.
else if (cl != NULL) {
if (connp->out_content_length != 0) {
connp->out_state = htp_connp_RES_BODY_IDENTITY;
- connp->out_tx->progress = TX_PROGRESS_RES_BODY;
+ connp->out_tx->progress[1] = TX_PROGRESS_RES_BODY;
} else {
connp->out_state = htp_connp_RES_IDLE;
- connp->out_tx->progress = TX_PROGRESS_DONE;
+ connp->out_tx->progress[1] = TX_PROGRESS_DONE;
}
}
} else {
// cannot be used to indicate the end of a request body, since that
// would leave no possibility for the server to send back a response.)
connp->out_state = htp_connp_RES_BODY_IDENTITY;
- connp->out_tx->progress = TX_PROGRESS_RES_BODY;
+ connp->out_tx->progress[1] = TX_PROGRESS_RES_BODY;
}
}
connp->out_header_line = NULL;
// We've seen all response headers
- if (connp->out_tx->progress == TX_PROGRESS_RES_HEADERS) {
+ if (connp->out_tx->progress[1] == TX_PROGRESS_RES_HEADERS) {
// Determine if this response has a body
connp->out_state = htp_connp_RES_BODY_DETERMINE;
} else {
// Move on to the next phase.
connp->out_state = htp_connp_RES_HEADERS;
- connp->out_tx->progress = TX_PROGRESS_RES_HEADERS;
+ connp->out_tx->progress[1] = TX_PROGRESS_RES_HEADERS;
return HTP_OK;
}
connp->out_decompressor = NULL;
}
- connp->out_tx->progress = TX_PROGRESS_DONE;
+ connp->out_tx->progress[1] = TX_PROGRESS_DONE;
// Run hook RESPONSE
int rc = hook_run_all(connp->cfg->hook_response, connp);
if (connp->out_tx->protocol_is_simple) {
connp->out_tx->response_transfer_coding = IDENTITY;
connp->out_state = htp_connp_RES_BODY_IDENTITY;
- connp->out_tx->progress = TX_PROGRESS_RES_BODY;
+ connp->out_tx->progress[1] = TX_PROGRESS_RES_BODY;
} else {
connp->out_state = htp_connp_RES_LINE;
- connp->out_tx->progress = TX_PROGRESS_RES_LINE;
+ connp->out_tx->progress[1] = TX_PROGRESS_RES_LINE;
}
return HTP_OK;
#ifdef HTP_DEBUG
fprintf(stderr, "htp_connp_res_data: out state=%s, progress=%s\n",
htp_connp_out_state_as_string(connp),
- htp_tx_progress_as_string(connp->out_tx));
+ htp_tx_progress_as_string(connp->out_tx, 1));
#endif
// Return if there's been an error
// or if we've run out of data. We are relying
/**
*
*/
-char *htp_tx_progress_as_string(htp_tx_t *tx) {
+char *htp_tx_progress_as_string(htp_tx_t *tx, int direction) {
if (tx == NULL) return "NULL";
- switch (tx->progress) {
+ switch ((direction == 0) ? tx->progress[0] : tx->progress[1]) {
case TX_PROGRESS_NEW:
return "NEW";
case TX_PROGRESS_REQ_LINE:
*/
bstr *htp_tx_get_request_headers_raw(htp_tx_t *tx) {
// Check that we are not called too early
- if (tx->progress < TX_PROGRESS_REQ_HEADERS) return NULL;
+ if (tx->progress[0] < TX_PROGRESS_REQ_HEADERS) return NULL;
if (tx->request_headers_raw == NULL) {
tx->request_headers_raw = htp_tx_generate_request_headers_raw(tx);
*/
bstr *htp_tx_get_response_headers_raw(htp_tx_t *tx) {
// Check that we are not called too early
- if (tx->progress < TX_PROGRESS_RES_HEADERS) return NULL;
+ if (tx->progress[1] < TX_PROGRESS_RES_HEADERS) return NULL;
if (tx->response_headers_raw == NULL) {
tx->response_headers_raw = htp_tx_generate_response_headers_raw(tx);