Page Speed Optimization Libraries  1.9.32.1
 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 
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 
176  RequestHeaders* ReleaseRequestHeaders() { return request_headers_.release(); }
177 
180  const SystemRewriteOptions* options() { return options_; }
181 
184  static bool is_pagespeed_subrequest(request_rec* request);
185 
188  static apr_status_t instaweb_handler(request_rec* request);
189 
193  static apr_status_t save_url_hook(request_rec *request);
194 
197  static apr_status_t save_url_in_note(request_rec *request,
198  ApacheServerContext* server_context);
199 
203  static apr_status_t instaweb_map_to_storage(request_rec* request);
204 
207  static void AboutToBeDoneWithRecorder(request_rec* request,
208  InPlaceResourceRecorder* recorder);
209 
210  private:
215  void ComputeCustomOptions();
216 
217  static bool IsCompressibleContentType(const char* content_type);
218 
219  static void send_out_headers_and_body(
220  request_rec* request,
221  const ResponseHeaders& response_headers,
222  const GoogleString& output);
223 
227  static bool handle_as_resource(ApacheServerContext* server_context,
228  request_rec* request,
229  GoogleUrl* gurl);
230 
233  static void write_handler_response(const StringPiece& output,
234  request_rec* request,
235  ContentType content_type,
236  const StringPiece& cache_control);
237  static void write_handler_response(const StringPiece& output,
238  request_rec* request);
239 
245  static const char* get_instaweb_resource_url(
246  request_rec* request, ApacheServerContext* server_context);
247 
251  static int log_request_headers(void* logging_data, const char* key,
252  const char* value);
253 
254  static void instaweb_static_handler(request_rec* request,
255  ApacheServerContext* server_context);
256 
257  static apr_status_t instaweb_statistics_handler(
258  request_rec* request, ApacheServerContext* server_context,
259  ApacheRewriteDriverFactory* factory);
260 
266  static bool parse_query_params(const request_rec* request, GoogleString* data,
267  apr_status_t* ret);
268 
272  static bool parse_body_from_post(const request_rec* request,
273  GoogleString* data, apr_status_t* ret);
274 
275  static apr_status_t instaweb_beacon_handler(
276  request_rec* request, ApacheServerContext* server_context);
277 
278  static bool IsBeaconUrl(const RewriteOptions::BeaconUrl& beacons,
279  const GoogleUrl& gurl);
280 
281  request_rec* request_;
282  RequestContextPtr request_context_;
283  ApacheRequestContext* apache_request_context_;
284  ApacheServerContext* server_context_;
285  scoped_ptr<RequestHeaders> request_headers_;
286  scoped_ptr<ResponseHeaders> response_headers_;
287  GoogleString original_url_;
288  GoogleUrl stripped_gurl_;
289  scoped_ptr<SystemRewriteOptions> custom_options_;
290 
299  const SystemRewriteOptions* options_;
300  RewriteDriver* rewrite_driver_;
301  int num_response_attributes_;
302  RewriteQuery rewrite_query_;
303  scoped_ptr<ApacheFetch> fetch_;
304 
305  DISALLOW_COPY_AND_ASSIGN(InstawebHandler);
306 };
307 
308 }
309 
310 #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:431
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:100
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:180
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:81
Definition: apache_request_context.h:39
static apr_status_t save_url_in_note(request_rec *request, ApacheServerContext *server_context)