#define _TYPES_H1_H
#include <common/http.h>
+#include <common/ist.h>
/* Legacy version of the HTTP/1 message state, used by the channels, should
* ultimately be removed.
/* basic H1 start line, describes either the request and the response */
union h1_sl { /* useful start line pointers, relative to ->sol */
struct {
- int m, m_l; /* METHOD, length */
- int u, u_l; /* URI, length */
- int v, v_l; /* VERSION, length */
+ struct ist m; /* METHOD */
+ struct ist u; /* URI */
+ struct ist v; /* VERSION */
enum http_meth_t meth; /* method */
} rq; /* request line : field, length */
struct {
- int v, v_l; /* VERSION, length */
- int c, c_l; /* CODE, length */
- int r, r_l; /* REASON, length */
+ struct ist v; /* VERSION */
+ struct ist c; /* CODE */
+ struct ist r; /* REASON */
uint16_t status; /* status code */
} st; /* status line : field, length */
};
start = ptr;
sol = 0;
- sl.rq.m = skip;
+ sl.rq.m.ptr = ptr;
hdr_count = 0;
state = H1_MSG_RQMETH;
goto http_msg_rqmeth;
EAT_AND_JUMP_OR_RETURN(ptr, end, http_msg_rqmeth, http_msg_ood, state, H1_MSG_RQMETH);
if (likely(HTTP_IS_SPHT(*ptr))) {
- sl.rq.m_l = ptr - start;
- sl.rq.meth = find_http_meth(start, sl.rq.m_l);
+ sl.rq.m.len = ptr - sl.rq.m.ptr;
+ sl.rq.meth = find_http_meth(start, sl.rq.m.len);
EAT_AND_JUMP_OR_RETURN(ptr, end, http_msg_rqmeth_sp, http_msg_ood, state, H1_MSG_RQMETH_SP);
}
if (likely(HTTP_IS_CRLF(*ptr))) {
/* HTTP 0.9 request */
- sl.rq.m_l = ptr - start;
- sl.rq.meth = find_http_meth(start, sl.rq.m_l);
+ sl.rq.m.len = ptr - sl.rq.m.ptr;
+ sl.rq.meth = find_http_meth(sl.rq.m.ptr, sl.rq.m.len);
http_msg_req09_uri:
- sl.rq.u = ptr - start + skip;
+ sl.rq.u.ptr = ptr;
http_msg_req09_uri_e:
- sl.rq.u_l = ptr - start + skip - sl.rq.u;
+ sl.rq.u.len = ptr - sl.rq.u.ptr;
http_msg_req09_ver:
- sl.rq.v = ptr - start + skip;
- sl.rq.v_l = 0;
+ sl.rq.v.ptr = ptr;
+ sl.rq.v.len = 0;
goto http_msg_rqline_eol;
}
state = H1_MSG_RQMETH;
case H1_MSG_RQMETH_SP:
http_msg_rqmeth_sp:
if (likely(!HTTP_IS_LWS(*ptr))) {
- sl.rq.u = ptr - start + skip;
+ sl.rq.u.ptr = ptr;
goto http_msg_rquri;
}
if (likely(HTTP_IS_SPHT(*ptr)))
EAT_AND_JUMP_OR_RETURN(ptr, end, http_msg_rquri2, http_msg_ood, state, H1_MSG_RQURI);
if (likely(HTTP_IS_SPHT(*ptr))) {
- sl.rq.u_l = ptr - start + skip - sl.rq.u;
+ sl.rq.u.len = ptr - sl.rq.u.ptr;
EAT_AND_JUMP_OR_RETURN(ptr, end, http_msg_rquri_sp, http_msg_ood, state, H1_MSG_RQURI_SP);
}
if (likely((unsigned char)*ptr >= 128)) {
case H1_MSG_RQURI_SP:
http_msg_rquri_sp:
if (likely(!HTTP_IS_LWS(*ptr))) {
- sl.rq.v = ptr - start + skip;
+ sl.rq.v.ptr = ptr;
goto http_msg_rqver;
}
if (likely(HTTP_IS_SPHT(*ptr)))
EAT_AND_JUMP_OR_RETURN(ptr, end, http_msg_rqver, http_msg_ood, state, H1_MSG_RQVER);
if (likely(HTTP_IS_CRLF(*ptr))) {
- sl.rq.v_l = ptr - start + skip - sl.rq.v;
+ sl.rq.v.len = ptr - sl.rq.v.ptr;
http_msg_rqline_eol:
/* We have seen the end of line. Note that we do not
* necessarily have the \n yet, but at least we know that we
*/
if (likely(!skip_update)) {
- if ((sl.rq.v_l == 8) &&
- ((start[sl.rq.v + 5] > '1') ||
- ((start[sl.rq.v + 5] == '1') && (start[sl.rq.v + 7] >= '1'))))
+ if ((sl.rq.v.len == 8) &&
+ (*(sl.rq.v.ptr + 5) > '1' ||
+ (*(sl.rq.v.ptr + 5) == '1' && *(sl.rq.v.ptr + 7) >= '1')))
h1m->flags |= H1_MF_VER_11;
if (unlikely(hdr_count >= hdr_num)) {
state = H1_MSG_RQVER;
goto http_output_full;
}
- http_set_hdr(&hdr[hdr_count++], ist(":method"), ist2(start + sl.rq.m, sl.rq.m_l));
+ http_set_hdr(&hdr[hdr_count++], ist(":method"), sl.rq.m);
if (unlikely(hdr_count >= hdr_num)) {
state = H1_MSG_RQVER;
goto http_output_full;
}
- http_set_hdr(&hdr[hdr_count++], ist(":path"), ist2(start + sl.rq.u, sl.rq.u_l));
+ http_set_hdr(&hdr[hdr_count++], ist(":path"), sl.rq.u);
}
sol = ptr - start;
if (restarting)
goto restart;
- if (unlikely(sl.rq.v_l == 0))
+ if (unlikely(sl.rq.v.len == 0))
goto http_msg_last_lf;
EXPECT_LF_HERE(ptr, http_msg_invalid, state, H1_MSG_RQLINE_END);
start = ptr;
sol = 0;
- sl.st.v = skip;
+ sl.st.v.ptr = ptr;
hdr_count = 0;
state = H1_MSG_RPVER;
goto http_msg_rpver;
EAT_AND_JUMP_OR_RETURN(ptr, end, http_msg_rpver, http_msg_ood, state, H1_MSG_RPVER);
if (likely(HTTP_IS_SPHT(*ptr))) {
- sl.st.v_l = ptr - start;
+ sl.st.v.len = ptr - sl.st.v.ptr;
- if ((sl.st.v_l == 8) &&
- ((start[sl.st.v + 5] > '1') ||
- ((start[sl.st.v + 5] == '1') && (start[sl.st.v + 7] >= '1'))))
+ if ((sl.st.v.len == 8) &&
+ (*(sl.st.v.ptr + 5) > '1' ||
+ (*(sl.st.v.ptr + 5) == '1' && *(sl.st.v.ptr + 7) >= '1')))
h1m->flags |= H1_MF_VER_11;
EAT_AND_JUMP_OR_RETURN(ptr, end, http_msg_rpver_sp, http_msg_ood, state, H1_MSG_RPVER_SP);
http_msg_rpver_sp:
if (likely(!HTTP_IS_LWS(*ptr))) {
sl.st.status = 0;
- sl.st.c = ptr - start + skip;
+ sl.st.c.ptr = ptr;
goto http_msg_rpcode;
}
if (likely(HTTP_IS_SPHT(*ptr)))
}
if (likely(HTTP_IS_SPHT(*ptr))) {
- sl.st.c_l = ptr - start + skip - sl.st.c;
+ sl.st.c.len = ptr - sl.st.c.ptr;
EAT_AND_JUMP_OR_RETURN(ptr, end, http_msg_rpcode_sp, http_msg_ood, state, H1_MSG_RPCODE_SP);
}
/* so it's a CR/LF, so there is no reason phrase */
- sl.st.c_l = ptr - start + skip - sl.st.c;
+ sl.st.c.len = ptr - sl.st.c.ptr;
http_msg_rsp_reason:
- sl.st.r = ptr - start + skip;
- sl.st.r_l = 0;
+ sl.st.r.ptr = ptr;
+ sl.st.r.len = 0;
goto http_msg_rpline_eol;
case H1_MSG_RPCODE_SP:
http_msg_rpcode_sp:
if (likely(!HTTP_IS_LWS(*ptr))) {
- sl.st.r = ptr - start + skip;
+ sl.st.r.ptr = ptr;
goto http_msg_rpreason;
}
if (likely(HTTP_IS_SPHT(*ptr)))
http_msg_rpreason:
if (likely(!HTTP_IS_CRLF(*ptr)))
EAT_AND_JUMP_OR_RETURN(ptr, end, http_msg_rpreason, http_msg_ood, state, H1_MSG_RPREASON);
- sl.st.r_l = ptr - start + skip - sl.st.r;
+ sl.st.r.len = ptr - sl.st.r.ptr;
http_msg_rpline_eol:
/* We have seen the end of line. Note that we do not
* necessarily have the \n yet, but at least we know that we
state = H1_MSG_RPREASON;
goto http_output_full;
}
- http_set_hdr(&hdr[hdr_count++], ist(":status"), ist2(start + sl.st.c, sl.st.c_l));
+ http_set_hdr(&hdr[hdr_count++], ist(":status"), sl.st.c);
}
sol = ptr - start;