Page Speed Optimization Libraries  1.8.31.3
net/instaweb/apache/instaweb_handler.h
Go to the documentation of this file.
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_
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines