⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ngx_http_parse.c

📁 Nginx是一个高性能的HTTP和反向代理服务器
💻 C
📖 第 1 页 / 共 3 页
字号:
            case '#':                r->complex_uri = 1;                state = sw_uri;                break;            case '+':                r->plus_in_uri = 1;                break;            case '\0':                r->zero_in_uri = 1;                break;            }            break;        /* URI */        case sw_uri:            if (usual[ch >> 5] & (1 << (ch & 0x1f))) {                break;            }            switch (ch) {            case ' ':                r->uri_end = p;                state = sw_http_09;                break;            case CR:                r->uri_end = p;                r->http_minor = 9;                state = sw_almost_done;                break;            case LF:                r->uri_end = p;                r->http_minor = 9;                goto done;            case '#':                r->complex_uri = 1;                break;            case '\0':                r->zero_in_uri = 1;                break;            }            break;        /* space+ after URI */        case sw_http_09:            switch (ch) {            case ' ':                break;            case CR:                r->http_minor = 9;                state = sw_almost_done;                break;            case LF:                r->http_minor = 9;                goto done;            case 'H':                r->http_protocol.data = p;                state = sw_http_H;                break;            default:                return NGX_HTTP_PARSE_INVALID_REQUEST;            }            break;        case sw_http_H:            switch (ch) {            case 'T':                state = sw_http_HT;                break;            default:                return NGX_HTTP_PARSE_INVALID_REQUEST;            }            break;        case sw_http_HT:            switch (ch) {            case 'T':                state = sw_http_HTT;                break;            default:                return NGX_HTTP_PARSE_INVALID_REQUEST;            }            break;        case sw_http_HTT:            switch (ch) {            case 'P':                state = sw_http_HTTP;                break;            default:                return NGX_HTTP_PARSE_INVALID_REQUEST;            }            break;        case sw_http_HTTP:            switch (ch) {            case '/':                state = sw_first_major_digit;                break;            default:                return NGX_HTTP_PARSE_INVALID_REQUEST;            }            break;        /* first digit of major HTTP version */        case sw_first_major_digit:            if (ch < '1' || ch > '9') {                return NGX_HTTP_PARSE_INVALID_REQUEST;            }            r->http_major = ch - '0';            state = sw_major_digit;            break;        /* major HTTP version or dot */        case sw_major_digit:            if (ch == '.') {                state = sw_first_minor_digit;                break;            }            if (ch < '0' || ch > '9') {                return NGX_HTTP_PARSE_INVALID_REQUEST;            }            r->http_major = r->http_major * 10 + ch - '0';            break;        /* first digit of minor HTTP version */        case sw_first_minor_digit:            if (ch < '0' || ch > '9') {                return NGX_HTTP_PARSE_INVALID_REQUEST;            }            r->http_minor = ch - '0';            state = sw_minor_digit;            break;        /* minor HTTP version or end of request line */        case sw_minor_digit:            if (ch == CR) {                state = sw_almost_done;                break;            }            if (ch == LF) {                goto done;            }            if (ch == ' ') {                state = sw_spaces_after_digit;                break;            }            if (ch < '0' || ch > '9') {                return NGX_HTTP_PARSE_INVALID_REQUEST;            }            r->http_minor = r->http_minor * 10 + ch - '0';            break;        case sw_spaces_after_digit:            switch (ch) {            case ' ':                break;            case CR:                state = sw_almost_done;                break;            case LF:                goto done;            default:                return NGX_HTTP_PARSE_INVALID_REQUEST;            }            break;        /* end of request line */        case sw_almost_done:            r->request_end = p - 1;            switch (ch) {            case LF:                goto done;            default:                return NGX_HTTP_PARSE_INVALID_REQUEST;            }        }    }    b->pos = p;    r->state = state;    return NGX_AGAIN;done:    b->pos = p + 1;    if (r->request_end == NULL) {        r->request_end = p;    }    r->http_version = r->http_major * 1000 + r->http_minor;    r->state = sw_start;    if (r->http_version == 9 && r->method != NGX_HTTP_GET) {        return NGX_HTTP_PARSE_INVALID_09_METHOD;    }    return NGX_OK;}ngx_int_tngx_http_parse_header_line(ngx_http_request_t *r, ngx_buf_t *b){    u_char      c, ch, *p;    ngx_uint_t  hash, i;    enum {        sw_start = 0,        sw_name,        sw_space_before_value,        sw_value,        sw_space_after_value,        sw_ignore_line,        sw_almost_done,        sw_header_almost_done    } state;    /* the last '\0' is not needed because string is zero terminated */    static u_char  lowcase[] =        "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"        "\0\0\0\0\0\0\0\0\0\0\0\0\0-\0\0" "0123456789\0\0\0\0\0\0"        "\0abcdefghijklmnopqrstuvwxyz\0\0\0\0\0"        "\0abcdefghijklmnopqrstuvwxyz\0\0\0\0\0"        "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"        "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"        "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"        "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";    state = r->state;    hash = r->header_hash;    i = r->lowcase_index;    for (p = b->pos; p < b->last; p++) {        ch = *p;        switch (state) {        /* first char */        case sw_start:            r->invalid_header = 0;            switch (ch) {            case CR:                r->header_end = p;                state = sw_header_almost_done;                break;            case LF:                r->header_end = p;                goto header_done;            default:                state = sw_name;                r->header_name_start = p;                c = lowcase[ch];                if (c) {                    hash = ngx_hash(0, c);                    r->lowcase_header[0] = c;                    i = 1;                    break;                }                r->invalid_header = 1;                break;            }            break;        /* header name */        case sw_name:            c = lowcase[ch];            if (c) {                hash = ngx_hash(hash, c);                r->lowcase_header[i++] = c;                i &= (NGX_HTTP_LC_HEADER_LEN - 1);                break;            }            if (ch == ':') {                r->header_name_end = p;                state = sw_space_before_value;                break;            }            if (ch == CR) {                r->header_name_end = p;                r->header_start = p;                r->header_end = p;                state = sw_almost_done;                break;            }            if (ch == LF) {                r->header_name_end = p;                r->header_start = p;                r->header_end = p;                goto done;            }            /* IIS may send the duplicate "HTTP/1.1 ..." lines */            if (ch == '/'                && r->upstream                && p - r->header_name_start == 4                && ngx_strncmp(r->header_name_start, "HTTP", 4) == 0)            {                state = sw_ignore_line;                break;            }            r->invalid_header = 1;            break;        /* space* before header value */        case sw_space_before_value:            switch (ch) {            case ' ':                break;            case CR:                r->header_start = p;                r->header_end = p;                state = sw_almost_done;                break;            case LF:                r->header_start = p;                r->header_end = p;                goto done;            default:                r->header_start = p;                state = sw_value;                break;            }            break;        /* header value */        case sw_value:            switch (ch) {            case ' ':                r->header_end = p;                state = sw_space_after_value;                break;            case CR:                r->header_end = p;                state = sw_almost_done;                break;            case LF:                r->header_end = p;                goto done;            }            break;        /* space* before end of header line */        case sw_space_after_value:            switch (ch) {            case ' ':                break;            case CR:                state = sw_almost_done;                break;            case LF:                goto done;            default:                state = sw_value;                break;            }            break;        /* ignore header line */        case sw_ignore_line:            switch (ch) {            case LF:                state = sw_start;                break;            default:                break;            }            break;        /* end of header line */        case sw_almost_done:            switch (ch) {            case LF:                goto done;            case CR:                break;            default:                return NGX_HTTP_PARSE_INVALID_HEADER;            }            break;        /* end of header */        case sw_header_almost_done:            switch (ch) {            case LF:                goto header_done;            default:                return NGX_HTTP_PARSE_INVALID_HEADER;            }        }    }    b->pos = p;    r->state = state;    r->header_hash = hash;    r->lowcase_index = i;    return NGX_AGAIN;done:    b->pos = p + 1;    r->state = sw_start;    r->header_hash = hash;    r->lowcase_index = i;    return NGX_OK;header_done:    b->pos = p + 1;    r->state = sw_start;    return NGX_HTTP_PARSE_HEADER_DONE;}ngx_int_tngx_http_parse_complex_uri(ngx_http_request_t *r, ngx_uint_t merge_slashes){    u_char  c, ch, decoded, *p, *u;    enum {        sw_usual = 0,        sw_slash,        sw_dot,        sw_dot_dot,#if (NGX_WIN32)        sw_dot_dot_dot,#endif        sw_quoted,        sw_quoted_second    } state, quoted_state;#if (NGX_SUPPRESS_WARN)    decoded = '\0';    quoted_state = sw_usual;#endif    state = sw_usual;    p = r->uri_start;    u = r->uri.data;    r->uri_ext = NULL;    r->args_start = NULL;    ch = *p++;    while (p <= r->uri_end) {        /*         * we use "ch = *p++" inside the cycle, but this operation is safe,         * because after the URI there is always at least one charcter:         * the line feed         */        ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,                       "s:%d in:'%Xd:%c', out:'%c'", state, ch, ch, *u);        switch (state) {        case sw_usual:            if (usual[ch >> 5] & (1 << (ch & 0x1f))) {                *u++ = ch;                ch = *p++;                break;            }            switch(ch) {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -