ngx_http_process_host(ngx_http_request_t *r, ngx_table_elt_t *h,
ngx_uint_t offset)
{
- ngx_int_t rc;
- ngx_str_t host;
+ u_char *p;
+ ngx_int_t rc;
+ ngx_str_t host;
if (r->headers_in.host) {
ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
r->headers_in.server = host;
+ p = ngx_strlchr(h->value.data + host.len,
+ h->value.data + h->value.len, ':');
+
+ if (p) {
+ rc = ngx_atoi(p + 1, h->value.data + h->value.len - p - 1);
+
+ if (rc > 0 && rc < 65536) {
+ r->port = rc;
+ }
+ }
+
return NGX_OK;
}
ngx_http_variable_value_t *v, uintptr_t data);
static ngx_int_t ngx_http_variable_https(ngx_http_request_t *r,
ngx_http_variable_value_t *v, uintptr_t data);
+static ngx_int_t ngx_http_variable_request_port(ngx_http_request_t *r,
+ ngx_http_variable_value_t *v, uintptr_t data);
+static ngx_int_t ngx_http_variable_is_request_port(ngx_http_request_t *r,
+ ngx_http_variable_value_t *v, uintptr_t data);
static void ngx_http_variable_set_args(ngx_http_request_t *r,
ngx_http_variable_value_t *v, uintptr_t data);
static ngx_int_t ngx_http_variable_is_args(ngx_http_request_t *r,
{ ngx_string("https"), NULL, ngx_http_variable_https, 0, 0, 0 },
+ { ngx_string("request_port"), NULL,
+ ngx_http_variable_request_port, 0, 0, 0 },
+
+ { ngx_string("is_request_port"), NULL,
+ ngx_http_variable_is_request_port, 0, 0, 0 },
+
{ ngx_string("request_uri"), NULL, ngx_http_variable_request,
offsetof(ngx_http_request_t, unparsed_uri), 0, 0 },
}
+static ngx_int_t
+ngx_http_variable_request_port(ngx_http_request_t *r,
+ ngx_http_variable_value_t *v, uintptr_t data)
+{
+ ngx_uint_t port;
+
+ v->len = 0;
+ v->valid = 1;
+ v->no_cacheable = 0;
+ v->not_found = 0;
+
+ v->data = ngx_pnalloc(r->pool, sizeof("65535") - 1);
+ if (v->data == NULL) {
+ return NGX_ERROR;
+ }
+
+ port = r->port;
+
+ if (port > 0 && port < 65536) {
+ v->len = ngx_sprintf(v->data, "%ui", port) - v->data;
+ }
+
+ return NGX_OK;
+}
+
+
+static ngx_int_t
+ngx_http_variable_is_request_port(ngx_http_request_t *r,
+ ngx_http_variable_value_t *v, uintptr_t data)
+{
+ if (r->port == 0) {
+ *v = ngx_http_variable_null_value;
+ return NGX_OK;
+ }
+
+ v->len = 1;
+ v->valid = 1;
+ v->no_cacheable = 0;
+ v->not_found = 0;
+ v->data = (u_char *) ":";
+
+ return NGX_OK;
+}
+
+
static void
ngx_http_variable_set_args(ngx_http_request_t *r,
ngx_http_variable_value_t *v, uintptr_t data)
static ngx_int_t
ngx_http_v2_parse_authority(ngx_http_request_t *r, ngx_str_t *value)
{
- ngx_int_t rc;
+ u_char *p;
+ ngx_int_t rc;
if (r->host_start) {
ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
r->headers_in.server = *value;
+ p = ngx_strlchr(r->host_start + value->len, r->host_end, ':');
+
+ if (p) {
+ rc = ngx_atoi(p + 1, r->host_end - p - 1);
+
+ if (rc > 0 && rc < 65536) {
+ r->port = rc;
+ }
+ }
+
return NGX_OK;
}