blob: db1ecb9d7762a83d938873344b2488510dc01c96 [file] [log] [blame]
// Copyright 2014 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "buffet/http_request.h"
#include "buffet/http_transport_curl.h"
#include "buffet/mime_utils.h"
using namespace chromeos;
using namespace chromeos::http;
// request_type
const char request_type::kOptions[] = "OPTIONS";
const char request_type::kGet[] = "GET";
const char request_type::kHead[] = "HEAD";
const char request_type::kPost[] = "POST";
const char request_type::kPut[] = "PUT";
const char request_type::kPatch[] = "PATCH";
const char request_type::kDelete[] = "DELETE";
const char request_type::kTrace[] = "TRACE";
const char request_type::kConnect[] = "CONNECT";
const char request_type::kCopy[] = "COPY";
const char request_type::kMove[] = "MOVE";
// request_header
const char request_header::kAccept[] = "Accept";
const char request_header::kAcceptCharset[] = "Accept-Charset";
const char request_header::kAcceptEncoding[] = "Accept-Encoding";
const char request_header::kAcceptLanguage[] = "Accept-Language";
const char request_header::kAllow[] = "Allow";
const char request_header::kAuthorization[] = "Authorization";
const char request_header::kCacheControl[] = "Cache-Control";
const char request_header::kConnection[] = "Connection";
const char request_header::kContentEncoding[] = "Content-Encoding";
const char request_header::kContentLanguage[] = "Content-Language";
const char request_header::kContentLength[] = "Content-Length";
const char request_header::kContentLocation[] = "Content-Location";
const char request_header::kContentMd5[] = "Content-MD5";
const char request_header::kContentRange[] = "Content-Range";
const char request_header::kContentType[] = "Content-Type";
const char request_header::kCookie[] = "Cookie";
const char request_header::kDate[] = "Date";
const char request_header::kExpect[] = "Expect";
const char request_header::kExpires[] = "Expires";
const char request_header::kFrom[] = "From";
const char request_header::kHost[] = "Host";
const char request_header::kIfMatch[] = "If-Match";
const char request_header::kIfModifiedSince[] = "If-Modified-Since";
const char request_header::kIfNoneMatch[] = "If-None-Match";
const char request_header::kIfRange[] = "If-Range";
const char request_header::kIfUnmodifiedSince[] = "If-Unmodified-Since";
const char request_header::kLastModified[] = "Last-Modified";
const char request_header::kMaxForwards[] = "Max-Forwards";
const char request_header::kPragma[] = "Pragma";
const char request_header::kProxyAuthorization[] = "Proxy-Authorization";
const char request_header::kRange[] = "Range";
const char request_header::kReferer[] = "Referer";
const char request_header::kTE[] = "TE";
const char request_header::kTrailer[] = "Trailer";
const char request_header::kTransferEncoding[] = "Transfer-Encoding";
const char request_header::kUpgrade[] = "Upgrade";
const char request_header::kUserAgent[] = "User-Agent";
const char request_header::kVia[] = "Via";
const char request_header::kWarning[] = "Warning";
// response_header
const char response_header::kAcceptRanges[] = "Accept-Ranges";
const char response_header::kAge[] = "Age";
const char response_header::kAllow[] = "Allow";
const char response_header::kCacheControl[] = "Cache-Control";
const char response_header::kConnection[] = "Connection";
const char response_header::kContentEncoding[] = "Content-Encoding";
const char response_header::kContentLanguage[] = "Content-Language";
const char response_header::kContentLength[] = "Content-Length";
const char response_header::kContentLocation[] = "Content-Location";
const char response_header::kContentMd5[] = "Content-MD5";
const char response_header::kContentRange[] = "Content-Range";
const char response_header::kContentType[] = "Content-Type";
const char response_header::kDate[] = "Date";
const char response_header::kETag[] = "ETag";
const char response_header::kExpires[] = "Expires";
const char response_header::kLastModified[] = "Last-Modified";
const char response_header::kLocation[] = "Location";
const char response_header::kPragma[] = "Pragma";
const char response_header::kProxyAuthenticate[] = "Proxy-Authenticate";
const char response_header::kRetryAfter[] = "Retry-After";
const char response_header::kServer[] = "Server";
const char response_header::kSetCookie[] = "Set-Cookie";
const char response_header::kTrailer[] = "Trailer";
const char response_header::kTransferEncoding[] = "Transfer-Encoding";
const char response_header::kUpgrade[] = "Upgrade";
const char response_header::kVary[] = "Vary";
const char response_header::kVia[] = "Via";
const char response_header::kWarning[] = "Warning";
const char response_header::kWwwAuthenticate[] = "WWW-Authenticate";
//**************************************************************************
//********************** Request Class **********************
//**************************************************************************
Request::Request(const std::string& url, const char* method) :
transport_(new curl::Transport(url, method)) {
}
Request::Request(const std::string& url) :
transport_(new curl::Transport(url, nullptr)) {
}
Request::Request(std::shared_ptr<TransportInterface> transport) :
transport_(transport) {
}
void Request::AddRange(int64_t bytes) {
if (transport_)
transport_->AddRange(bytes);
}
void Request::AddRange(uint64_t from_byte, uint64_t to_byte) {
if (transport_)
transport_->AddRange(from_byte, to_byte);
}
std::unique_ptr<Response> Request::GetResponse() {
if (transport_) {
if (transport_->GetStage() == TransportInterface::Stage::initialized) {
if(transport_->Perform())
return std::unique_ptr<Response>(new Response(transport_));
} else if (transport_->GetStage() ==
TransportInterface::Stage::response_received) {
return std::unique_ptr<Response>(new Response(transport_));
}
}
return std::unique_ptr<Response>();
}
void Request::SetAccept(const char* accept_mime_types) {
if (transport_)
transport_->SetAccept(accept_mime_types);
}
std::string Request::GetAccept() const {
return transport_ ? transport_->GetAccept() : std::string();
}
std::string Request::GetRequestURL() const {
return transport_ ? transport_->GetRequestURL() : std::string();
}
void Request::SetContentType(const char* contentType) {
if (transport_)
transport_->SetContentType(contentType);
}
std::string Request::GetContentType() const {
return transport_ ? transport_->GetContentType() : std::string();
}
void Request::AddHeader(const char* header, const char* value) {
if (transport_)
transport_->AddHeader(header, value);
}
void Request::AddHeaders(const HeaderList& headers) {
for (auto&& pair : headers)
AddHeader(pair.first.c_str(), pair.second.c_str());
}
bool Request::AddRequestBody(const void* data, size_t size) {
return transport_ && transport_->AddRequestBody(data, size);
}
void Request::SetMethod(const char* method) {
if (transport_)
transport_->SetMethod(method);
}
std::string Request::GetMethod() const {
return transport_ ? transport_->GetMethod() : std::string();
}
void Request::SetReferer(const char* referer) {
if (transport_)
transport_->SetReferer(referer);
}
std::string Request::GetReferer() const {
return transport_ ? transport_->GetReferer() : std::string();
}
void Request::SetUserAgent(const char* user_agent) {
if (transport_)
transport_->SetUserAgent(user_agent);
}
std::string Request::GetUserAgent() const {
return transport_ ? transport_->GetUserAgent() : std::string();
}
std::string Request::GetErrorMessage() const {
if (transport_ &&
transport_->GetStage() == TransportInterface::Stage::failed) {
return transport_->GetErrorMessage();
}
return std::string();
}
//**************************************************************************
//********************** Response Class **********************
//**************************************************************************
Response::Response(std::shared_ptr<TransportInterface> transport) :
transport_(transport) {
}
bool Response::IsSuccessful() const {
if (transport_ &&
transport_->GetStage() == TransportInterface::Stage::response_received) {
int code = GetStatusCode();
return code >= status_code::Continue && code < status_code::BadRequest;
}
return false;
}
int Response::GetStatusCode() const {
if (!transport_)
return -1;
return transport_->GetResponseStatusCode();
}
std::string Response::GetStatusText() const {
if (!transport_)
return std::string();
return transport_->GetResponseStatusText();
}
std::string Response::GetContentType() const {
return GetHeader(response_header::kContentType);
}
std::vector<unsigned char> Response::GetData() const {
if (transport_)
return transport_->GetResponseData();
return std::vector<unsigned char>();
}
std::string Response::GetDataAsString() const {
if (transport_) {
auto data = transport_->GetResponseData();
const char* data_buf = reinterpret_cast<const char*>(data.data());
return std::string(data_buf, data_buf + data.size());
}
return std::string();
}
std::string Response::GetHeader(const char* header_name) const {
if (transport_)
return transport_->GetResponseHeader(header_name);
return std::string();
}