blob: 5d824732102cdab49e0928ba231f9113d6394188 [file] [log] [blame]
Chris Sosa45d9f102014-03-24 11:18:54 -07001// Copyright 2014 The Chromium OS Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "buffet/http_request.h"
6
7#include "buffet/http_transport_curl.h"
8#include "buffet/mime_utils.h"
9
10using namespace chromeos;
11using namespace chromeos::http;
12
13// request_type
14const char request_type::kOptions[] = "OPTIONS";
15const char request_type::kGet[] = "GET";
16const char request_type::kHead[] = "HEAD";
17const char request_type::kPost[] = "POST";
18const char request_type::kPut[] = "PUT";
19const char request_type::kPatch[] = "PATCH";
20const char request_type::kDelete[] = "DELETE";
21const char request_type::kTrace[] = "TRACE";
22const char request_type::kConnect[] = "CONNECT";
23const char request_type::kCopy[] = "COPY";
24const char request_type::kMove[] = "MOVE";
25
26// request_header
27const char request_header::kAccept[] = "Accept";
28const char request_header::kAcceptCharset[] = "Accept-Charset";
29const char request_header::kAcceptEncoding[] = "Accept-Encoding";
30const char request_header::kAcceptLanguage[] = "Accept-Language";
31const char request_header::kAllow[] = "Allow";
32const char request_header::kAuthorization[] = "Authorization";
33const char request_header::kCacheControl[] = "Cache-Control";
34const char request_header::kConnection[] = "Connection";
35const char request_header::kContentEncoding[] = "Content-Encoding";
36const char request_header::kContentLanguage[] = "Content-Language";
37const char request_header::kContentLength[] = "Content-Length";
38const char request_header::kContentLocation[] = "Content-Location";
39const char request_header::kContentMd5[] = "Content-MD5";
40const char request_header::kContentRange[] = "Content-Range";
41const char request_header::kContentType[] = "Content-Type";
42const char request_header::kCookie[] = "Cookie";
43const char request_header::kDate[] = "Date";
44const char request_header::kExpect[] = "Expect";
45const char request_header::kExpires[] = "Expires";
46const char request_header::kFrom[] = "From";
47const char request_header::kHost[] = "Host";
48const char request_header::kIfMatch[] = "If-Match";
49const char request_header::kIfModifiedSince[] = "If-Modified-Since";
50const char request_header::kIfNoneMatch[] = "If-None-Match";
51const char request_header::kIfRange[] = "If-Range";
52const char request_header::kIfUnmodifiedSince[] = "If-Unmodified-Since";
53const char request_header::kLastModified[] = "Last-Modified";
54const char request_header::kMaxForwards[] = "Max-Forwards";
55const char request_header::kPragma[] = "Pragma";
56const char request_header::kProxyAuthorization[] = "Proxy-Authorization";
57const char request_header::kRange[] = "Range";
58const char request_header::kReferer[] = "Referer";
59const char request_header::kTE[] = "TE";
60const char request_header::kTrailer[] = "Trailer";
61const char request_header::kTransferEncoding[] = "Transfer-Encoding";
62const char request_header::kUpgrade[] = "Upgrade";
63const char request_header::kUserAgent[] = "User-Agent";
64const char request_header::kVia[] = "Via";
65const char request_header::kWarning[] = "Warning";
66
67// response_header
68const char response_header::kAcceptRanges[] = "Accept-Ranges";
69const char response_header::kAge[] = "Age";
70const char response_header::kAllow[] = "Allow";
71const char response_header::kCacheControl[] = "Cache-Control";
72const char response_header::kConnection[] = "Connection";
73const char response_header::kContentEncoding[] = "Content-Encoding";
74const char response_header::kContentLanguage[] = "Content-Language";
75const char response_header::kContentLength[] = "Content-Length";
76const char response_header::kContentLocation[] = "Content-Location";
77const char response_header::kContentMd5[] = "Content-MD5";
78const char response_header::kContentRange[] = "Content-Range";
79const char response_header::kContentType[] = "Content-Type";
80const char response_header::kDate[] = "Date";
81const char response_header::kETag[] = "ETag";
82const char response_header::kExpires[] = "Expires";
83const char response_header::kLastModified[] = "Last-Modified";
84const char response_header::kLocation[] = "Location";
85const char response_header::kPragma[] = "Pragma";
86const char response_header::kProxyAuthenticate[] = "Proxy-Authenticate";
87const char response_header::kRetryAfter[] = "Retry-After";
88const char response_header::kServer[] = "Server";
89const char response_header::kSetCookie[] = "Set-Cookie";
90const char response_header::kTrailer[] = "Trailer";
91const char response_header::kTransferEncoding[] = "Transfer-Encoding";
92const char response_header::kUpgrade[] = "Upgrade";
93const char response_header::kVary[] = "Vary";
94const char response_header::kVia[] = "Via";
95const char response_header::kWarning[] = "Warning";
96const char response_header::kWwwAuthenticate[] = "WWW-Authenticate";
97
98//**************************************************************************
99//********************** Request Class **********************
100//**************************************************************************
101Request::Request(std::string const& url, char const* method) :
102 transport_(new curl::Transport(url, method)) {
103}
104
105Request::Request(std::string const& url) :
106 transport_(new curl::Transport(url, nullptr)) {
107}
108
109Request::Request(std::shared_ptr<TransportInterface> transport) :
110 transport_(transport) {
111}
112
113void Request::AddRange(int64_t bytes) {
114 if (transport_)
115 transport_->AddRange(bytes);
116}
117
118void Request::AddRange(uint64_t from_byte, uint64_t to_byte) {
119 if (transport_)
120 transport_->AddRange(from_byte, to_byte);
121}
122
123std::unique_ptr<Response> Request::GetResponse() {
124 if (transport_) {
125 if (transport_->GetStage() == TransportInterface::Stage::initialized) {
126 if(transport_->Perform())
127 return std::unique_ptr<Response>(new Response(transport_));
128 } else if (transport_->GetStage() ==
129 TransportInterface::Stage::response_received) {
130 return std::unique_ptr<Response>(new Response(transport_));
131 }
132 }
133 return std::unique_ptr<Response>();
134}
135
136void Request::SetAccept(char const* accept_mime_types) {
137 if (transport_)
138 transport_->SetAccept(accept_mime_types);
139}
140
141std::string Request::GetAccept() const {
142 return transport_ ? transport_->GetAccept() : std::string();
143}
144
145std::string Request::GetRequestURL() const {
146 return transport_ ? transport_->GetRequestURL() : std::string();
147}
148
149void Request::SetContentType(char const* contentType) {
150 if (transport_)
151 transport_->SetContentType(contentType);
152}
153
154std::string Request::GetContentType() const {
155 return transport_ ? transport_->GetContentType() : std::string();
156}
157
158void Request::AddHeader(char const* header, char const* value) {
159 if (transport_)
160 transport_->AddHeader(header, value);
161}
162
163bool Request::AddRequestBody(void const* data, size_t size) {
164 return transport_ && transport_->AddRequestBody(data, size);
165}
166
167void Request::SetMethod(char const* method) {
168 if (transport_)
169 transport_->SetMethod(method);
170}
171
172std::string Request::GetMethod() const {
173 return transport_ ? transport_->GetMethod() : std::string();
174}
175
176void Request::SetReferer(char const* referer) {
177 if (transport_)
178 transport_->SetReferer(referer);
179}
180
181std::string Request::GetReferer() const {
182 return transport_ ? transport_->GetReferer() : std::string();
183}
184
185void Request::SetUserAgent(char const* user_agent) {
186 if (transport_)
187 transport_->SetUserAgent(user_agent);
188}
189
190std::string Request::GetUserAgent() const {
191 return transport_ ? transport_->GetUserAgent() : std::string();
192}
193
194std::string Request::GetErrorMessage() const {
195 if (transport_ &&
196 transport_->GetStage() == TransportInterface::Stage::failed) {
197 return transport_->GetErrorMessage();
198 }
199
200 return std::string();
201}
202
203//**************************************************************************
204//********************** Response Class **********************
205//**************************************************************************
206Response::Response(std::shared_ptr<TransportInterface> transport) :
207 transport_(transport) {
208}
209
210bool Response::IsSuccessful() const {
211 if (transport_ &&
212 transport_->GetStage() == TransportInterface::Stage::response_received) {
213 int code = GetStatusCode();
214 return code >= status_code::Continue && code < status_code::BadRequest;
215 }
216 return false;
217}
218
219int Response::GetStatusCode() const {
220 if (!transport_)
221 return -1;
222
223 return transport_->GetResponseStatusCode();
224}
225
226std::string Response::GetStatusText() const {
227 if (!transport_)
228 return std::string();
229
230 return transport_->GetResponseStatusText();
231}
232
233std::string Response::GetContentType() const {
234 return GetHeader(response_header::kContentType);
235}
236
237std::vector<unsigned char> Response::GetData() const {
238 if (transport_)
239 return transport_->GetResponseData();
240
241 return std::vector<unsigned char>();
242}
243
244std::string Response::GetDataAsString() const {
245 if (transport_) {
246 auto data = transport_->GetResponseData();
247 char const* data_buf = reinterpret_cast<char const*>(data.data());
248 return std::string(data_buf, data_buf + data.size());
249 }
250
251 return std::string();
252}
253
254std::string Response::GetHeader(char const* header_name) const {
255 if (transport_)
256 return transport_->GetResponseHeader(header_name);
257
258 return std::string();
259}
260