1aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo//
2aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// Copyright (C) 2009 The Android Open Source Project
3aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo//
4aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// Licensed under the Apache License, Version 2.0 (the "License");
5aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// you may not use this file except in compliance with the License.
6aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// You may obtain a copy of the License at
7aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo//
8aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo//      http://www.apache.org/licenses/LICENSE-2.0
9aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo//
10aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// Unless required by applicable law or agreed to in writing, software
11aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// distributed under the License is distributed on an "AS IS" BASIS,
12aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// See the License for the specific language governing permissions and
14aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// limitations under the License.
15aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo//
169bedeb51f80c9547269eef6c2ec09596033bb818Gilad Arnold
179bedeb51f80c9547269eef6c2ec09596033bb818Gilad Arnold// Implementation of common HTTP related functions.
189bedeb51f80c9547269eef6c2ec09596033bb818Gilad Arnold
1939910dcd1d68987ccee7c3031dc269233a8490bbAlex Deymo#include "update_engine/common/http_common.h"
209bedeb51f80c9547269eef6c2ec09596033bb818Gilad Arnold
2180f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo#include <cstdlib>
2280f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo
2305735a1879a553153458aae0a25fa5d42e3e408fBen Chan#include <base/macros.h>
242447c67957a652cbece2e73fd295dc975571d67fAlex Deymo
252447c67957a652cbece2e73fd295dc975571d67fAlex Deymonamespace chromeos_update_engine {
269bedeb51f80c9547269eef6c2ec09596033bb818Gilad Arnold
279bedeb51f80c9547269eef6c2ec09596033bb818Gilad Arnoldconst char *GetHttpResponseDescription(HttpResponseCode code) {
289bedeb51f80c9547269eef6c2ec09596033bb818Gilad Arnold  static const struct {
299bedeb51f80c9547269eef6c2ec09596033bb818Gilad Arnold    HttpResponseCode code;
309bedeb51f80c9547269eef6c2ec09596033bb818Gilad Arnold    const char* description;
319bedeb51f80c9547269eef6c2ec09596033bb818Gilad Arnold  } http_response_table[] = {
329bedeb51f80c9547269eef6c2ec09596033bb818Gilad Arnold    { kHttpResponseOk,                  "OK" },
339bedeb51f80c9547269eef6c2ec09596033bb818Gilad Arnold    { kHttpResponseCreated,             "Created" },
349bedeb51f80c9547269eef6c2ec09596033bb818Gilad Arnold    { kHttpResponseAccepted,            "Accepted" },
359bedeb51f80c9547269eef6c2ec09596033bb818Gilad Arnold    { kHttpResponseNonAuthInfo,         "Non-Authoritative Information" },
369bedeb51f80c9547269eef6c2ec09596033bb818Gilad Arnold    { kHttpResponseNoContent,           "No Content" },
379bedeb51f80c9547269eef6c2ec09596033bb818Gilad Arnold    { kHttpResponseResetContent,        "Reset Content" },
389bedeb51f80c9547269eef6c2ec09596033bb818Gilad Arnold    { kHttpResponsePartialContent,      "Partial Content" },
399bedeb51f80c9547269eef6c2ec09596033bb818Gilad Arnold    { kHttpResponseMultipleChoices,     "Multiple Choices" },
409bedeb51f80c9547269eef6c2ec09596033bb818Gilad Arnold    { kHttpResponseMovedPermanently,    "Moved Permanently" },
419bedeb51f80c9547269eef6c2ec09596033bb818Gilad Arnold    { kHttpResponseFound,               "Found" },
429bedeb51f80c9547269eef6c2ec09596033bb818Gilad Arnold    { kHttpResponseSeeOther,            "See Other" },
439bedeb51f80c9547269eef6c2ec09596033bb818Gilad Arnold    { kHttpResponseNotModified,         "Not Modified" },
449bedeb51f80c9547269eef6c2ec09596033bb818Gilad Arnold    { kHttpResponseUseProxy,            "Use Proxy" },
459bedeb51f80c9547269eef6c2ec09596033bb818Gilad Arnold    { kHttpResponseTempRedirect,        "Temporary Redirect" },
469bedeb51f80c9547269eef6c2ec09596033bb818Gilad Arnold    { kHttpResponseBadRequest,          "Bad Request" },
479bedeb51f80c9547269eef6c2ec09596033bb818Gilad Arnold    { kHttpResponseUnauth,              "Unauthorized" },
489bedeb51f80c9547269eef6c2ec09596033bb818Gilad Arnold    { kHttpResponseForbidden,           "Forbidden" },
499bedeb51f80c9547269eef6c2ec09596033bb818Gilad Arnold    { kHttpResponseNotFound,            "Not Found" },
509bedeb51f80c9547269eef6c2ec09596033bb818Gilad Arnold    { kHttpResponseRequestTimeout,      "Request Timeout" },
519bedeb51f80c9547269eef6c2ec09596033bb818Gilad Arnold    { kHttpResponseInternalServerError, "Internal Server Error" },
529bedeb51f80c9547269eef6c2ec09596033bb818Gilad Arnold    { kHttpResponseNotImplemented,      "Not Implemented" },
539bedeb51f80c9547269eef6c2ec09596033bb818Gilad Arnold    { kHttpResponseServiceUnavailable,  "Service Unavailable" },
549bedeb51f80c9547269eef6c2ec09596033bb818Gilad Arnold    { kHttpResponseVersionNotSupported, "HTTP Version Not Supported" },
559bedeb51f80c9547269eef6c2ec09596033bb818Gilad Arnold  };
569bedeb51f80c9547269eef6c2ec09596033bb818Gilad Arnold
579bedeb51f80c9547269eef6c2ec09596033bb818Gilad Arnold  bool is_found = false;
589bedeb51f80c9547269eef6c2ec09596033bb818Gilad Arnold  size_t i;
599c155d2110381fbf7d8e4b8f840bf54c3008fe0cAlex Vakulenko  for (i = 0; i < arraysize(http_response_table); i++)
609bedeb51f80c9547269eef6c2ec09596033bb818Gilad Arnold    if ((is_found = (http_response_table[i].code == code)))
619bedeb51f80c9547269eef6c2ec09596033bb818Gilad Arnold      break;
629bedeb51f80c9547269eef6c2ec09596033bb818Gilad Arnold
639bedeb51f80c9547269eef6c2ec09596033bb818Gilad Arnold  return (is_found ? http_response_table[i].description : "(unsupported)");
649bedeb51f80c9547269eef6c2ec09596033bb818Gilad Arnold}
659bedeb51f80c9547269eef6c2ec09596033bb818Gilad Arnold
669bedeb51f80c9547269eef6c2ec09596033bb818Gilad ArnoldHttpResponseCode StringToHttpResponseCode(const char *s) {
6788b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko  return static_cast<HttpResponseCode>(strtoul(s, nullptr, 10));
689bedeb51f80c9547269eef6c2ec09596033bb818Gilad Arnold}
699dd1e7c6bbc605c2150800f763c596ff0a4ad1c1Gilad Arnold
709dd1e7c6bbc605c2150800f763c596ff0a4ad1c1Gilad Arnold
719dd1e7c6bbc605c2150800f763c596ff0a4ad1c1Gilad Arnoldconst char *GetHttpContentTypeString(HttpContentType type) {
729dd1e7c6bbc605c2150800f763c596ff0a4ad1c1Gilad Arnold  static const struct {
739dd1e7c6bbc605c2150800f763c596ff0a4ad1c1Gilad Arnold    HttpContentType type;
749dd1e7c6bbc605c2150800f763c596ff0a4ad1c1Gilad Arnold    const char* str;
759dd1e7c6bbc605c2150800f763c596ff0a4ad1c1Gilad Arnold  } http_content_type_table[] = {
769dd1e7c6bbc605c2150800f763c596ff0a4ad1c1Gilad Arnold    { kHttpContentTypeTextXml, "text/xml" },
779dd1e7c6bbc605c2150800f763c596ff0a4ad1c1Gilad Arnold  };
789dd1e7c6bbc605c2150800f763c596ff0a4ad1c1Gilad Arnold
799dd1e7c6bbc605c2150800f763c596ff0a4ad1c1Gilad Arnold  bool is_found = false;
809dd1e7c6bbc605c2150800f763c596ff0a4ad1c1Gilad Arnold  size_t i;
819c155d2110381fbf7d8e4b8f840bf54c3008fe0cAlex Vakulenko  for (i = 0; i < arraysize(http_content_type_table); i++)
829dd1e7c6bbc605c2150800f763c596ff0a4ad1c1Gilad Arnold    if ((is_found = (http_content_type_table[i].type == type)))
839dd1e7c6bbc605c2150800f763c596ff0a4ad1c1Gilad Arnold      break;
849dd1e7c6bbc605c2150800f763c596ff0a4ad1c1Gilad Arnold
8588b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko  return (is_found ? http_content_type_table[i].str : nullptr);
869dd1e7c6bbc605c2150800f763c596ff0a4ad1c1Gilad Arnold}
872447c67957a652cbece2e73fd295dc975571d67fAlex Deymo
88d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko}  // namespace chromeos_update_engine
89