blob: 2f68ca7ee60efb3222827735a2a1ea8c891dff4a [file] [log] [blame]
/*
* Copyright 2012 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
// Author: mmohabey@google.com (Megha Mohabey)
#ifndef PAGESPEED_AUTOMATIC_FLUSH_EARLY_FLOW_H_
#define PAGESPEED_AUTOMATIC_FLUSH_EARLY_FLOW_H_
#include "pagespeed/kernel/base/basictypes.h"
#include "pagespeed/kernel/base/string.h"
#include "pagespeed/kernel/base/string_util.h"
#include "pagespeed/kernel/base/string_writer.h"
namespace net_instaweb {
class AsyncFetch;
class FlushEarlyInfo;
class Histogram;
class MessageHandler;
class ProxyFetchPropertyCallbackCollector;
class ProxyFetchFactory;
class ServerContext;
class RewriteDriver;
class Statistics;
class TimedVariable;
// FlushEarlyFlow manages the flow for the rewriters which flush a response to
// the client before receiving a response from the origin server. If a request
// can be responded to early, then FlushEarlyFlow is initiated. It also has
// helper functions to update the property cache with the response headers which
// are used when a request is responded to early.
class FlushEarlyFlow {
public:
static const char kNumRequestsFlushedEarly[];
static const char kNumResourcesFlushedEarly[];
static const char kFlushEarlyRewriteLatencyMs[];
static const char kNumFlushEarlyHttpStatusCodeDeemedUnstable[];
static const char kNumFlushEarlyRequestsRedirected[];
static const char kRedirectPageJs[];
static void TryStart(
const GoogleString& url,
AsyncFetch** base_fetch,
RewriteDriver* driver,
ProxyFetchFactory* factory,
ProxyFetchPropertyCallbackCollector* property_callback);
static void InitStats(Statistics* stats);
virtual ~FlushEarlyFlow();
private:
class FlushEarlyAsyncFetch;
// Flushes some response for this request before receiving the fetch response
// from the origin server.
void FlushEarly();
// Cancels the flush early flow.
void Cancel();
FlushEarlyFlow(const GoogleString& url,
AsyncFetch* base_fetch,
FlushEarlyAsyncFetch* flush_early_fetch,
RewriteDriver* driver,
ProxyFetchFactory* factory,
ProxyFetchPropertyCallbackCollector* property_cache_callback);
// Generates response headers from previous values stored in property cache.
void GenerateResponseHeaders(const FlushEarlyInfo& flush_early_info);
// Callback that is invoked after we rewrite the early head.
// start_time_ms indicates the time we started rewriting the flush early
// head. This is set to -1 if is_experimental_hit is false.
void FlushEarlyRewriteDone(int64 start_time_ms,
RewriteDriver* flush_early_driver);
void Write(const StringPiece& val);
GoogleString url_;
GoogleString dummy_head_;
StringWriter dummy_head_writer_;
int num_resources_flushed_;
int num_rewritten_resources_;
int64 average_fetch_time_;
AsyncFetch* base_fetch_;
FlushEarlyAsyncFetch* flush_early_fetch_;
RewriteDriver* driver_;
ProxyFetchFactory* factory_;
ServerContext* server_context_;
ProxyFetchPropertyCallbackCollector* property_cache_callback_;
bool should_flush_early_lazyload_script_;
MessageHandler* handler_;
bool is_mobile_user_agent_;
TimedVariable* num_requests_flushed_early_;
TimedVariable* num_resources_flushed_early_;
TimedVariable* num_flush_early_http_status_code_deemed_unstable_;
Histogram* flush_early_rewrite_latency_ms_;
DISALLOW_COPY_AND_ASSIGN(FlushEarlyFlow);
};
} // namespace net_instaweb
#endif // PAGESPEED_AUTOMATIC_FLUSH_EARLY_FLOW_H_