MEDIUM: http: get rid of msg->som which is not used anymore
msg->som was zero before the body and was used to carry the beginning of a chunk size for chunked-encoded messages, at a moment when msg->sol is always zero. Remove msg->som and replace it with msg->sol where needed.
This commit is contained in:
parent
06a000f56e
commit
2692736aa3
|
@ -283,11 +283,6 @@ enum {
|
||||||
* The values there are a little bit obscure, because their meaning can change
|
* The values there are a little bit obscure, because their meaning can change
|
||||||
* during the parsing :
|
* during the parsing :
|
||||||
*
|
*
|
||||||
* - som (Start of Message) : relative offset in the buffer of first byte of
|
|
||||||
* the request being processed or parsed. Reset to
|
|
||||||
* zero during accept(), and changes while parsing
|
|
||||||
* chunks (considered as messages). Relative to
|
|
||||||
* buffer origin (->p), may cause wrapping.
|
|
||||||
* - eoh (End of Headers) : relative offset in the buffer of first byte that
|
* - eoh (End of Headers) : relative offset in the buffer of first byte that
|
||||||
* is not part of a completely processed header.
|
* is not part of a completely processed header.
|
||||||
* During parsing, it points to last header seen
|
* During parsing, it points to last header seen
|
||||||
|
@ -313,18 +308,17 @@ struct http_msg {
|
||||||
unsigned int eoh; /* End Of Headers, relative to buffer */
|
unsigned int eoh; /* End Of Headers, relative to buffer */
|
||||||
unsigned int sol; /* start of current line during parsing otherwise zero */
|
unsigned int sol; /* start of current line during parsing otherwise zero */
|
||||||
unsigned int eol; /* end of line */
|
unsigned int eol; /* end of line */
|
||||||
unsigned int som; /* Start Of Message, relative to buffer's origin */
|
|
||||||
int err_pos; /* err handling: -2=block, -1=pass, 0+=detected */
|
int err_pos; /* err handling: -2=block, -1=pass, 0+=detected */
|
||||||
union { /* useful start line pointers, relative to ->sol */
|
union { /* useful start line pointers, relative to ->sol */
|
||||||
struct {
|
struct {
|
||||||
int l; /* request line length (not including CR) */
|
int l; /* request line length (not including CR) */
|
||||||
int m_l; /* METHOD length (method starts at ->som) */
|
int m_l; /* METHOD length (method starts at buf->p) */
|
||||||
int u, u_l; /* URI, length */
|
int u, u_l; /* URI, length */
|
||||||
int v, v_l; /* VERSION, length */
|
int v, v_l; /* VERSION, length */
|
||||||
} rq; /* request line : field, length */
|
} rq; /* request line : field, length */
|
||||||
struct {
|
struct {
|
||||||
int l; /* status line length (not including CR) */
|
int l; /* status line length (not including CR) */
|
||||||
int v_l; /* VERSION length (version starts at ->som) */
|
int v_l; /* VERSION length (version starts at buf->p) */
|
||||||
int c, c_l; /* CODE, length */
|
int c, c_l; /* CODE, length */
|
||||||
int r, r_l; /* REASON, length */
|
int r, r_l; /* REASON, length */
|
||||||
} st; /* status line : field, length */
|
} st; /* status line : field, length */
|
||||||
|
|
|
@ -1273,9 +1273,9 @@ get_http_auth(struct session *s)
|
||||||
* with no information loss. The message may even be realigned between two
|
* with no information loss. The message may even be realigned between two
|
||||||
* calls. The header index is re-initialized when switching from
|
* calls. The header index is re-initialized when switching from
|
||||||
* MSG_R[PQ]BEFORE to MSG_RPVER|MSG_RQMETH. It modifies msg->sol among other
|
* MSG_R[PQ]BEFORE to MSG_RPVER|MSG_RQMETH. It modifies msg->sol among other
|
||||||
* fields. Note that msg->som and msg->sol will be initialized after completing
|
* fields. Note that msg->sol will be initialized after completing the first
|
||||||
* the first state, so that none of the msg pointers has to be initialized
|
* state, so that none of the msg pointers has to be initialized prior to the
|
||||||
* prior to the first call.
|
* first call.
|
||||||
*/
|
*/
|
||||||
void http_msg_analyzer(struct http_msg *msg, struct hdr_idx *idx)
|
void http_msg_analyzer(struct http_msg *msg, struct hdr_idx *idx)
|
||||||
{
|
{
|
||||||
|
@ -1309,7 +1309,7 @@ void http_msg_analyzer(struct http_msg *msg, struct hdr_idx *idx)
|
||||||
/* Remove empty leading lines, as recommended by RFC2616. */
|
/* Remove empty leading lines, as recommended by RFC2616. */
|
||||||
bi_fast_delete(buf, ptr - buf->p);
|
bi_fast_delete(buf, ptr - buf->p);
|
||||||
}
|
}
|
||||||
msg->sol = msg->som = 0;
|
msg->sol = 0;
|
||||||
hdr_idx_init(idx);
|
hdr_idx_init(idx);
|
||||||
state = HTTP_MSG_RPVER;
|
state = HTTP_MSG_RPVER;
|
||||||
goto http_msg_rpver;
|
goto http_msg_rpver;
|
||||||
|
@ -1374,7 +1374,7 @@ void http_msg_analyzer(struct http_msg *msg, struct hdr_idx *idx)
|
||||||
/* Remove empty leading lines, as recommended by RFC2616. */
|
/* Remove empty leading lines, as recommended by RFC2616. */
|
||||||
bi_fast_delete(buf, ptr - buf->p);
|
bi_fast_delete(buf, ptr - buf->p);
|
||||||
}
|
}
|
||||||
msg->sol = msg->som = 0;
|
msg->sol = 0;
|
||||||
/* we will need this when keep-alive will be supported
|
/* we will need this when keep-alive will be supported
|
||||||
hdr_idx_init(idx);
|
hdr_idx_init(idx);
|
||||||
*/
|
*/
|
||||||
|
@ -1732,9 +1732,7 @@ void http_change_connection_header(struct http_txn *txn, struct http_msg *msg, i
|
||||||
|
|
||||||
/* Parse the chunk size at msg->next. Once done, it adjusts ->next to point to the
|
/* Parse the chunk size at msg->next. Once done, it adjusts ->next to point to the
|
||||||
* first byte of body, and increments msg->sov by the number of bytes parsed,
|
* first byte of body, and increments msg->sov by the number of bytes parsed,
|
||||||
* so that we know we can forward between ->som and ->sov. Note that due to
|
* so that we know we can forward between ->sol and ->sov.
|
||||||
* possible wrapping at the end of the buffer, it is possible that msg->sov is
|
|
||||||
* lower than msg->som.
|
|
||||||
* Return >0 on success, 0 when some data is missing, <0 on error.
|
* Return >0 on success, 0 when some data is missing, <0 on error.
|
||||||
* Note: this function is designed to parse wrapped CRLF at the end of the buffer.
|
* Note: this function is designed to parse wrapped CRLF at the end of the buffer.
|
||||||
*/
|
*/
|
||||||
|
@ -1841,7 +1839,7 @@ int http_parse_chunk_size(struct http_msg *msg)
|
||||||
* change anything except maybe msg->next and msg->sov. Note that the message
|
* change anything except maybe msg->next and msg->sov. Note that the message
|
||||||
* must already be in HTTP_MSG_TRAILERS state before calling this function,
|
* must already be in HTTP_MSG_TRAILERS state before calling this function,
|
||||||
* which implies that all non-trailers data have already been scheduled for
|
* which implies that all non-trailers data have already been scheduled for
|
||||||
* forwarding, and that the difference between msg->som and msg->sov exactly
|
* forwarding, and that the difference between msg->sol and msg->sov exactly
|
||||||
* matches the length of trailers already parsed and not forwarded. It is also
|
* matches the length of trailers already parsed and not forwarded. It is also
|
||||||
* important to note that this function is designed to be able to parse wrapped
|
* important to note that this function is designed to be able to parse wrapped
|
||||||
* headers at end of buffer.
|
* headers at end of buffer.
|
||||||
|
@ -1912,7 +1910,7 @@ int http_forward_trailers(struct http_msg *msg)
|
||||||
|
|
||||||
/* This function may be called only in HTTP_MSG_DATA_CRLF. It reads the CRLF or
|
/* This function may be called only in HTTP_MSG_DATA_CRLF. It reads the CRLF or
|
||||||
* a possible LF alone at the end of a chunk. It automatically adjusts msg->sov,
|
* a possible LF alone at the end of a chunk. It automatically adjusts msg->sov,
|
||||||
* ->som, ->next in order to include this part into the next forwarding phase.
|
* ->sol, ->next in order to include this part into the next forwarding phase.
|
||||||
* Note that the caller must ensure that ->p points to the first byte to parse.
|
* Note that the caller must ensure that ->p points to the first byte to parse.
|
||||||
* It also sets msg_state to HTTP_MSG_CHUNK_SIZE and returns >0 on success. If
|
* It also sets msg_state to HTTP_MSG_CHUNK_SIZE and returns >0 on success. If
|
||||||
* not enough data are available, the function does not change anything and
|
* not enough data are available, the function does not change anything and
|
||||||
|
@ -1950,8 +1948,8 @@ int http_skip_chunk_crlf(struct http_msg *msg)
|
||||||
ptr++;
|
ptr++;
|
||||||
if (ptr >= buf->data + buf->size)
|
if (ptr >= buf->data + buf->size)
|
||||||
ptr = buf->data;
|
ptr = buf->data;
|
||||||
/* prepare the CRLF to be forwarded (between ->som and ->sov) */
|
/* prepare the CRLF to be forwarded (between ->sol and ->sov) */
|
||||||
msg->som = 0;
|
msg->sol = 0;
|
||||||
msg->sov = msg->next = bytes;
|
msg->sov = msg->next = bytes;
|
||||||
msg->msg_state = HTTP_MSG_CHUNK_SIZE;
|
msg->msg_state = HTTP_MSG_CHUNK_SIZE;
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -1975,11 +1973,11 @@ int http_wait_for_request(struct session *s, struct buffer *req, int an_bit)
|
||||||
* For the parsing, we use a 28 states FSM.
|
* For the parsing, we use a 28 states FSM.
|
||||||
*
|
*
|
||||||
* Here is the information we currently have :
|
* Here is the information we currently have :
|
||||||
* req->p + msg->som = beginning of request
|
* req->p = beginning of request
|
||||||
* req->p + msg->eoh = end of processed headers / start of current one
|
* req->p + msg->eoh = end of processed headers / start of current one
|
||||||
* msg->eol = end of current header or line (LF or CRLF)
|
* req->p + req->i = end of input data
|
||||||
* msg->next = first non-visited byte
|
* msg->eol = end of current header or line (LF or CRLF)
|
||||||
* req->r = end of data
|
* msg->next = first non-visited byte
|
||||||
*
|
*
|
||||||
* At end of parsing, we may perform a capture of the error (if any), and
|
* At end of parsing, we may perform a capture of the error (if any), and
|
||||||
* we will set a few fields (msg->sol, txn->meth, sn->flags/SN_REDIRECTABLE).
|
* we will set a few fields (msg->sol, txn->meth, sn->flags/SN_REDIRECTABLE).
|
||||||
|
@ -2060,7 +2058,7 @@ int http_wait_for_request(struct session *s, struct buffer *req, int an_bit)
|
||||||
(msg->msg_state >= HTTP_MSG_BODY || msg->msg_state == HTTP_MSG_ERROR))) {
|
(msg->msg_state >= HTTP_MSG_BODY || msg->msg_state == HTTP_MSG_ERROR))) {
|
||||||
char *eol, *sol;
|
char *eol, *sol;
|
||||||
|
|
||||||
sol = req->p + msg->som;
|
sol = req->p;
|
||||||
eol = sol + msg->sl.rq.l;
|
eol = sol + msg->sl.rq.l;
|
||||||
debug_hdr("clireq", s, sol, eol);
|
debug_hdr("clireq", s, sol, eol);
|
||||||
|
|
||||||
|
@ -2340,7 +2338,7 @@ int http_wait_for_request(struct session *s, struct buffer *req, int an_bit)
|
||||||
|
|
||||||
if (urilen >= REQURI_LEN)
|
if (urilen >= REQURI_LEN)
|
||||||
urilen = REQURI_LEN - 1;
|
urilen = REQURI_LEN - 1;
|
||||||
memcpy(txn->uri, &req->p[msg->som], urilen);
|
memcpy(txn->uri, req->p, urilen);
|
||||||
txn->uri[urilen] = 0;
|
txn->uri[urilen] = 0;
|
||||||
|
|
||||||
if (!(s->logs.logwait &= ~LW_REQ))
|
if (!(s->logs.logwait &= ~LW_REQ))
|
||||||
|
@ -3110,8 +3108,8 @@ int http_process_req_common(struct session *s, struct buffer *req, int an_bit, s
|
||||||
rdr.len += 4;
|
rdr.len += 4;
|
||||||
bo_inject(req->prod->ob, rdr.str, rdr.len);
|
bo_inject(req->prod->ob, rdr.str, rdr.len);
|
||||||
/* "eat" the request */
|
/* "eat" the request */
|
||||||
bi_fast_delete(req, msg->sov - msg->som);
|
bi_fast_delete(req, msg->sov);
|
||||||
msg->som = msg->sov;
|
msg->sov = 0;
|
||||||
req->analysers = AN_REQ_HTTP_XFER_BODY;
|
req->analysers = AN_REQ_HTTP_XFER_BODY;
|
||||||
s->rep->analysers = AN_RES_HTTP_XFER_BODY;
|
s->rep->analysers = AN_RES_HTTP_XFER_BODY;
|
||||||
txn->req.msg_state = HTTP_MSG_CLOSED;
|
txn->req.msg_state = HTTP_MSG_CLOSED;
|
||||||
|
@ -3535,8 +3533,9 @@ int http_process_request_body(struct session *s, struct buffer *req, int an_bit)
|
||||||
|
|
||||||
if (msg->msg_state < HTTP_MSG_CHUNK_SIZE) {
|
if (msg->msg_state < HTTP_MSG_CHUNK_SIZE) {
|
||||||
/* we have msg->sov which points to the first byte of message body.
|
/* we have msg->sov which points to the first byte of message body.
|
||||||
* msg->som still points to the beginning of the message. We must
|
* req->p still points to the beginning of the message and msg->sol
|
||||||
* save the body in msg->next because it survives buffer re-alignments.
|
* is still null. We must save the body in msg->next because it
|
||||||
|
* survives buffer re-alignments.
|
||||||
*/
|
*/
|
||||||
msg->next = msg->sov;
|
msg->next = msg->sov;
|
||||||
|
|
||||||
|
@ -3569,7 +3568,7 @@ int http_process_request_body(struct session *s, struct buffer *req, int an_bit)
|
||||||
if (msg->body_len < limit)
|
if (msg->body_len < limit)
|
||||||
limit = msg->body_len;
|
limit = msg->body_len;
|
||||||
|
|
||||||
if (req->i - (msg->sov - msg->som) >= limit) /* we have enough bytes now */
|
if (req->i - msg->sov >= limit) /* we have enough bytes now */
|
||||||
goto http_end;
|
goto http_end;
|
||||||
|
|
||||||
missing_data:
|
missing_data:
|
||||||
|
@ -4136,8 +4135,8 @@ int http_resync_states(struct session *s)
|
||||||
* be between MSG_BODY and MSG_DONE (inclusive). It returns zero if it needs to
|
* be between MSG_BODY and MSG_DONE (inclusive). It returns zero if it needs to
|
||||||
* read more data, or 1 once we can go on with next request or end the session.
|
* read more data, or 1 once we can go on with next request or end the session.
|
||||||
* When in MSG_DATA or MSG_TRAILERS, it will automatically forward chunk_len
|
* When in MSG_DATA or MSG_TRAILERS, it will automatically forward chunk_len
|
||||||
* bytes of pending data + the headers if not already done (between som and sov).
|
* bytes of pending data + the headers if not already done (between sol and sov).
|
||||||
* It eventually adjusts som to match sov after the data in between have been sent.
|
* It eventually adjusts sol to match sov after the data in between have been sent.
|
||||||
*/
|
*/
|
||||||
int http_request_forward_body(struct session *s, struct buffer *req, int an_bit)
|
int http_request_forward_body(struct session *s, struct buffer *req, int an_bit)
|
||||||
{
|
{
|
||||||
|
@ -4168,8 +4167,9 @@ int http_request_forward_body(struct session *s, struct buffer *req, int an_bit)
|
||||||
|
|
||||||
if (msg->msg_state < HTTP_MSG_CHUNK_SIZE) {
|
if (msg->msg_state < HTTP_MSG_CHUNK_SIZE) {
|
||||||
/* we have msg->sov which points to the first byte of message body.
|
/* we have msg->sov which points to the first byte of message body.
|
||||||
* msg->som still points to the beginning of the message. We must
|
* req->p still points to the beginning of the message and msg->sol
|
||||||
* save the body in msg->next because it survives buffer re-alignments.
|
* is still null. We must save the body in msg->next because it
|
||||||
|
* survives buffer re-alignments.
|
||||||
*/
|
*/
|
||||||
msg->next = msg->sov;
|
msg->next = msg->sov;
|
||||||
|
|
||||||
|
@ -4185,9 +4185,9 @@ int http_request_forward_body(struct session *s, struct buffer *req, int an_bit)
|
||||||
|
|
||||||
http_silent_debug(__LINE__, s);
|
http_silent_debug(__LINE__, s);
|
||||||
/* we may have some data pending */
|
/* we may have some data pending */
|
||||||
bytes = msg->sov - msg->som;
|
bytes = msg->sov - msg->sol;
|
||||||
if (msg->chunk_len || bytes) {
|
if (msg->chunk_len || bytes) {
|
||||||
msg->som = msg->sov;
|
msg->sol = msg->sov;
|
||||||
if (likely(bytes < 0)) /* sov may have wrapped at the end */
|
if (likely(bytes < 0)) /* sov may have wrapped at the end */
|
||||||
bytes += req->size;
|
bytes += req->size;
|
||||||
msg->next -= bytes; /* will be forwarded */
|
msg->next -= bytes; /* will be forwarded */
|
||||||
|
@ -4433,11 +4433,11 @@ int http_wait_for_response(struct session *s, struct buffer *rep, int an_bit)
|
||||||
* For the parsing, we use a 28 states FSM.
|
* For the parsing, we use a 28 states FSM.
|
||||||
*
|
*
|
||||||
* Here is the information we currently have :
|
* Here is the information we currently have :
|
||||||
* rep->data + msg->som = beginning of response
|
* rep->p = beginning of response
|
||||||
* rep->data + msg->eoh = end of processed headers / start of current one
|
* rep->p + msg->eoh = end of processed headers / start of current one
|
||||||
* msg->eol = end of current header or line (LF or CRLF)
|
* rep->p + rep->i = end of input data
|
||||||
* msg->next = first non-visited byte
|
* msg->eol = end of current header or line (LF or CRLF)
|
||||||
* rep->r = end of data
|
* msg->next = first non-visited byte
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* There's a protected area at the end of the buffer for rewriting
|
/* There's a protected area at the end of the buffer for rewriting
|
||||||
|
@ -4471,7 +4471,7 @@ int http_wait_for_response(struct session *s, struct buffer *rep, int an_bit)
|
||||||
(msg->msg_state >= HTTP_MSG_BODY || msg->msg_state == HTTP_MSG_ERROR))) {
|
(msg->msg_state >= HTTP_MSG_BODY || msg->msg_state == HTTP_MSG_ERROR))) {
|
||||||
char *eol, *sol;
|
char *eol, *sol;
|
||||||
|
|
||||||
sol = rep->p + msg->som;
|
sol = rep->p;
|
||||||
eol = sol + msg->sl.st.l;
|
eol = sol + msg->sl.st.l;
|
||||||
debug_hdr("srvrep", s, sol, eol);
|
debug_hdr("srvrep", s, sol, eol);
|
||||||
|
|
||||||
|
@ -5198,8 +5198,8 @@ int http_process_res_common(struct session *t, struct buffer *rep, int an_bit, s
|
||||||
* be between MSG_BODY and MSG_DONE (inclusive). It returns zero if it needs to
|
* be between MSG_BODY and MSG_DONE (inclusive). It returns zero if it needs to
|
||||||
* read more data, or 1 once we can go on with next request or end the session.
|
* read more data, or 1 once we can go on with next request or end the session.
|
||||||
* When in MSG_DATA or MSG_TRAILERS, it will automatically forward chunk_len
|
* When in MSG_DATA or MSG_TRAILERS, it will automatically forward chunk_len
|
||||||
* bytes of pending data + the headers if not already done (between som and sov).
|
* bytes of pending data + the headers if not already done (between sol and sov).
|
||||||
* It eventually adjusts som to match sov after the data in between have been sent.
|
* It eventually adjusts sol to match sov after the data in between have been sent.
|
||||||
*/
|
*/
|
||||||
int http_response_forward_body(struct session *s, struct buffer *res, int an_bit)
|
int http_response_forward_body(struct session *s, struct buffer *res, int an_bit)
|
||||||
{
|
{
|
||||||
|
@ -5226,8 +5226,9 @@ int http_response_forward_body(struct session *s, struct buffer *res, int an_bit
|
||||||
|
|
||||||
if (msg->msg_state < HTTP_MSG_CHUNK_SIZE) {
|
if (msg->msg_state < HTTP_MSG_CHUNK_SIZE) {
|
||||||
/* we have msg->sov which points to the first byte of message body.
|
/* we have msg->sov which points to the first byte of message body.
|
||||||
* msg->som still points to the beginning of the message. We must
|
* rep->p still points to the beginning of the message and msg->sol
|
||||||
* save the body in msg->next because it survives buffer re-alignments.
|
* is still null. We must save the body in msg->next because it
|
||||||
|
* survives buffer re-alignments.
|
||||||
*/
|
*/
|
||||||
msg->next = msg->sov;
|
msg->next = msg->sov;
|
||||||
|
|
||||||
|
@ -5243,9 +5244,9 @@ int http_response_forward_body(struct session *s, struct buffer *res, int an_bit
|
||||||
|
|
||||||
http_silent_debug(__LINE__, s);
|
http_silent_debug(__LINE__, s);
|
||||||
/* we may have some data pending */
|
/* we may have some data pending */
|
||||||
bytes = msg->sov - msg->som;
|
bytes = msg->sov - msg->sol;
|
||||||
if (msg->chunk_len || bytes) {
|
if (msg->chunk_len || bytes) {
|
||||||
msg->som = msg->sov;
|
msg->sol = msg->sov;
|
||||||
if (likely(bytes < 0)) /* sov may have wrapped at the end */
|
if (likely(bytes < 0)) /* sov may have wrapped at the end */
|
||||||
bytes += res->size;
|
bytes += res->size;
|
||||||
msg->next -= bytes; /* will be forwarded */
|
msg->next -= bytes; /* will be forwarded */
|
||||||
|
@ -5356,9 +5357,9 @@ int http_response_forward_body(struct session *s, struct buffer *res, int an_bit
|
||||||
goto return_bad_res;
|
goto return_bad_res;
|
||||||
|
|
||||||
/* forward any pending data */
|
/* forward any pending data */
|
||||||
bytes = msg->sov - msg->som;
|
bytes = msg->sov - msg->sol;
|
||||||
if (msg->chunk_len || bytes) {
|
if (msg->chunk_len || bytes) {
|
||||||
msg->som = msg->sov;
|
msg->sol = msg->sov;
|
||||||
if (likely(bytes < 0)) /* sov may have wrapped at the end */
|
if (likely(bytes < 0)) /* sov may have wrapped at the end */
|
||||||
bytes += res->size;
|
bytes += res->size;
|
||||||
msg->next -= bytes; /* will be forwarded */
|
msg->next -= bytes; /* will be forwarded */
|
||||||
|
@ -7327,10 +7328,10 @@ void http_init_txn(struct session *s)
|
||||||
txn->cookie_last_date = 0;
|
txn->cookie_last_date = 0;
|
||||||
|
|
||||||
txn->req.flags = 0;
|
txn->req.flags = 0;
|
||||||
txn->req.sol = txn->req.eol = txn->req.som = txn->req.eoh = 0; /* relative to the buffer */
|
txn->req.sol = txn->req.eol = txn->req.eoh = 0; /* relative to the buffer */
|
||||||
txn->req.next = 0;
|
txn->req.next = 0;
|
||||||
txn->rsp.flags = 0;
|
txn->rsp.flags = 0;
|
||||||
txn->rsp.sol = txn->rsp.eol = txn->rsp.som = txn->rsp.eoh = 0; /* relative to the buffer */
|
txn->rsp.sol = txn->rsp.eol = txn->rsp.eoh = 0; /* relative to the buffer */
|
||||||
txn->rsp.next = 0;
|
txn->rsp.next = 0;
|
||||||
txn->req.chunk_len = 0LL;
|
txn->req.chunk_len = 0LL;
|
||||||
txn->req.body_len = 0LL;
|
txn->req.body_len = 0LL;
|
||||||
|
|
Loading…
Reference in New Issue