/*
 * Copyright 2010 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: pradnya@google.com (Pradnya Karbhari)

// Header file that includes global constants to be used in net/instaweb.

#ifndef NET_INSTAWEB_PUBLIC_GLOBAL_CONSTANTS_H_
#define NET_INSTAWEB_PUBLIC_GLOBAL_CONSTANTS_H_

namespace {

// Time of day used in Chromium when running javascript in deterministic mode
// (with flag --no-js-randomness). We use the same time of day for slurping,
// validation and measurement in order to maintain consistency.
static const double kChromiumTimeOfDay = 1204251968254LL;

const char kModPagespeedHeader[] = "X-Mod-Pagespeed";
const char kPageSpeedHeader[] = "X-Page-Speed";

// String added to all subrequests (with version string).
const char kModPagespeedSubrequestUserAgent[] = "mod_pagespeed";

const char kWPTUserAgentIdentifier[] = "PTST";

// The name of the header used to specify the rewriters that were
// applied to the current request.
const char kPsaRewriterHeader[] = "X-PSA-Rewriter";

// The name of the header that pubilshers can use to send the time when the
// cacheable content on the page was last modified.  This is used by
// prioritize_visible_content filter to invalidate its cache.
const char kPsaLastModified[] = "X-PSA-Last-Modified";

// Header whose existence indicates that this is a purge request to
// and external/internal caching layer and hence should not be
// allowed to initiate yet another purge request (which could result in
// an infinite loop).
const char kPsaPurgeRequest[] = "X-PSA-Purge-Request";

// Header used to specify a comma-separated list of optimization-related
// capabilities which are to be supported in the response. For e.g. "ii"
// could mean image inlining is supported. These are used by the
// downstream caching layer to communicate to the pagespeed server,
// the optimizations/capabilties that are going to be factored into
// the cache's fragmentation logic.
const char kPsaCapabilityList[] = "PS-CapabilityList";

// Header used to indicate that this page should be instrumented for beaconing
// back information for critical css or image filters. When
// beacon-dependent-optimizations and downstream caching are both enabled on a
// server, the caching layer should be configured to send a certain percentage
// of the traffic to the backend server with this header specified, so that
// beacon data can be obtained.
const char kPsaShouldBeacon[] = "PS-ShouldBeacon";

// Noscript element that redirects to PageSpeed=noscript.  This is applied
// when a filter that inserts custom javascript is enabled.
const char kNoScriptRedirectFormatter[] =
    "<noscript><meta HTTP-EQUIV=\"refresh\" content=\"0;url='%s'\" />"
    "<style><!--table,div,span,font,p{display:none} --></style>"
    "<div style=\"display:block\">Please click <a href=\"%s\">here</a> "
    "if you are not redirected within a few seconds.</div></noscript>";

// Link tag to be inserted on noscript redirect so that original URL is
// considered canonical.
const char kLinkRelCanonicalFormatter[] =
    "<link rel=\"canonical\" href=\"%s\"/>";

}  // namespace

#endif  // NET_INSTAWEB_PUBLIC_GLOBAL_CONSTANTS_H_
