/* * Copyright 2012 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ // Author: jefftk@google.com (Jeff Kaufman) #include "ngx_server_context.h" extern "C" { #include } #include "ngx_pagespeed.h" #include "ngx_message_handler.h" #include "ngx_rewrite_driver_factory.h" #include "ngx_rewrite_options.h" #include "net/instaweb/rewriter/public/rewrite_driver.h" #include "pagespeed/system/add_headers_fetcher.h" #include "pagespeed/system/loopback_route_fetcher.h" #include "pagespeed/system/system_request_context.h" namespace net_instaweb { NgxServerContext::NgxServerContext( NgxRewriteDriverFactory* factory, StringPiece hostname, int port) : SystemServerContext(factory, hostname, port), ngx_http2_variable_index_(NGX_ERROR) { } NgxServerContext::~NgxServerContext() { } NgxRewriteOptions* NgxServerContext::config() { return NgxRewriteOptions::DynamicCast(global_options()); } SystemRequestContext* NgxServerContext::NewRequestContext( ngx_http_request_t* r) { // Based on ngx_http_variable_server_port. bool port_set = false; int local_port = 0; #if (NGX_HAVE_INET6) if (r->connection->local_sockaddr->sa_family == AF_INET6) { local_port = ntohs(reinterpret_cast( r->connection->local_sockaddr)->sin6_port); port_set = true; } #endif if (!port_set) { local_port = ntohs(reinterpret_cast( r->connection->local_sockaddr)->sin_port); } ngx_str_t local_ip; u_char addr[NGX_SOCKADDR_STRLEN]; local_ip.len = NGX_SOCKADDR_STRLEN; local_ip.data = addr; ngx_int_t rc = ngx_connection_local_sockaddr(r->connection, &local_ip, 0); if (rc != NGX_OK) { local_ip.len = 0; } SystemRequestContext* ctx = new SystemRequestContext( thread_system()->NewMutex(), timer(), ps_determine_host(r), local_port, str_to_string_piece(local_ip)); // See if http2 is in use. if (ngx_http2_variable_index_ >= 0) { ngx_http_variable_value_t* val = ngx_http_get_indexed_variable(r, ngx_http2_variable_index_); if (val != NULL && val->valid) { StringPiece str_val(reinterpret_cast(val->data), val->len); if (str_val == "h2" || str_val == "h2c") { ctx->set_using_http2(true); } } } return ctx; } GoogleString NgxServerContext::FormatOption(StringPiece option_name, StringPiece args) { return StrCat("pagespeed ", option_name, " ", args, ";"); } } // namespace net_instaweb