Page Speed Optimization Libraries
1.7.30.4
|
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 "pagespeed/kernel/base/string.h" 00028 #include "pagespeed/kernel/base/string_util.h" 00029 #include "pagespeed/kernel/base/thread_system.h" 00030 #include "pagespeed/kernel/http/google_url.h" 00031 #include "pagespeed/kernel/base/basictypes.h" 00032 #include "pagespeed/kernel/base/scoped_ptr.h" 00033 #include "pagespeed/kernel/http/content_type.h" 00034 #include "pagespeed/kernel/http/response_headers.h" 00035 00036 #include "apr_pools.h" 00037 00038 00039 00040 #include "httpd.h" 00041 00042 namespace net_instaweb { 00043 00044 class ApacheRequestContext; 00045 class ApacheRewriteDriverFactory; 00046 class ApacheServerContext; 00047 class InPlaceResourceRecorder; 00048 class RequestHeaders; 00049 class RewriteDriver; 00050 class ServerContext; 00051 class SystemRewriteOptions; 00052 00055 class ApacheFetch : public AsyncFetchUsingWriter { 00056 public: 00057 ApacheFetch(const GoogleString& mapped_url, 00058 ServerContext* server_context, 00059 request_rec* request, 00060 const RequestContextPtr& request_context, 00061 const RewriteOptions* options); 00062 virtual ~ApacheFetch(); 00063 00073 void set_handle_error(bool x) { handle_error_ = x; } 00074 00075 virtual void HandleHeadersComplete(); 00076 virtual void HandleDone(bool success); 00077 00085 void Wait(); 00086 00087 bool status_ok() const { return status_ok_; } 00088 00089 virtual bool IsCachedResultValid(const ResponseHeaders& headers); 00090 00094 void set_is_proxy(bool x) { is_proxy_ = x; } 00095 00096 private: 00097 GoogleString mapped_url_; 00098 ApacheWriter apache_writer_; 00099 ServerContext* server_context_; 00100 scoped_ptr<ThreadSystem::CondvarCapableMutex> mutex_; 00101 scoped_ptr<ThreadSystem::Condvar> condvar_; 00102 bool done_; 00103 bool handle_error_; 00104 bool status_ok_; 00105 bool is_proxy_; 00106 const RewriteOptions* options_; 00107 00108 DISALLOW_COPY_AND_ASSIGN(ApacheFetch); 00109 }; 00110 00123 class InstawebHandler { 00124 public: 00125 explicit InstawebHandler(request_rec* request); 00126 ~InstawebHandler(); 00127 00129 const GoogleUrl& stripped_gurl() const { return stripped_gurl_; } 00130 const RequestContextPtr request_context() const { return request_context_; } 00131 bool use_custom_options() const { return custom_options_.get() != NULL; } 00132 00133 void SetupSpdyConnectionIfNeeded(); 00134 void RemoveStrippedResponseHeadersFromApacheReequest(); 00135 00139 RewriteDriver* MakeDriver(); 00140 00143 ApacheFetch* MakeFetch(const GoogleString& url); 00144 00147 ApacheFetch* MakeFetch() { return MakeFetch(original_url_); } 00148 00152 bool HandleAsProxy(); 00153 00157 bool HandleAsInPlace(); 00158 00161 void HandleAsPagespeedResource(); 00162 00163 RequestHeaders* ReleaseRequestHeaders() { return request_headers_.release(); } 00164 00167 const SystemRewriteOptions* options() { return options_; } 00168 00171 static bool is_pagespeed_subrequest(request_rec* request); 00172 00175 static apr_status_t instaweb_handler(request_rec* request); 00176 00180 static apr_status_t save_url_hook(request_rec *request); 00181 00184 static apr_status_t save_url_in_note(request_rec *request, 00185 ApacheServerContext* server_context); 00186 00190 static apr_status_t instaweb_map_to_storage(request_rec* request); 00191 00194 static void AboutToBeDoneWithRecorder(request_rec* request, 00195 InPlaceResourceRecorder* recorder); 00196 00197 private: 00202 void ComputeCustomOptions(); 00203 00204 static bool IsCompressibleContentType(const char* content_type); 00205 00206 static void send_out_headers_and_body( 00207 request_rec* request, 00208 const ResponseHeaders& response_headers, 00209 const GoogleString& output); 00210 00214 static bool handle_as_resource(ApacheServerContext* server_context, 00215 request_rec* request, 00216 GoogleUrl* gurl); 00217 00220 static void write_handler_response(const StringPiece& output, 00221 request_rec* request, 00222 ContentType content_type, 00223 const StringPiece& cache_control); 00224 static void write_handler_response(const StringPiece& output, 00225 request_rec* request); 00226 00232 static const char* get_instaweb_resource_url( 00233 request_rec* request, ApacheServerContext* server_context); 00234 00238 static int log_request_headers(void* logging_data, const char* key, 00239 const char* value); 00240 00241 static void instaweb_static_handler(request_rec* request, 00242 ApacheServerContext* server_context); 00243 00244 static apr_status_t instaweb_statistics_handler( 00245 request_rec* request, ApacheServerContext* server_context, 00246 ApacheRewriteDriverFactory* factory); 00247 00253 static bool parse_query_params(const request_rec* request, GoogleString* data, 00254 apr_status_t* ret); 00255 00259 static bool parse_body_from_post(const request_rec* request, 00260 GoogleString* data, apr_status_t* ret); 00261 00262 static apr_status_t instaweb_beacon_handler( 00263 request_rec* request, ApacheServerContext* server_context); 00264 00265 static bool IsBeaconUrl(const RewriteOptions::BeaconUrl& beacons, 00266 const GoogleUrl& gurl); 00267 00268 request_rec* request_; 00269 RequestContextPtr request_context_; 00270 ApacheRequestContext* apache_request_context_; 00271 ApacheServerContext* server_context_; 00272 scoped_ptr<RequestHeaders> request_headers_; 00273 ResponseHeaders response_headers_; 00274 GoogleString original_url_; 00275 GoogleUrl stripped_gurl_; 00276 scoped_ptr<SystemRewriteOptions> custom_options_; 00277 00286 const SystemRewriteOptions* options_; 00287 RewriteDriver* rewrite_driver_; 00288 int num_response_attributes_; 00289 00290 DISALLOW_COPY_AND_ASSIGN(InstawebHandler); 00291 }; 00292 00293 } 00294 00295 #endif ///< NET_INSTAWEB_APACHE_INSTAWEB_HANDLER_H_