/*
 * 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: jmarantz@google.com (Joshua Marantz)

#include "pagespeed/kernel/http/http_names.h"


#include "base/logging.h"
#include "pagespeed/kernel/base/string_util.h"

namespace net_instaweb {

const char HttpAttributes::kAccept[] = "Accept";
const char HttpAttributes::kAcceptEncoding[] = "Accept-Encoding";
const char HttpAttributes::kAccessControlAllowOrigin[] =
    "Access-Control-Allow-Origin";
const char HttpAttributes::kAccessControlAllowCredentials[] =
    "Access-Control-Allow-Credentials";
const char HttpAttributes::kAge[] = "Age";
const char HttpAttributes::kAllow[] = "Allow";
const char HttpAttributes::kAttachment[] = "attachment";
const char HttpAttributes::kAuthorization[] = "Authorization";
const char HttpAttributes::kCacheControl[] = "Cache-Control";
const char HttpAttributes::kConnection[] = "Connection";
const char HttpAttributes::kContentDisposition[] = "Content-Disposition";
const char HttpAttributes::kContentEncoding[] = "Content-Encoding";
const char HttpAttributes::kContentLanguage[] = "Content-Language";
const char HttpAttributes::kContentLength[] = "Content-Length";
const char HttpAttributes::kContentType[] = "Content-Type";
const char HttpAttributes::kCookie[] = "Cookie";
const char HttpAttributes::kCookie2[] = "Cookie2";
const char HttpAttributes::kDate[] = "Date";
const char HttpAttributes::kDeflate[] = "deflate";
const char HttpAttributes::kDnt[] = "DNT";
const char HttpAttributes::kEtag[] = "Etag";
const char HttpAttributes::kExpires[] = "Expires";
const char HttpAttributes::kGzip[] = "gzip";
const char HttpAttributes::kHost[] = "Host";
const char HttpAttributes::kIfModifiedSince[] = "If-Modified-Since";
const char HttpAttributes::kIfNoneMatch[] = "If-None-Match";
const char HttpAttributes::kKeepAlive[] = "Keep-Alive";
const char HttpAttributes::kLastModified[] = "Last-Modified";
const char HttpAttributes::kLink[] = "Link";
const char HttpAttributes::kLocation[] = "Location";
const char HttpAttributes::kMaxAge[] = "max-age";
const char HttpAttributes::kNoCache[] = "no-cache";
const char HttpAttributes::kNoCacheMaxAge0[] = "max-age=0, no-cache";
const char HttpAttributes::kNoStore[] = "no-store";
const char HttpAttributes::kNosniff[] = "nosniff";
const char HttpAttributes::kOrigin[] = "Origin";
const char HttpAttributes::kPragma[] = "Pragma";
const char HttpAttributes::kPrivate[] = "private";
const char HttpAttributes::kProxyAuthenticate[] = "Proxy-Authenticate";
const char HttpAttributes::kProxyAuthorization[] = "Proxy-Authorization";
const char HttpAttributes::kPublic[] = "public";
const char HttpAttributes::kPurpose[] = "Purpose";
const char HttpAttributes::kReferer[] = "Referer";  // sic
const char HttpAttributes::kRefresh[] = "Refresh";
const char HttpAttributes::kSaveData[] = "Save-Data";
const char HttpAttributes::kServer[] = "Server";
const char HttpAttributes::kSetCookie2[] = "Set-Cookie2";
const char HttpAttributes::kSetCookie[] = "Set-Cookie";
const char HttpAttributes::kTE[] = "TE";
const char HttpAttributes::kTrailers[] = "Trailers";
const char HttpAttributes::kTransferEncoding[] = "Transfer-Encoding";
const char HttpAttributes::kUpgrade[] = "Upgrade";
const char HttpAttributes::kUserAgent[] = "User-Agent";
const char HttpAttributes::kVary[] = "Vary";
const char HttpAttributes::kVia[] = "Via";
const char HttpAttributes::kWarning[] = "Warning";
const char HttpAttributes::kXAssociatedContent[] = "X-Associated-Content";
const char HttpAttributes::kXContentTypeOptions[] = "X-Content-Type-Options";
const char HttpAttributes::kXForwardedFor[] = "X-Forwarded-For";
const char HttpAttributes::kXForwardedProto[] = "X-Forwarded-Proto";
const char HttpAttributes::kXmlHttpRequest[] = "XMLHttpRequest";
const char HttpAttributes::kXGooglePagespeedClientId[] =
    "X-Google-Pagespeed-Client-Id";
const char HttpAttributes::kXGoogleRequestEventId[] =
    "X-Google-Request-Event-Id";
const char HttpAttributes::kXOriginalContentLength[] =
    "X-Original-Content-Length";
const char HttpAttributes::kXPsaBlockingRewrite[] = "X-PSA-Blocking-Rewrite";
const char HttpAttributes::kXPsaBlockingRewriteMode[] =
    "X-PSA-Blocking-Rewrite-Mode";
const char HttpAttributes::kXPsaBlockingRewriteModeSlow[] = "slow";
// Warning: The header name is subject to change.
const char HttpAttributes::kXPsaClientOptions[] = "X-PSA-Client-Options";
const char HttpAttributes::kXPsaDistributedRewriteBlock[] =
    "X-PSA-Distributed-Rewrite-Block";
const char HttpAttributes::kXPsaDistributedRewriteFetch[] =
    "X-PSA-Distributed-Rewrite-Fetch";
const char HttpAttributes::kXPsaDistributedRewriteForHtml[] =
    "X-PSA-Distributed-Rewrite-Html";
const char HttpAttributes::kXPsaOptimizeForSpdy[] = "X-PSA-Optimize-For-SPDY";
const char HttpAttributes::kXPsaLoadShed[] = "X-Psa-Load-Shed";
const char HttpAttributes::kXPsaRequestMetadata[] =
    "X-PSA-Request-Metadata";
// TODO(jkarlin): Make sure (with tests) that this header does not leak beyond
// pagespeed servers.
const char HttpAttributes::kXPsaResponseMetadata[] =
    "X-PSA-Response-Metadata";
const char HttpAttributes::kXSplit[] = "x_split";
const char HttpAttributes::kXSplitAboveTheFold[] = "atf";
const char HttpAttributes::kXSplitBelowTheFold[] = "btf";
const char HttpAttributes::kXRequestedWith[] = "X-Requested-With";
const char HttpAttributes::kXUACompatible[] = "X-UA-Compatible";
const char HttpAttributes::kXPsaSplitConfig[] = "X-PSA-Split-Config";
const char HttpAttributes::kXSendfile[] = "X-Sendfile";
const char HttpAttributes::kXAccelRedirect[] = "X-Accel-Redirect";

const char* HttpStatus::GetReasonPhrase(HttpStatus::Code rc) {
  switch (rc) {
    case HttpStatus::kContinue                : return "Continue";
    case HttpStatus::kSwitchingProtocols      : return "Switching Protocols";

    case HttpStatus::kOK                      : return "OK";
    case HttpStatus::kCreated                 : return "Created";
    case HttpStatus::kAccepted                : return "Accepted";
    case HttpStatus::kNonAuthoritative        :
      return "Non-Authoritative Information";
    case HttpStatus::kNoContent               : return "No Content";
    case HttpStatus::kResetContent            : return "Reset Content";
    case HttpStatus::kPartialContent          : return "Partial Content";

      // 300 range: redirects
    case HttpStatus::kMultipleChoices         : return "Multiple Choices";
    case HttpStatus::kMovedPermanently        : return "Moved Permanently";
    case HttpStatus::kFound                   : return "Found";
    case HttpStatus::kSeeOther                : return "See Other";
    case HttpStatus::kNotModified             : return "Not Modified";
    case HttpStatus::kUseProxy                : return "Use Proxy";
    case HttpStatus::kTemporaryRedirect       : return "OK";

      // 400 range: client errors
    case HttpStatus::kBadRequest              : return "Bad Request";
    case HttpStatus::kUnauthorized            : return "Unauthorized";
    case HttpStatus::kPaymentRequired         : return "Payment Required";
    case HttpStatus::kForbidden               : return "Forbidden";
    case HttpStatus::kNotFound                : return "Not Found";
    case HttpStatus::kMethodNotAllowed        : return "Method Not Allowed";
    case HttpStatus::kNotAcceptable           : return "Not Acceptable";
    case HttpStatus::kProxyAuthRequired       :
      return "Proxy Authentication Required";
    case HttpStatus::kRequestTimeout          : return "Request Time-out";
    case HttpStatus::kConflict                : return "Conflict";
    case HttpStatus::kGone                    : return "Gone";
    case HttpStatus::kLengthRequired          : return "Length Required";
    case HttpStatus::kPreconditionFailed      : return "Precondition Failed";
    case HttpStatus::kEntityTooLarge          :
      return "Request Entity Too Large";
    case HttpStatus::kUriTooLong              : return "Request-URI Too Large";
    case HttpStatus::kUnsupportedMediaType    : return "Unsupported Media Type";
    case HttpStatus::kRangeNotSatisfiable     :
      return "Requested range not satisfiable";
    case HttpStatus::kExpectationFailed       : return "Expectation Failed";

      // 500 range: server errors
    case HttpStatus::kInternalServerError     : return "Internal Server Error";
    case HttpStatus::kNotImplemented          : return "Not Implemented";
    case HttpStatus::kBadGateway              : return "Bad Gateway";
    case HttpStatus::kUnavailable             : return "Service Unavailable";
    case HttpStatus::kGatewayTimeout          : return "Gateway Time-out";

     // Instaweb proxy failures
    case HttpStatus::kProxyPublisherFailure  : return "Proxy Publisher Failure";
    case HttpStatus::kProxyFailure             : return "Proxy Failure";
    case HttpStatus::kProxyConfigurationFailure: return "Proxy Config Failure";
    case HttpStatus::kProxyDeclinedRequest    : return "Proxy Declined Request";

    default:
      // We don't have a name for this response code, so we'll just
      // take the blame
      return "Internal Server Error";
  }
  return "";
}

StringPieceVector HttpAttributes::SortedHopByHopHeaders() {
  // http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html
  const int kReserveSize = 10;
  int index = 0;
  StringPieceVector names(kReserveSize);

  // This exact mechanism of initializing the names is used because it allows
  // populating a StringPieceVector from locally defined string constants
  // without having runtime calls to strlen to find the length.
  names[index++] = StringPiece(HttpAttributes::kConnection);
  names[index++] = StringPiece(HttpAttributes::kKeepAlive);
  names[index++] = StringPiece(HttpAttributes::kProxyAuthenticate);
  names[index++] = StringPiece(HttpAttributes::kProxyAuthorization);
  names[index++] = StringPiece(HttpAttributes::kSetCookie);
  names[index++] = StringPiece(HttpAttributes::kSetCookie2);
  names[index++] = StringPiece(HttpAttributes::kTE);
  names[index++] = StringPiece(HttpAttributes::kTrailers);
  names[index++] = StringPiece(HttpAttributes::kTransferEncoding);
  names[index++] = StringPiece(HttpAttributes::kUpgrade);
  DCHECK_EQ(kReserveSize, index);
  return names;
}

StringPieceVector HttpAttributes::CachingHeadersToBeRemoved() {
  // http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html
  const int kReserveSize = 3;
  int index = 0;
  StringPieceVector names(kReserveSize);

  // This exact mechanism of initializing the names is used because it allows
  // populating a StringPieceVector from locally defined string constants
  // without having runtime calls to strlen to find the length.
  names[index++] = StringPiece(HttpAttributes::kLastModified);
  names[index++] = StringPiece(HttpAttributes::kExpires);
  names[index++] = StringPiece(HttpAttributes::kEtag);
  DCHECK_EQ(kReserveSize, index);
  return names;
}

}  // namespace net_instaweb
