optimize HTTP method parsing for i386 and amd64
This commit is contained in:
parent
c95f9970c5
commit
b85f823e94
1 changed files with 80 additions and 30 deletions
|
@ -32,6 +32,71 @@ static uint32_t usual[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#if (NGX_HAVE_LITTLE_ENDIAN && NGX_HAVE_NONALIGNED)
|
||||||
|
|
||||||
|
#define ngx_str3_cmp(m, c0, c1, c2, c3) \
|
||||||
|
*(uint32_t *) m == ((c3 << 24) | (c2 << 16) | (c1 << 8) | c0)
|
||||||
|
|
||||||
|
#define ngx_str3Ocmp(m, c0, c1, c2, c3) \
|
||||||
|
*(uint32_t *) m == ((c3 << 24) | (c2 << 16) | (c1 << 8) | c0)
|
||||||
|
|
||||||
|
#define ngx_str4cmp(m, c0, c1, c2, c3) \
|
||||||
|
*(uint32_t *) m == ((c3 << 24) | (c2 << 16) | (c1 << 8) | c0)
|
||||||
|
|
||||||
|
#define ngx_str5cmp(m, c0, c1, c2, c3, c4) \
|
||||||
|
*(uint32_t *) m == ((c3 << 24) | (c2 << 16) | (c1 << 8) | c0) \
|
||||||
|
&& m[4] == c4
|
||||||
|
|
||||||
|
#define ngx_str6cmp(m, c0, c1, c2, c3, c4, c5) \
|
||||||
|
*(uint32_t *) m == ((c3 << 24) | (c2 << 16) | (c1 << 8) | c0) \
|
||||||
|
&& (((uint32_t *) m)[1] & 0xffff) == ((c5 << 8) | c4)
|
||||||
|
|
||||||
|
#define ngx_str7_cmp(m, c0, c1, c2, c3, c4, c5, c6, c7) \
|
||||||
|
*(uint32_t *) m == ((c3 << 24) | (c2 << 16) | (c1 << 8) | c0) \
|
||||||
|
&& ((uint32_t *) m)[1] == ((c7 << 24) | (c6 << 16) | (c5 << 8) | c4)
|
||||||
|
|
||||||
|
#define ngx_str8cmp(m, c0, c1, c2, c3, c4, c5, c6, c7) \
|
||||||
|
*(uint32_t *) m == ((c3 << 24) | (c2 << 16) | (c1 << 8) | c0) \
|
||||||
|
&& ((uint32_t *) m)[1] == ((c7 << 24) | (c6 << 16) | (c5 << 8) | c4)
|
||||||
|
|
||||||
|
#define ngx_str9cmp(m, c0, c1, c2, c3, c4, c5, c6, c7, c8) \
|
||||||
|
*(uint32_t *) m == ((c3 << 24) | (c2 << 16) | (c1 << 8) | c0) \
|
||||||
|
&& ((uint32_t *) m)[1] == ((c7 << 24) | (c6 << 16) | (c5 << 8) | c4) \
|
||||||
|
&& m[8] == c8
|
||||||
|
|
||||||
|
#else /* !(NGX_HAVE_LITTLE_ENDIAN && NGX_HAVE_NONALIGNED) */
|
||||||
|
|
||||||
|
#define ngx_str3_cmp(m, c0, c1, c2, c3) \
|
||||||
|
m[0] == c0 && m[1] == c1 && m[2] == c2
|
||||||
|
|
||||||
|
#define ngx_str3Ocmp(m, c0, c1, c2, c3) \
|
||||||
|
m[0] == c0 && m[2] == c2 && m[3] == c3
|
||||||
|
|
||||||
|
#define ngx_str4cmp(m, c0, c1, c2, c3) \
|
||||||
|
m[0] == c0 && m[1] == c1 && m[2] == c2 && m[3] == c3
|
||||||
|
|
||||||
|
#define ngx_str5cmp(m, c0, c1, c2, c3, c4) \
|
||||||
|
m[0] == c0 && m[1] == c1 && m[2] == c2 && m[3] == c3 && m[4] == c4
|
||||||
|
|
||||||
|
#define ngx_str6cmp(m, c0, c1, c2, c3, c4, c5) \
|
||||||
|
m[0] == c0 && m[1] == c1 && m[2] == c2 && m[3] == c3 \
|
||||||
|
&& m[4] == c4 && m[5] == c5
|
||||||
|
|
||||||
|
#define ngx_str7_cmp(m, c0, c1, c2, c3, c4, c5, c6, c7) \
|
||||||
|
m[0] == c0 && m[1] == c1 && m[2] == c2 && m[3] == c3 \
|
||||||
|
&& m[4] == c4 && m[5] == c5 && m[6] == c6
|
||||||
|
|
||||||
|
#define ngx_str8cmp(m, c0, c1, c2, c3, c4, c5, c6, c7) \
|
||||||
|
m[0] == c0 && m[1] == c1 && m[2] == c2 && m[3] == c3 \
|
||||||
|
&& m[4] == c4 && m[5] == c5 && m[6] == c6 && m[7] == c7
|
||||||
|
|
||||||
|
#define ngx_str9cmp(m, c0, c1, c2, c3, c4, c5, c6, c7, c8) \
|
||||||
|
m[0] == c0 && m[1] == c1 && m[2] == c2 && m[3] == c3 \
|
||||||
|
&& m[4] == c4 && m[5] == c5 && m[6] == c6 && m[7] == c7 && m[8] == c8
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* gcc, icc, msvc and others compile these switches as an jump table */
|
/* gcc, icc, msvc and others compile these switches as an jump table */
|
||||||
|
|
||||||
ngx_int_t
|
ngx_int_t
|
||||||
|
@ -92,12 +157,12 @@ ngx_http_parse_request_line(ngx_http_request_t *r, ngx_buf_t *b)
|
||||||
switch (p - m) {
|
switch (p - m) {
|
||||||
|
|
||||||
case 3:
|
case 3:
|
||||||
if (m[0] == 'G' && m[1] == 'E' && m[2] == 'T') {
|
if (ngx_str3_cmp(m, 'G', 'E', 'T', ' ')) {
|
||||||
r->method = NGX_HTTP_GET;
|
r->method = NGX_HTTP_GET;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m[0] == 'P' && m[1] == 'U' && m[2] == 'T') {
|
if (ngx_str3_cmp(m, 'P', 'U', 'T', ' ')) {
|
||||||
r->method = NGX_HTTP_PUT;
|
r->method = NGX_HTTP_PUT;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -107,31 +172,29 @@ ngx_http_parse_request_line(ngx_http_request_t *r, ngx_buf_t *b)
|
||||||
case 4:
|
case 4:
|
||||||
if (m[1] == 'O') {
|
if (m[1] == 'O') {
|
||||||
|
|
||||||
if (m[0] == 'P' && m[2] == 'S' && m[3] == 'T') {
|
if (ngx_str3Ocmp(m, 'P', 'O', 'S', 'T')) {
|
||||||
r->method = NGX_HTTP_POST;
|
r->method = NGX_HTTP_POST;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m[0] == 'C' && m[2] == 'P' && m[3] == 'Y') {
|
if (ngx_str3Ocmp(m, 'C', 'O', 'P', 'Y')) {
|
||||||
r->method = NGX_HTTP_COPY;
|
r->method = NGX_HTTP_COPY;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m[0] == 'M' && m[2] == 'V' && m[3] == 'E') {
|
if (ngx_str3Ocmp(m, 'M', 'O', 'V', 'E')) {
|
||||||
r->method = NGX_HTTP_MOVE;
|
r->method = NGX_HTTP_MOVE;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m[0] == 'L' && m[2] == 'C' && m[3] == 'K') {
|
if (ngx_str3Ocmp(m, 'L', 'O', 'C', 'K')) {
|
||||||
r->method = NGX_HTTP_LOCK;
|
r->method = NGX_HTTP_LOCK;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
if (m[0] == 'H' && m[1] == 'E'
|
if (ngx_str4cmp(m, 'H', 'E', 'A', 'D')) {
|
||||||
&& m[2] == 'A' && m[3] == 'D')
|
|
||||||
{
|
|
||||||
r->method = NGX_HTTP_HEAD;
|
r->method = NGX_HTTP_HEAD;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -140,31 +203,23 @@ ngx_http_parse_request_line(ngx_http_request_t *r, ngx_buf_t *b)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 5:
|
case 5:
|
||||||
if (m[0] == 'M' && m[1] == 'K'
|
if (ngx_str5cmp(m, 'M', 'K', 'C', 'O', 'L')) {
|
||||||
&& m[2] == 'C' && m[3] == 'O' && m[4] == 'L')
|
|
||||||
{
|
|
||||||
r->method = NGX_HTTP_MKCOL;
|
r->method = NGX_HTTP_MKCOL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m[0] == 'T' && m[1] == 'R'
|
if (ngx_str5cmp(m, 'T', 'R', 'A', 'C', 'E')) {
|
||||||
&& m[2] == 'A' && m[3] == 'C' && m[4] == 'E')
|
|
||||||
{
|
|
||||||
r->method = NGX_HTTP_TRACE;
|
r->method = NGX_HTTP_TRACE;
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 6:
|
case 6:
|
||||||
if (m[0] == 'D' && m[1] == 'E' && m[2] == 'L'
|
if (ngx_str6cmp(m, 'D', 'E', 'L', 'E', 'T', 'E')) {
|
||||||
&& m[3] == 'E' && m[4] == 'T' && m[5] == 'E')
|
|
||||||
{
|
|
||||||
r->method = NGX_HTTP_DELETE;
|
r->method = NGX_HTTP_DELETE;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m[0] == 'U' && m[1] == 'N' && m[2] == 'L'
|
if (ngx_str6cmp(m, 'U', 'N', 'L', 'O', 'C', 'K')) {
|
||||||
&& m[3] == 'O' && m[4] == 'C' && m[5] == 'K')
|
|
||||||
{
|
|
||||||
r->method = NGX_HTTP_UNLOCK;
|
r->method = NGX_HTTP_UNLOCK;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -172,9 +227,7 @@ ngx_http_parse_request_line(ngx_http_request_t *r, ngx_buf_t *b)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 7:
|
case 7:
|
||||||
if (m[0] == 'O' && m[1] == 'P'
|
if (ngx_str7_cmp(m, 'O', 'P', 'T', 'I', 'O', 'N', 'S', ' '))
|
||||||
&& m[2] == 'T' && m[3] == 'I'
|
|
||||||
&& m[4] == 'O' && m[5] == 'N' && m[6] == 'S')
|
|
||||||
{
|
{
|
||||||
r->method = NGX_HTTP_OPTIONS;
|
r->method = NGX_HTTP_OPTIONS;
|
||||||
}
|
}
|
||||||
|
@ -182,9 +235,7 @@ ngx_http_parse_request_line(ngx_http_request_t *r, ngx_buf_t *b)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 8:
|
case 8:
|
||||||
if (m[0] == 'P' && m[1] == 'R'
|
if (ngx_str8cmp(m, 'P', 'R', 'O', 'P', 'F', 'I', 'N', 'D'))
|
||||||
&& m[2] == 'O' && m[3] == 'P' && m[4] == 'F'
|
|
||||||
&& m[5] == 'I' && m[6] == 'N' && m[7] == 'D')
|
|
||||||
{
|
{
|
||||||
r->method = NGX_HTTP_PROPFIND;
|
r->method = NGX_HTTP_PROPFIND;
|
||||||
}
|
}
|
||||||
|
@ -192,9 +243,8 @@ ngx_http_parse_request_line(ngx_http_request_t *r, ngx_buf_t *b)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 9:
|
case 9:
|
||||||
if (m[0] == 'P' && m[1] == 'R' && m[2] == 'O'
|
if (ngx_str9cmp(m,
|
||||||
&& m[3] == 'P' && m[4] == 'P' && m[5] == 'A'
|
'P', 'R', 'O', 'P', 'P', 'A', 'T', 'C', 'H'))
|
||||||
&& m[6] == 'T' && m[7] == 'C' && m[8] == 'H')
|
|
||||||
{
|
{
|
||||||
r->method = NGX_HTTP_PROPPATCH;
|
r->method = NGX_HTTP_PROPPATCH;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue