Page Speed Optimization Libraries
1.8.31.3
|
00001 // Copyright 2010 Google Inc. 00019 00020 #ifndef NET_INSTAWEB_APACHE_INSTAWEB_HANDLER_H_ 00021 #define NET_INSTAWEB_APACHE_INSTAWEB_HANDLER_H_ 00022 00023 #include "net/instaweb/apache/apache_writer.h" 00024 #include "net/instaweb/http/public/async_fetch.h" 00025 #include "net/instaweb/http/public/request_context.h" 00026 #include "net/instaweb/rewriter/public/rewrite_options.h" 00027 #include "net/instaweb/rewriter/public/rewrite_query.h" 00028 #include "pagespeed/kernel/base/basictypes.h" 00029 #include "pagespeed/kernel/base/scoped_ptr.h" 00030 #include "pagespeed/kernel/base/string.h" 00031 #include "pagespeed/kernel/base/string_util.h" 00032 #include "pagespeed/kernel/base/thread_system.h" 00033 #include "pagespeed/kernel/http/content_type.h" 00034 #include "pagespeed/kernel/http/google_url.h" 00035 #include "pagespeed/kernel/http/response_headers.h" 00036 00037 #include "apr_pools.h" 00038 00039 00040 00041 #include "httpd.h" 00042 00043 namespace net_instaweb { 00044 00045 class ApacheRequestContext; 00046 class ApacheRewriteDriverFactory; 00047 class ApacheServerContext; 00048 class InPlaceResourceRecorder; 00049 class QueryParams; 00050 class RequestHeaders; 00051 class RewriteDriver; 00052 class ServerContext; 00053 class SystemRewriteOptions; 00054 00057 class ApacheFetch : public AsyncFetchUsingWriter { 00058 public: 00059 ApacheFetch(const GoogleString& mapped_url, 00060 ServerContext* server_context, 00061 request_rec* request, 00062 const RequestContextPtr& request_context, 00063 const RewriteOptions* options); 00064 virtual ~ApacheFetch(); 00065 00075 void set_handle_error(bool x) { handle_error_ = x; } 00076 00077 virtual void HandleHeadersComplete(); 00078 virtual void HandleDone(bool success); 00079 00087 void Wait(); 00088 00089 bool status_ok() const { return status_ok_; } 00090 00091 virtual bool IsCachedResultValid(const ResponseHeaders& headers); 00092 00096 void set_is_proxy(bool x) { is_proxy_ = x; } 00097 00098 private: 00099 GoogleString mapped_url_; 00100 ApacheWriter apache_writer_; 00101 ServerContext* server_context_; 00102 scoped_ptr<ThreadSystem::CondvarCapableMutex> mutex_; 00103 scoped_ptr<ThreadSystem::Condvar> condvar_; 00104 bool done_; 00105 bool handle_error_; 00106 bool status_ok_; 00107 bool is_proxy_; 00108 const RewriteOptions* options_; 00109 int64 blocking_fetch_timeout_ms_; 00110 00111 DISALLOW_COPY_AND_ASSIGN(ApacheFetch); 00112 }; 00113 00126 class InstawebHandler { 00127 public: 00128 explicit InstawebHandler(request_rec* request); 00129 ~InstawebHandler(); 00130 00132 const GoogleUrl& stripped_gurl() const { return stripped_gurl_; } 00133 const RequestContextPtr request_context() const { return request_context_; } 00134 bool use_custom_options() const { return custom_options_.get() != NULL; } 00135 const QueryParams& query_params() { return rewrite_query_.query_params(); } 00136 const QueryParams& pagespeed_query_params() { 00137 return rewrite_query_.pagespeed_query_params(); 00138 } 00139 const QueryParams& pagespeed_option_cookies() { 00140 return rewrite_query_.pagespeed_option_cookies(); 00141 } 00142 00143 void SetupSpdyConnectionIfNeeded(); 00144 void RemoveStrippedResponseHeadersFromApacheRequest(); 00145 00149 RewriteDriver* MakeDriver(); 00150 00153 ApacheFetch* MakeFetch(const GoogleString& url); 00154 00157 ApacheFetch* MakeFetch() { return MakeFetch(original_url_); } 00158 00162 bool HandleAsProxy(); 00163 00167 bool HandleAsInPlace(); 00168 00171 void HandleAsPagespeedResource(); 00172 00174 void WaitForFetch(); 00175 00176 RequestHeaders* ReleaseRequestHeaders() { return request_headers_.release(); } 00177 00180 const SystemRewriteOptions* options() { return options_; } 00181 00184 static bool is_pagespeed_subrequest(request_rec* request); 00185 00188 static apr_status_t instaweb_handler(request_rec* request); 00189 00193 static apr_status_t save_url_hook(request_rec *request); 00194 00197 static apr_status_t save_url_in_note(request_rec *request, 00198 ApacheServerContext* server_context); 00199 00203 static apr_status_t instaweb_map_to_storage(request_rec* request); 00204 00207 static void AboutToBeDoneWithRecorder(request_rec* request, 00208 InPlaceResourceRecorder* recorder); 00209 00210 private: 00215 void ComputeCustomOptions(); 00216 00217 static bool IsCompressibleContentType(const char* content_type); 00218 00219 static void send_out_headers_and_body( 00220 request_rec* request, 00221 const ResponseHeaders& response_headers, 00222 const GoogleString& output); 00223 00227 static bool handle_as_resource(ApacheServerContext* server_context, 00228 request_rec* request, 00229 GoogleUrl* gurl); 00230 00233 static void write_handler_response(const StringPiece& output, 00234 request_rec* request, 00235 ContentType content_type, 00236 const StringPiece& cache_control); 00237 static void write_handler_response(const StringPiece& output, 00238 request_rec* request); 00239 00245 static const char* get_instaweb_resource_url( 00246 request_rec* request, ApacheServerContext* server_context); 00247 00251 static int log_request_headers(void* logging_data, const char* key, 00252 const char* value); 00253 00254 static void instaweb_static_handler(request_rec* request, 00255 ApacheServerContext* server_context); 00256 00257 static apr_status_t instaweb_statistics_handler( 00258 request_rec* request, ApacheServerContext* server_context, 00259 ApacheRewriteDriverFactory* factory); 00260 00266 static bool parse_query_params(const request_rec* request, GoogleString* data, 00267 apr_status_t* ret); 00268 00272 static bool parse_body_from_post(const request_rec* request, 00273 GoogleString* data, apr_status_t* ret); 00274 00275 static apr_status_t instaweb_beacon_handler( 00276 request_rec* request, ApacheServerContext* server_context); 00277 00278 static bool IsBeaconUrl(const RewriteOptions::BeaconUrl& beacons, 00279 const GoogleUrl& gurl); 00280 00281 request_rec* request_; 00282 RequestContextPtr request_context_; 00283 ApacheRequestContext* apache_request_context_; 00284 ApacheServerContext* server_context_; 00285 scoped_ptr<RequestHeaders> request_headers_; 00286 ResponseHeaders response_headers_; 00287 GoogleString original_url_; 00288 GoogleUrl stripped_gurl_; 00289 scoped_ptr<SystemRewriteOptions> custom_options_; 00290 00299 const SystemRewriteOptions* options_; 00300 RewriteDriver* rewrite_driver_; 00301 int num_response_attributes_; 00302 RewriteQuery rewrite_query_; 00303 scoped_ptr<ApacheFetch> fetch_; 00304 00305 DISALLOW_COPY_AND_ASSIGN(InstawebHandler); 00306 }; 00307 00308 } 00309 00310 #endif ///< NET_INSTAWEB_APACHE_INSTAWEB_HANDLER_H_