00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00018
00019 #ifndef NET_INSTAWEB_REWRITER_PUBLIC_AJAX_REWRITE_CONTEXT_H_
00020 #define NET_INSTAWEB_REWRITER_PUBLIC_AJAX_REWRITE_CONTEXT_H_
00021
00022 #include "base/scoped_ptr.h"
00023 #include "net/instaweb/http/public/async_fetch.h"
00024 #include "net/instaweb/http/public/http_value.h"
00025 #include "net/instaweb/http/public/http_value_writer.h"
00026 #include "net/instaweb/rewriter/public/output_resource_kind.h"
00027 #include "net/instaweb/rewriter/public/resource.h"
00028 #include "net/instaweb/rewriter/public/resource_manager.h"
00029 #include "net/instaweb/rewriter/public/resource_slot.h"
00030 #include "net/instaweb/rewriter/public/rewrite_context.h"
00031 #include "net/instaweb/rewriter/public/rewrite_options.h"
00032 #include "net/instaweb/rewriter/public/single_rewrite_context.h"
00033 #include "net/instaweb/util/public/basictypes.h"
00034 #include "net/instaweb/util/public/proto_util.h"
00035 #include "net/instaweb/util/public/string.h"
00036 #include "net/instaweb/util/public/string_util.h"
00037
00038 namespace net_instaweb {
00039
00040 class InputInfo;
00041 class MessageHandler;
00042 class ResponseHeaders;
00043 class RewriteDriver;
00044 class RewriteFilter;
00045 class UrlAsyncFetcher;
00046 struct ContentType;
00047
00051 class AjaxRewriteResourceSlot : public ResourceSlot {
00052 public:
00053 explicit AjaxRewriteResourceSlot(const ResourcePtr& resource);
00054
00056 virtual void Render();
00057
00059 virtual GoogleString LocationString() { return "ajax"; }
00060
00061 protected:
00062 virtual ~AjaxRewriteResourceSlot();
00063
00064 private:
00065 DISALLOW_COPY_AND_ASSIGN(AjaxRewriteResourceSlot);
00066 };
00067
00069 class AjaxRewriteContext : public SingleRewriteContext {
00070 public:
00071 AjaxRewriteContext(RewriteDriver* driver, const GoogleString& url);
00072
00073 virtual ~AjaxRewriteContext();
00074
00076 virtual void RewriteSingle(const ResourcePtr& input,
00077 const OutputResourcePtr& output);
00079 virtual const char* id() const { return RewriteOptions::kAjaxRewriteId; }
00081 virtual OutputResourceKind kind() const { return kRewrittenResource; }
00083 virtual bool DecodeFetchUrls(const OutputResourcePtr& output_resource,
00084 MessageHandler* message_handler,
00085 GoogleUrlStarVector* url_vector);
00087 virtual void StartFetchReconstruction();
00089 virtual GoogleString CacheKeySuffix() const;
00090
00091 private:
00092 friend class RecordingFetch;
00094 virtual void Harvest();
00095 void StartFetchReconstructionParent();
00097 virtual void FixFetchFallbackHeaders(ResponseHeaders* headers);
00099 virtual void FetchTryFallback(const GoogleString& url,
00100 const StringPiece& hash);
00102 virtual void FetchCallbackDone(bool success);
00103
00104 RewriteFilter* GetRewriteFilter(const ContentType& type);
00105
00107 void UpdateDateAndExpiry(const protobuf::RepeatedPtrField<InputInfo>& inputs,
00108 int64* date_ms, int64* expiry_ms);
00109
00110 RewriteDriver* driver_;
00111 GoogleString url_;
00113 bool is_rewritten_;
00116 GoogleString rewritten_hash_;
00117
00119 const GoogleString etag_prefix_;
00120
00121 scoped_ptr<UrlAsyncFetcher> cache_fetcher_;
00122
00123 DISALLOW_COPY_AND_ASSIGN(AjaxRewriteContext);
00124 };
00125
00128 class RecordingFetch : public SharedAsyncFetch {
00129 public:
00130 RecordingFetch(AsyncFetch* async_fetch,
00131 const ResourcePtr& resource,
00132 AjaxRewriteContext* context,
00133 MessageHandler* handler);
00134
00135 virtual ~RecordingFetch();
00136
00138 virtual void HandleHeadersComplete();
00140 virtual bool HandleWrite(const StringPiece& content, MessageHandler* handler);
00142 virtual bool HandleFlush(MessageHandler* handler);
00144 virtual void HandleDone(bool success);
00145
00146 private:
00147 void FreeDriver();
00148
00149 bool CanAjaxRewrite();
00150
00151 MessageHandler* handler_;
00152 ResourcePtr resource_;
00153 AjaxRewriteContext* context_;
00154 bool can_ajax_rewrite_;
00155
00156 HTTPValue cache_value_;
00157 HTTPValueWriter cache_value_writer_;
00158
00159 DISALLOW_COPY_AND_ASSIGN(RecordingFetch);
00160 };
00161
00162 }
00163
00164 #endif ///< NET_INSTAWEB_REWRITER_PUBLIC_AJAX_REWRITE_CONTEXT_H_