//
// Copyright (C) 2009 The Android Open Source Project
//
// 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.
//

// This file contains general definitions used in implementing, testing and
// emulating communication over HTTP.

#ifndef UPDATE_ENGINE_COMMON_HTTP_COMMON_H_
#define UPDATE_ENGINE_COMMON_HTTP_COMMON_H_

namespace chromeos_update_engine {

// Enumeration type for HTTP response codes.
enum HttpResponseCode {
  kHttpResponseUndefined           = 0,
  kHttpResponseOk                  = 200,
  kHttpResponseCreated             = 201,
  kHttpResponseAccepted            = 202,
  kHttpResponseNonAuthInfo         = 203,
  kHttpResponseNoContent           = 204,
  kHttpResponseResetContent        = 205,
  kHttpResponsePartialContent      = 206,
  kHttpResponseMultipleChoices     = 300,
  kHttpResponseMovedPermanently    = 301,
  kHttpResponseFound               = 302,
  kHttpResponseSeeOther            = 303,
  kHttpResponseNotModified         = 304,
  kHttpResponseUseProxy            = 305,
  kHttpResponseTempRedirect        = 307,
  kHttpResponseBadRequest          = 400,
  kHttpResponseUnauth              = 401,
  kHttpResponseForbidden           = 403,
  kHttpResponseNotFound            = 404,
  kHttpResponseRequestTimeout      = 408,
  kHttpResponseReqRangeNotSat      = 416,
  kHttpResponseInternalServerError = 500,
  kHttpResponseNotImplemented      = 501,
  kHttpResponseServiceUnavailable  = 503,
  kHttpResponseVersionNotSupported = 505,
};

// Returns a standard HTTP status line string for a given response code.
const char *GetHttpResponseDescription(HttpResponseCode code);

// Converts a string beginning with an HTTP error code into numerical value.
HttpResponseCode StringToHttpResponseCode(const char *s);


// Enumeration type for HTTP Content-Type.
enum HttpContentType {
  kHttpContentTypeUnspecified = 0,
  kHttpContentTypeTextXml,
};

// Returns a standard HTTP Content-Type string.
const char *GetHttpContentTypeString(HttpContentType type);

}  // namespace chromeos_update_engine

#endif  // UPDATE_ENGINE_COMMON_HTTP_COMMON_H_
