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