Page Speed Optimization Libraries  1.8.31.2
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 
00137   void SetupSpdyConnectionIfNeeded();
00138   void RemoveStrippedResponseHeadersFromApacheReequest();
00139 
00143   RewriteDriver* MakeDriver();
00144 
00147   ApacheFetch* MakeFetch(const GoogleString& url);
00148 
00151   ApacheFetch* MakeFetch() { return MakeFetch(original_url_); }
00152 
00156   bool HandleAsProxy();
00157 
00161   bool HandleAsInPlace();
00162 
00165   void HandleAsPagespeedResource();
00166 
00168   void WaitForFetch();
00169 
00170   RequestHeaders* ReleaseRequestHeaders() { return request_headers_.release(); }
00171 
00174   const SystemRewriteOptions* options() { return options_; }
00175 
00178   static bool is_pagespeed_subrequest(request_rec* request);
00179 
00182   static apr_status_t instaweb_handler(request_rec* request);
00183 
00187   static apr_status_t save_url_hook(request_rec *request);
00188 
00191   static apr_status_t save_url_in_note(request_rec *request,
00192                                        ApacheServerContext* server_context);
00193 
00197   static apr_status_t instaweb_map_to_storage(request_rec* request);
00198 
00201   static void AboutToBeDoneWithRecorder(request_rec* request,
00202                                         InPlaceResourceRecorder* recorder);
00203 
00204  private:
00209   void ComputeCustomOptions();
00210 
00211   static bool IsCompressibleContentType(const char* content_type);
00212 
00213   static void send_out_headers_and_body(
00214       request_rec* request,
00215       const ResponseHeaders& response_headers,
00216       const GoogleString& output);
00217 
00221   static bool handle_as_resource(ApacheServerContext* server_context,
00222                                  request_rec* request,
00223                                  GoogleUrl* gurl);
00224 
00227   static void write_handler_response(const StringPiece& output,
00228                                      request_rec* request,
00229                                      ContentType content_type,
00230                                      const StringPiece& cache_control);
00231   static void write_handler_response(const StringPiece& output,
00232                                      request_rec* request);
00233 
00239   static const char* get_instaweb_resource_url(
00240       request_rec* request, ApacheServerContext* server_context);
00241 
00245   static int log_request_headers(void* logging_data, const char* key,
00246                                  const char* value);
00247 
00248   static void instaweb_static_handler(request_rec* request,
00249                                       ApacheServerContext* server_context);
00250 
00251   static apr_status_t instaweb_statistics_handler(
00252       request_rec* request, ApacheServerContext* server_context,
00253       ApacheRewriteDriverFactory* factory);
00254 
00260   static bool parse_query_params(const request_rec* request, GoogleString* data,
00261                                  apr_status_t* ret);
00262 
00266   static bool parse_body_from_post(const request_rec* request,
00267                                    GoogleString* data, apr_status_t* ret);
00268 
00269   static apr_status_t instaweb_beacon_handler(
00270       request_rec* request, ApacheServerContext* server_context);
00271 
00272   static bool IsBeaconUrl(const RewriteOptions::BeaconUrl& beacons,
00273                           const GoogleUrl& gurl);
00274 
00275   request_rec* request_;
00276   RequestContextPtr request_context_;
00277   ApacheRequestContext* apache_request_context_; 
00278   ApacheServerContext* server_context_;
00279   scoped_ptr<RequestHeaders> request_headers_;
00280   ResponseHeaders response_headers_;
00281   GoogleString original_url_;
00282   GoogleUrl stripped_gurl_; 
00283   scoped_ptr<SystemRewriteOptions> custom_options_;
00284 
00293   const SystemRewriteOptions* options_;
00294   RewriteDriver* rewrite_driver_;
00295   int num_response_attributes_;
00296   RewriteQuery rewrite_query_;
00297   scoped_ptr<ApacheFetch> fetch_;
00298 
00299   DISALLOW_COPY_AND_ASSIGN(InstawebHandler);
00300 };
00301 
00302 }  
00303 
00304 #endif  ///< NET_INSTAWEB_APACHE_INSTAWEB_HANDLER_H_
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines