Page Speed Optimization Libraries  1.8.31.2
net/instaweb/system/public/in_place_resource_recorder.h
Go to the documentation of this file.
00001 // Copyright 2013 Google Inc.
00016 
00017 #ifndef NET_INSTAWEB_SYSTEM_PUBLIC_IN_PLACE_RESOURCE_RECORDER_H_
00018 #define NET_INSTAWEB_SYSTEM_PUBLIC_IN_PLACE_RESOURCE_RECORDER_H_
00019 
00020 #include "net/instaweb/http/public/async_fetch.h"
00021 #include "net/instaweb/http/public/http_value.h"
00022 #include "net/instaweb/http/public/inflating_fetch.h"
00023 #include "net/instaweb/http/public/request_context.h"
00024 #include "net/instaweb/util/public/basictypes.h"
00025 #include "net/instaweb/util/public/string.h"
00026 #include "net/instaweb/util/public/string_util.h"
00027 #include "net/instaweb/util/public/writer.h"
00028 #include "pagespeed/kernel/base/atomic_int32.h"
00029 #include "pagespeed/kernel/http/request_headers.h"
00030 #include "pagespeed/kernel/http/response_headers.h"
00031 
00032 namespace net_instaweb {
00033 
00034 class HTTPCache;
00035 class MessageHandler;
00036 class Statistics;
00037 class Variable;
00038 
00042 class InPlaceResourceRecorder : public Writer {
00043  public:
00044   enum HeadersKind {
00047     kPreliminaryHeaders,
00048 
00050     kFullHeaders
00051   };
00052 
00056   InPlaceResourceRecorder(
00057       const RequestContextPtr& request_context,
00058       StringPiece url, StringPiece fragment,
00059       RequestHeaders::Properties request_properties,
00060       bool respect_vary, int max_response_bytes, int max_concurrent_recordings,
00061       int64 implicit_cache_ttl_ms, HTTPCache* cache, Statistics* statistics,
00062       MessageHandler* handler);
00063 
00066   virtual ~InPlaceResourceRecorder();
00067 
00068   static void InitStats(Statistics* statistics);
00069 
00072   virtual bool Write(const StringPiece& contents, MessageHandler* handler);
00073 
00076   virtual bool Flush(MessageHandler* handler) { return true; }
00077 
00101   void ConsiderResponseHeaders(HeadersKind headers_kind,
00102                                ResponseHeaders* response_headers);
00103 
00106   void Fail() { failure_ = true; }
00107 
00115   void DoneAndSetHeaders(ResponseHeaders* response_headers);
00116 
00117   const GoogleString& url() const { return url_; }
00118   MessageHandler* handler() { return handler_; }
00119 
00120   bool failed() { return failure_; }
00121   bool limit_active_recordings() { return max_concurrent_recordings_ != 0; }
00122 
00123   int64 implicit_cache_ttl_ms() { return implicit_cache_ttl_ms_; }
00124 
00125  private:
00126   class HTTPValueFetch : public AsyncFetchUsingWriter {
00127    public:
00128     HTTPValueFetch(const RequestContextPtr& request_context, HTTPValue* value)
00129         : AsyncFetchUsingWriter(request_context, value) {}
00130     virtual void HandleDone(bool ) {}
00131     virtual void HandleHeadersComplete() {}
00132   };
00133 
00134   bool IsIproContentType(ResponseHeaders* response_headers);
00135 
00136   void DroppedDueToSize();
00137 
00138   const GoogleString url_;
00139   const GoogleString fragment_;
00140   const RequestHeaders::Properties request_properties_;
00141   const ResponseHeaders::VaryOption respect_vary_;
00142   const unsigned int max_response_bytes_;
00143   const int max_concurrent_recordings_;
00144   const int64 implicit_cache_ttl_ms_;
00145 
00146   HTTPValue resource_value_;
00147   HTTPValueFetch write_to_resource_value_;
00148   InflatingFetch inflating_fetch_;
00149 
00150   HTTPCache* cache_;
00151   MessageHandler* handler_;
00152 
00153   Variable* num_resources_;
00154   Variable* num_inserted_into_cache_;
00155   Variable* num_not_cacheable_;
00156   Variable* num_failed_;
00157   Variable* num_dropped_due_to_load_;
00158   Variable* num_dropped_due_to_size_;
00159 
00162   static AtomicInt32 active_recordings_;
00164   int status_code_;
00166   bool failure_;
00167 
00170   bool full_response_headers_considered_;
00171 
00173   bool consider_response_headers_called_;
00174 
00175   DISALLOW_COPY_AND_ASSIGN(InPlaceResourceRecorder);
00176 };
00177 
00178 }  
00179 
00180 #endif  ///< NET_INSTAWEB_SYSTEM_PUBLIC_IN_PLACE_RESOURCE_RECORDER_H_
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines