Page Speed Optimization Libraries
1.7.30.4
|
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_