HttpRequest.h
Go to the documentation of this file.
1 /****
2  * Sming Framework Project - Open Source framework for high efficiency native ESP8266 development.
3  * Created 2015 by Skurydin Alexey
4  * http://github.com/SmingHub/Sming
5  * All files of the Sming Core are provided under the LGPL v3 license.
6  *
7  * HttpRequest.h
8  *
9  * @author: 2017 - Slavey Karadzhov <slav@attachix.com>
10  *
11  ****/
12 
13 #pragma once
14 
15 #include "HttpCommon.h"
16 #ifdef ENABLE_HTTP_REQUEST_AUTH
17 #include "HttpRequestAuth.h"
18 #endif
19 #include "../TcpConnection.h"
21 #include "HttpHeaders.h"
22 #include "HttpParams.h"
23 #include "Data/ObjectMap.h"
24 
25 class HttpConnection;
26 
28 using RequestBodyDelegate = Delegate<int(HttpConnection& client, const char* at, size_t length)>;
29 using RequestCompletedDelegate = Delegate<int(HttpConnection& client, bool successful)>;
30 
37 {
38  friend class HttpClientConnection;
39  friend class HttpServerConnection;
40 
41 public:
43  {
44  }
45 
46  HttpRequest(const Url& uri) : uri(uri)
47  {
48  }
49 
54  HttpRequest(const HttpRequest& value)
55  : uri(value.uri), method(value.method), headers(value.headers), postParams(value.postParams),
58  {
59  }
60 
66  HttpRequest* clone() const
67  {
68  return new HttpRequest(*this);
69  }
70 
72  {
73  reset();
74  }
75 
77  {
78  this->uri = uri;
79  return this;
80  }
81 
83  {
84  this->method = method;
85  return this;
86  }
87 
89  {
90  this->headers.setMultiple(headers);
91  return this;
92  }
93 
94  HttpRequest* setHeader(const String& name, const String& value)
95  {
96  headers[name] = value;
97  return this;
98  }
99 
100  HttpRequest* setPostParameter(const String& name, const String& value)
101  {
102  postParams[name] = value;
103  return this;
104  }
105 
113  HttpRequest* setFile(const String& formElementName, ReadWriteStream* stream)
114  {
115  if(stream != nullptr) {
116  files[formElementName] = stream;
117  }
118  return this;
119  }
120 
121 #ifdef ENABLE_HTTP_REQUEST_AUTH
122  // Authentication adapters set here
124  {
125  adapter->setRequest(this);
126  auth = adapter;
127  return this;
128  }
129 #endif
130 
136  const String& getHeader(const String& name)
137  {
138  return static_cast<const HttpHeaders&>(headers)[name];
139  }
140 
146  const String& getPostParameter(const String& name)
147  {
148  return static_cast<const HttpParams&>(postParams)[name];
149  }
150 
156  String getQueryParameter(const String& name, const String& defaultValue = nullptr) const
157  {
158  return static_cast<const HttpParams&>(uri.Query)[name] ?: defaultValue;
159  }
160 
169  {
170  String s;
171  if(bodyStream != nullptr) {
173  }
174  return s;
175  }
176 
183  {
184  return bodyStream;
185  }
186 
193  HttpRequest* setBody(const String& body)
194  {
195  return setBody(reinterpret_cast<const uint8_t*>(body.c_str()), body.length());
196  }
197 
199  HttpRequest* setBody(String&& body) noexcept;
200 
203 
209  HttpRequest* setBody(const uint8_t* rawData, size_t length);
210 
221 
226  {
227  return responseStream;
228  }
229 
231  {
232  headersCompletedDelegate = delegateFunction;
233  return this;
234  }
235 
237  {
238  requestBodyDelegate = delegateFunction;
239  return this;
240  }
241 
243  {
244  requestCompletedDelegate = delegateFunction;
245  return this;
246  }
247 
249  void reset();
250 
254  using SslInitDelegate = Delegate<void(Ssl::Session& session, HttpRequest& request)>;
255 
261  {
262  sslInitDelegate = delegate;
263  return this;
264  }
265 
270  String toString() const;
271 
278  static String toString(const HttpRequest& req)
279  {
280  return req.toString();
281  }
282 
283 public:
285  HttpMethod method = HTTP_GET;
289 
290  int retries = 0;
291 
292  void* args = nullptr;
293 
294 protected:
299 
302 
303 #ifdef ENABLE_HTTP_REQUEST_AUTH
304  AuthAdapter* auth = nullptr;
305 #endif
306 
307 private:
308  HttpParams* queryParams = nullptr; // << @todo deprecate
309 };
310 
311 inline String toString(const HttpRequest& req)
312 {
313  return req.toString();
314 }
HttpMethod
Strongly-typed enum which shadows http_method from http_parser library.
Definition: HttpCommon.h:42
String toString(const HttpRequest &req)
Definition: HttpRequest.h:311
Definition: HttpRequestAuth.h:20
virtual void setRequest(HttpRequest *request)=0
Definition: HttpClientConnection.h:29
Provides http base used for client and server connections.
Definition: HttpConnection.h:28
HttpResponse response
Definition: HttpConnection.h:189
Encapsulates a set of HTTP header information.
Definition: HttpHeaders.h:35
void setMultiple(const HttpHeaders &headers)
Handles the query portion of a URI.
Definition: HttpParams.h:35
Encapsulates an incoming or outgoing request.
Definition: HttpRequest.h:37
RequestBodyDelegate requestBodyDelegate
Definition: HttpRequest.h:296
const String & getPostParameter(const String &name)
Get POST parameter value.
Definition: HttpRequest.h:146
SslInitDelegate sslInitDelegate
Definition: HttpRequest.h:298
HttpRequest * onHeadersComplete(RequestHeadersCompletedDelegate delegateFunction)
Definition: HttpRequest.h:230
RequestHeadersCompletedDelegate headersCompletedDelegate
Definition: HttpRequest.h:295
static String toString(const HttpRequest &req)
Tries to present a readable version of the request.
Definition: HttpRequest.h:278
HttpRequest * setFile(const String &formElementName, ReadWriteStream *stream)
Sets a file to be sent.
Definition: HttpRequest.h:113
HttpRequest()
Definition: HttpRequest.h:42
HttpFiles files
Attached files.
Definition: HttpRequest.h:288
HttpRequest * clone() const
Clone this request into a new object using the copy constructor.
Definition: HttpRequest.h:66
ReadWriteStream * responseStream
User-requested stream to store response.
Definition: HttpRequest.h:301
int retries
how many times the request should be send again...
Definition: HttpRequest.h:290
HttpRequest * setBody(const uint8_t *rawData, size_t length)
Set body content by copying binary data.
void reset()
Clear buffers and reset to default state in preparation for another request.
HttpRequest * setBody(String &&body) noexcept
Set body from String object using move semantics: body will be invalid on return.
String toString() const
Tries to present a readable version of the current request values.
HttpRequest * setHeaders(const HttpHeaders &headers)
Definition: HttpRequest.h:88
IDataSourceStream * getBodyStream()
Return the current body stream.
Definition: HttpRequest.h:182
HttpRequest * setResponseStream(ReadWriteStream *stream)
Instead of storing the response body we can set a stream that will take care to process it.
HttpRequest(const Url &uri)
Definition: HttpRequest.h:46
HttpRequest * setURL(const Url &uri)
Definition: HttpRequest.h:76
HttpRequest * setHeader(const String &name, const String &value)
Definition: HttpRequest.h:94
ReadWriteStream * getResponseStream()
Get the response stream (if any)
Definition: HttpRequest.h:225
HttpRequest * onSslInit(SslInitDelegate delegate)
To customise SSL session options, provide a callback.
Definition: HttpRequest.h:260
HttpParams postParams
POST parameters.
Definition: HttpRequest.h:287
HttpRequest * onRequestComplete(RequestCompletedDelegate delegateFunction)
Definition: HttpRequest.h:242
Url uri
Request URL.
Definition: HttpRequest.h:284
void * args
Used to store data that should be valid during a single request.
Definition: HttpRequest.h:292
String getQueryParameter(const String &name, const String &defaultValue=nullptr) const
Get parameter from query fields.
Definition: HttpRequest.h:156
IDataSourceStream * bodyStream
Definition: HttpRequest.h:300
HttpMethod method
Request method.
Definition: HttpRequest.h:285
String getBody()
Moves content from the body stream into a String.
Definition: HttpRequest.h:168
RequestCompletedDelegate requestCompletedDelegate
Definition: HttpRequest.h:297
HttpRequest(const HttpRequest &value)
Copy constructor.
Definition: HttpRequest.h:54
HttpRequest * setBody(IDataSourceStream *stream)
Set body using given stream object, and retain ownership.
~HttpRequest()
Definition: HttpRequest.h:71
HttpRequest * setAuth(AuthAdapter *adapter)
Definition: HttpRequest.h:123
const String & getHeader(const String &name)
Get header field value.
Definition: HttpRequest.h:136
HttpRequest * setMethod(HttpMethod method)
Definition: HttpRequest.h:82
HttpHeaders headers
Request headers.
Definition: HttpRequest.h:286
HttpRequest * setBody(const String &body)
Set body from String object.
Definition: HttpRequest.h:193
HttpRequest * onBody(RequestBodyDelegate delegateFunction)
Definition: HttpRequest.h:236
AuthAdapter * auth
Definition: HttpRequest.h:304
HttpRequest * setPostParameter(const String &name, const String &value)
Definition: HttpRequest.h:100
Represents either an incoming or outgoing response to a HTTP request.
Definition: HttpResponse.h:26
Definition: HttpServerConnection.h:34
Base class for read-only stream.
Definition: DataSourceStream.h:46
virtual bool moveString(String &s)
Memory-based streams may be able to move content into a String.
Definition: DataSourceStream.h:190
Base class for read/write stream.
Definition: ReadWriteStream.h:20
Handles all SSL activity for a TCP connection.
Definition: Session.h:78
The String class.
Definition: WString.h:137
const char * c_str() const
Get a constant (un-modifiable) pointer to String content.
Definition: WString.h:617
size_t length(void) const
Obtain the String length in characters, excluding NUL terminator.
Definition: WString.h:244
IDataSourceStream * stream
The currently active stream being sent.
Definition: TcpClient.h:165
Class to manage URL instance.
Definition: Url.h:67
HttpParams Query
Definition: Url.h:176