Page Speed Optimization Libraries  1.7.30.4
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 "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_
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines