Page Speed Optimization Libraries  1.9.32.2
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
instaweb_handler.h
Go to the documentation of this file.
1 // Copyright 2010 Google Inc.
19 
20 #ifndef NET_INSTAWEB_APACHE_INSTAWEB_HANDLER_H_
21 #define NET_INSTAWEB_APACHE_INSTAWEB_HANDLER_H_
22 
25 #include "net/instaweb/http/public/request_context.h"
27 #include "net/instaweb/rewriter/public/rewrite_query.h"
28 #include "pagespeed/kernel/base/basictypes.h"
29 #include "pagespeed/kernel/base/scoped_ptr.h"
30 #include "pagespeed/kernel/base/string.h"
31 #include "pagespeed/kernel/base/string_util.h"
32 #include "pagespeed/kernel/base/thread_system.h"
33 #include "pagespeed/kernel/http/content_type.h"
34 #include "pagespeed/kernel/http/google_url.h"
35 
36 #include "apr_pools.h"
37 #include "httpd.h"
41 
42 namespace net_instaweb {
43 
44 class ApacheRequestContext;
45 class ApacheRewriteDriverFactory;
46 class ApacheServerContext;
47 class InPlaceResourceRecorder;
48 class QueryParams;
49 class RequestHeaders;
50 class ResponseHeaders;
51 class RewriteDriver;
52 class ServerContext;
53 class SystemRewriteOptions;
54 
58  public:
59  ApacheFetch(const GoogleString& mapped_url,
60  ServerContext* server_context,
61  request_rec* request,
62  const RequestContextPtr& request_context,
63  const RewriteOptions* options);
64  virtual ~ApacheFetch();
65 
75  void set_handle_error(bool x) { handle_error_ = x; }
76 
77  virtual void HandleHeadersComplete();
78  virtual void HandleDone(bool success);
79 
87  void Wait();
88 
89  bool status_ok() const { return status_ok_; }
90 
91  virtual bool IsCachedResultValid(const ResponseHeaders& headers);
92 
96  void set_is_proxy(bool x) { is_proxy_ = x; }
97 
98  private:
99  GoogleString mapped_url_;
100  ApacheWriter apache_writer_;
101  ServerContext* server_context_;
102  scoped_ptr<ThreadSystem::CondvarCapableMutex> mutex_;
103  scoped_ptr<ThreadSystem::Condvar> condvar_;
104  bool done_;
105  bool handle_error_;
106  bool status_ok_;
107  bool is_proxy_;
108  const RewriteOptions* options_;
109  int64 blocking_fetch_timeout_ms_;
110 
111  DISALLOW_COPY_AND_ASSIGN(ApacheFetch);
112 };
113 
127  public:
128  explicit InstawebHandler(request_rec* request);
129  ~InstawebHandler();
130 
132  const GoogleUrl& stripped_gurl() const { return stripped_gurl_; }
133  const RequestContextPtr request_context() const { return request_context_; }
134  bool use_custom_options() const { return custom_options_.get() != NULL; }
135  const QueryParams& query_params() { return rewrite_query_.query_params(); }
136  const QueryParams& pagespeed_query_params() {
137  return rewrite_query_.pagespeed_query_params();
138  }
139  const QueryParams& pagespeed_option_cookies() {
140  return rewrite_query_.pagespeed_option_cookies();
141  }
142 
143  void SetupSpdyConnectionIfNeeded();
144  void RemoveStrippedResponseHeadersFromApacheRequest();
145 
149  RewriteDriver* MakeDriver();
150 
153  ApacheFetch* MakeFetch(const GoogleString& url);
154 
157  ApacheFetch* MakeFetch() { return MakeFetch(original_url_); }
158 
162  bool HandleAsProxy();
163 
167  bool HandleAsInPlace();
168 
172 
174  void WaitForFetch();
175 
179  bool ProxyUrl();
180 
181  RequestHeaders* ReleaseRequestHeaders() { return request_headers_.release(); }
182 
185  const SystemRewriteOptions* options() { return options_; }
186 
189  static bool is_pagespeed_subrequest(request_rec* request);
190 
193  static apr_status_t instaweb_handler(request_rec* request);
194 
198  static apr_status_t save_url_hook(request_rec *request);
199 
202  static apr_status_t save_url_in_note(request_rec *request,
203  ApacheServerContext* server_context);
204 
208  static apr_status_t instaweb_map_to_storage(request_rec* request);
209 
212  static void AboutToBeDoneWithRecorder(request_rec* request,
213  InPlaceResourceRecorder* recorder);
214 
215  private:
220  void ComputeCustomOptions();
221 
222  static bool IsCompressibleContentType(const char* content_type);
223 
224  static void send_out_headers_and_body(
225  request_rec* request,
226  const ResponseHeaders& response_headers,
227  const GoogleString& output);
228 
232  static bool handle_as_resource(ApacheServerContext* server_context,
233  request_rec* request,
234  GoogleUrl* gurl);
235 
238  static void write_handler_response(const StringPiece& output,
239  request_rec* request,
240  ContentType content_type,
241  const StringPiece& cache_control);
242  static void write_handler_response(const StringPiece& output,
243  request_rec* request);
244 
250  static const char* get_instaweb_resource_url(
251  request_rec* request, ApacheServerContext* server_context);
252 
256  static int log_request_headers(void* logging_data, const char* key,
257  const char* value);
258 
259  static void instaweb_static_handler(request_rec* request,
260  ApacheServerContext* server_context);
261 
262  static apr_status_t instaweb_statistics_handler(
263  request_rec* request, ApacheServerContext* server_context,
264  ApacheRewriteDriverFactory* factory);
265 
271  static bool parse_query_params(const request_rec* request, GoogleString* data,
272  apr_status_t* ret);
273 
277  static bool parse_body_from_post(const request_rec* request,
278  GoogleString* data, apr_status_t* ret);
279 
280  static apr_status_t instaweb_beacon_handler(
281  request_rec* request, ApacheServerContext* server_context);
282 
283  static bool IsBeaconUrl(const RewriteOptions::BeaconUrl& beacons,
284  const GoogleUrl& gurl);
285 
286  request_rec* request_;
287  RequestContextPtr request_context_;
288  ApacheRequestContext* apache_request_context_;
289  ApacheServerContext* server_context_;
290  scoped_ptr<RequestHeaders> request_headers_;
291  scoped_ptr<ResponseHeaders> response_headers_;
292  GoogleString original_url_;
293  GoogleUrl stripped_gurl_;
294  scoped_ptr<SystemRewriteOptions> custom_options_;
295 
304  const SystemRewriteOptions* options_;
305  RewriteDriver* rewrite_driver_;
306  int num_response_attributes_;
307  RewriteQuery rewrite_query_;
308  scoped_ptr<ApacheFetch> fetch_;
309 
310  DISALLOW_COPY_AND_ASSIGN(InstawebHandler);
311 };
312 
313 }
314 
315 #endif
Definition: instaweb_handler.h:126
Definition: instaweb_handler.h:57
Definition: rewrite_query.h:41
Definition: in_place_resource_recorder.h:43
static apr_status_t instaweb_map_to_storage(request_rec *request)
void WaitForFetch()
Waits for an outstanding fetch (obtained by MakeFetch) to complete.
static bool is_pagespeed_subrequest(request_rec *request)
virtual const RequestContextPtr & request_context()
Definition: async_fetch.h:151
Definition: rewrite_options.h:439
ApacheFetch * MakeFetch()
Definition: instaweb_handler.h:157
void set_handle_error(bool x)
Definition: instaweb_handler.h:75
Definition: system_rewrite_options.h:31
Definition: apache_server_context.h:49
RewriteDriver * MakeDriver()
Writer object that writes to an Apache Request stream.
Definition: apache_writer.h:33
const GoogleUrl & stripped_gurl() const
Any PageSpeed query params are removed.
Definition: instaweb_handler.h:132
Definition: rewrite_driver.h:98
static apr_status_t instaweb_handler(request_rec *request)
Definition: server_context.h:101
Definition: async_fetch.h:244
static apr_status_t save_url_hook(request_rec *request)
virtual bool IsCachedResultValid(const ResponseHeaders &headers)
static void AboutToBeDoneWithRecorder(request_rec *request, InPlaceResourceRecorder *recorder)
const SystemRewriteOptions * options()
Definition: instaweb_handler.h:185
void set_is_proxy(bool x)
Definition: instaweb_handler.h:96
Creates an Apache RewriteDriver.
Definition: apache_rewrite_driver_factory.h:47
Definition: rewrite_options.h:83
Definition: apache_request_context.h:39
static apr_status_t save_url_in_note(request_rec *request, ApacheServerContext *server_context)