diff --git a/src/http/modules/ngx_http_proxy_module.c b/src/http/modules/ngx_http_proxy_module.c index 64190f1..dbba290 100644 --- a/src/http/modules/ngx_http_proxy_module.c +++ b/src/http/modules/ngx_http_proxy_module.c @@ -283,6 +283,8 @@ static ngx_conf_post_t ngx_http_proxy_ssl_conf_command_post = static ngx_conf_enum_t ngx_http_proxy_http_version[] = { + { ngx_string("plain"), NGX_HTTP_VERSION_PLAIN }, + { ngx_string("0.9"), NGX_HTTP_VERSION_9 }, { ngx_string("1.0"), NGX_HTTP_VERSION_10 }, { ngx_string("1.1"), NGX_HTTP_VERSION_11 }, { ngx_null_string, 0 } @@ -1408,8 +1410,10 @@ ngx_http_proxy_create_request(ngx_http_request_t *r) /* the request line */ - b->last = ngx_copy(b->last, method.data, method.len); - *b->last++ = ' '; + if (plcf->http_version != NGX_HTTP_VERSION_PLAIN) { + b->last = ngx_copy(b->last, method.data, method.len); + *b->last++ = ' '; + } u->uri.data = b->last; @@ -1424,7 +1428,7 @@ ngx_http_proxy_create_request(ngx_http_request_t *r) b->last = ngx_copy(b->last, ctx->vars.uri.data, ctx->vars.uri.len); } - if (escape) { + if (plcf->http_version != NGX_HTTP_VERSION_PLAIN && escape) { ngx_escape_uri(b->last, r->uri.data + loc_len, r->uri.len - loc_len, NGX_ESCAPE_URI); b->last += r->uri.len - loc_len + escape; @@ -1440,68 +1444,80 @@ ngx_http_proxy_create_request(ngx_http_request_t *r) } } + if (plcf->http_version == NGX_HTTP_VERSION_PLAIN && *b->start == '/') { + memmove(b->start, b->start + 1, b->last - b->start - 1); + b->last--; + } + u->uri.len = b->last - u->uri.data; if (plcf->http_version == NGX_HTTP_VERSION_11) { b->last = ngx_cpymem(b->last, ngx_http_proxy_version_11, - sizeof(ngx_http_proxy_version_11) - 1); + sizeof(ngx_http_proxy_version_11) - 1); - } else { + } else if (plcf->http_version == NGX_HTTP_VERSION_10) { b->last = ngx_cpymem(b->last, ngx_http_proxy_version, - sizeof(ngx_http_proxy_version) - 1); + sizeof(ngx_http_proxy_version) - 1); } - ngx_memzero(&e, sizeof(ngx_http_script_engine_t)); - - e.ip = headers->values->elts; - e.pos = b->last; - e.request = r; - e.flushed = 1; + if (plcf->http_version != NGX_HTTP_VERSION_PLAIN + && plcf->http_version != NGX_HTTP_VERSION_9) + { + ngx_memzero(&e, sizeof(ngx_http_script_engine_t)); - le.ip = headers->lengths->elts; + e.ip = headers->values->elts; + e.pos = b->last; + e.request = r; + e.flushed = 1; - while (*(uintptr_t *) le.ip) { + le.ip = headers->lengths->elts; - lcode = *(ngx_http_script_len_code_pt *) le.ip; - (void) lcode(&le); + while (*(uintptr_t *) le.ip) { - for (val_len = 0; *(uintptr_t *) le.ip; val_len += lcode(&le)) { lcode = *(ngx_http_script_len_code_pt *) le.ip; - } - le.ip += sizeof(uintptr_t); - - if (val_len == 0) { - e.skip = 1; + (void) lcode(&le); - while (*(uintptr_t *) e.ip) { - code = *(ngx_http_script_code_pt *) e.ip; - code((ngx_http_script_engine_t *) &e); + for (val_len = 0; *(uintptr_t *) le.ip; val_len += lcode(&le)) { + lcode = *(ngx_http_script_len_code_pt *) le.ip; } - e.ip += sizeof(uintptr_t); + le.ip += sizeof(uintptr_t); - e.skip = 0; + if (val_len == 0) { + e.skip = 1; - continue; - } + while (*(uintptr_t *) e.ip) { + code = *(ngx_http_script_code_pt *) e.ip; + code((ngx_http_script_engine_t *) &e); + } + e.ip += sizeof(uintptr_t); - code = *(ngx_http_script_code_pt *) e.ip; - code((ngx_http_script_engine_t *) &e); + e.skip = 0; - *e.pos++ = ':'; *e.pos++ = ' '; + continue; + } - while (*(uintptr_t *) e.ip) { code = *(ngx_http_script_code_pt *) e.ip; code((ngx_http_script_engine_t *) &e); + + *e.pos++ = ':'; *e.pos++ = ' '; + + while (*(uintptr_t *) e.ip) { + code = *(ngx_http_script_code_pt *) e.ip; + code((ngx_http_script_engine_t *) &e); + } + e.ip += sizeof(uintptr_t); + + *e.pos++ = CR; *e.pos++ = LF; } - e.ip += sizeof(uintptr_t); - *e.pos++ = CR; *e.pos++ = LF; + b->last = e.pos; } - b->last = e.pos; - - if (plcf->upstream.pass_request_headers) { + if (plcf->http_version != NGX_HTTP_VERSION_PLAIN + && plcf->http_version != NGX_HTTP_VERSION_9 + && plcf->upstream.pass_request_headers) + { part = &r->headers_in.headers.part; header = part->elts; @@ -1542,7 +1558,7 @@ ngx_http_proxy_create_request(ngx_http_request_t *r) /* add "\r\n" at the header end */ *b->last++ = CR; *b->last++ = LF; - if (plcf->body_values) { + if (plcf->http_version != NGX_HTTP_VERSION_PLAIN && plcf->body_values) { e.ip = plcf->body_values->elts; e.pos = b->last; e.skip = 0; @@ -1829,16 +1845,15 @@ ngx_http_proxy_process_status_line(ngx_http_request_t *r) #endif - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent no valid HTTP/1.0 header"); - #if 0 if (u->accel) { return NGX_HTTP_UPSTREAM_INVALID_HEADER; } #endif - r->http_version = NGX_HTTP_VERSION_9; + u->headers_in.status_n = NGX_HTTP_OK; + u->headers_in.status_line.len = 0; + u->headers_in.status_line.data = NULL; u->state->status = NGX_HTTP_OK; u->headers_in.connection_close = 1; diff --git a/src/http/ngx_http_request.h b/src/http/ngx_http_request.h index 52b274a..86327a2 100644 --- a/src/http/ngx_http_request.h +++ b/src/http/ngx_http_request.h @@ -19,7 +19,7 @@ #define NGX_HTTP_DISCARD_BUFFER_SIZE 4096 #define NGX_HTTP_LINGERING_BUFFER_SIZE 4096 - +#define NGX_HTTP_VERSION_PLAIN 1 #define NGX_HTTP_VERSION_9 9 #define NGX_HTTP_VERSION_10 1000 #define NGX_HTTP_VERSION_11 1001