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:
42  HttpRequest() = default;
43 
44  HttpRequest(const Url& uri) : uri(uri)
45  {
46  }
47 
52  HttpRequest(const HttpRequest& value)
53  : uri(value.uri), method(value.method), headers(value.headers), postParams(value.postParams),
56  {
57  }
58 
64  HttpRequest* clone() const
65  {
66  return new HttpRequest(*this);
67  }
68 
70  {
71  reset();
72  }
73 
75  {
76  this->uri = uri;
77  return this;
78  }
79 
81  {
82  this->method = method;
83  return this;
84  }
85 
87  {
88  this->headers.setMultiple(headers);
89  return this;
90  }
91 
92  HttpRequest* setHeader(const String& name, const String& value)
93  {
94  headers[name] = value;
95  return this;
96  }
97 
98  HttpRequest* setPostParameter(const String& name, const String& value)
99  {
100  postParams[name] = value;
101  return this;
102  }
103 
111  HttpRequest* setFile(const String& formElementName, ReadWriteStream* stream)
112  {
113  if(stream != nullptr) {
114  files[formElementName] = stream;
115  }
116  return this;
117  }
118 
119 #ifdef ENABLE_HTTP_REQUEST_AUTH
120  // Authentication adapters set here
122  {
123  adapter->setRequest(this);
124  auth = adapter;
125  return this;
126  }
127 #endif
128 
134  const String& getHeader(const String& name)
135  {
136  return static_cast<const HttpHeaders&>(headers)[name];
137  }
138 
144  const String& getPostParameter(const String& name)
145  {
146  return static_cast<const HttpParams&>(postParams)[name];
147  }
148 
154  String getQueryParameter(const String& name, const String& defaultValue = nullptr) const
155  {
156  return uri.getQueryParameter(name, defaultValue);
157  }
158 
167  {
168  String s;
169  if(bodyStream != nullptr) {
171  }
172  return s;
173  }
174 
181  {
182  return bodyStream;
183  }
184 
191  HttpRequest* setBody(const String& body)
192  {
193  return setBody(reinterpret_cast<const uint8_t*>(body.c_str()), body.length());
194  }
195 
197  HttpRequest* setBody(String&& body) noexcept;
198 
201 
207  HttpRequest* setBody(const uint8_t* rawData, size_t length);
208 
219 
224  {
225  return responseStream;
226  }
227 
229  {
230  headersCompletedDelegate = delegateFunction;
231  return this;
232  }
233 
235  {
236  requestBodyDelegate = delegateFunction;
237  return this;
238  }
239 
241  {
242  requestCompletedDelegate = delegateFunction;
243  return this;
244  }
245 
247  void reset();
248 
252  using SslInitDelegate = Delegate<void(Ssl::Session& session, HttpRequest& request)>;
253 
259  {
260  sslInitDelegate = delegate;
261  return this;
262  }
263 
268  String toString() const;
269 
276  static String toString(const HttpRequest& req)
277  {
278  return req.toString();
279  }
280 
281 public:
283  HttpMethod method = HTTP_GET;
287 
288  int retries = 0;
289 
290  void* args = nullptr;
291 
292 protected:
297 
300 
301 #ifdef ENABLE_HTTP_REQUEST_AUTH
302  AuthAdapter* auth = nullptr;
303 #endif
304 
305 private:
306  HttpParams* queryParams = nullptr; // << @todo deprecate
307 };
308 
309 inline String toString(const HttpRequest& req)
310 {
311  return req.toString();
312 }
HttpMethod
Strongly-typed enum which shadows http_method from http_parser library.
Definition: HttpCommon.h:42
String toString(const HttpRequest &req)
Definition: HttpRequest.h:309
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:188
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:294
const String & getPostParameter(const String &name)
Get POST parameter value.
Definition: HttpRequest.h:144
SslInitDelegate sslInitDelegate
Definition: HttpRequest.h:296
HttpRequest * onHeadersComplete(RequestHeadersCompletedDelegate delegateFunction)
Definition: HttpRequest.h:228
HttpRequest()=default
RequestHeadersCompletedDelegate headersCompletedDelegate
Definition: HttpRequest.h:293
static String toString(const HttpRequest &req)
Tries to present a readable version of the request.
Definition: HttpRequest.h:276
HttpRequest * setFile(const String &formElementName, ReadWriteStream *stream)
Sets a file to be sent.
Definition: HttpRequest.h:111
HttpFiles files
Attached files.
Definition: HttpRequest.h:286
HttpRequest * clone() const
Clone this request into a new object using the copy constructor.
Definition: HttpRequest.h:64
ReadWriteStream * responseStream
User-requested stream to store response.
Definition: HttpRequest.h:299
int retries
how many times the request should be send again...
Definition: HttpRequest.h:288
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:86
IDataSourceStream * getBodyStream()
Return the current body stream.
Definition: HttpRequest.h:180
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:44
HttpRequest * setURL(const Url &uri)
Definition: HttpRequest.h:74
HttpRequest * setHeader(const String &name, const String &value)
Definition: HttpRequest.h:92
ReadWriteStream * getResponseStream()
Get the response stream (if any)
Definition: HttpRequest.h:223
HttpRequest * onSslInit(SslInitDelegate delegate)
To customise SSL session options, provide a callback.
Definition: HttpRequest.h:258
HttpParams postParams
POST parameters.
Definition: HttpRequest.h:285
HttpRequest * onRequestComplete(RequestCompletedDelegate delegateFunction)
Definition: HttpRequest.h:240
Url uri
Request URL.
Definition: HttpRequest.h:282
void * args
Used to store data that should be valid during a single request.
Definition: HttpRequest.h:290
String getQueryParameter(const String &name, const String &defaultValue=nullptr) const
Get parameter from query fields.
Definition: HttpRequest.h:154
IDataSourceStream * bodyStream
Definition: HttpRequest.h:298
HttpMethod method
Request method.
Definition: HttpRequest.h:283
String getBody()
Moves content from the body stream into a String.
Definition: HttpRequest.h:166
RequestCompletedDelegate requestCompletedDelegate
Definition: HttpRequest.h:295
HttpRequest(const HttpRequest &value)
Copy constructor.
Definition: HttpRequest.h:52
HttpRequest * setBody(IDataSourceStream *stream)
Set body using given stream object, and retain ownership.
~HttpRequest()
Definition: HttpRequest.h:69
HttpRequest * setAuth(AuthAdapter *adapter)
Definition: HttpRequest.h:121
const String & getHeader(const String &name)
Get header field value.
Definition: HttpRequest.h:134
HttpRequest * setMethod(HttpMethod method)
Definition: HttpRequest.h:80
HttpHeaders headers
Request headers.
Definition: HttpRequest.h:284
HttpRequest * setBody(const String &body)
Set body from String object.
Definition: HttpRequest.h:191
HttpRequest * onBody(RequestBodyDelegate delegateFunction)
Definition: HttpRequest.h:234
AuthAdapter * auth
Definition: HttpRequest.h:302
HttpRequest * setPostParameter(const String &name, const String &value)
Definition: HttpRequest.h:98
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:192
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:133
const char * c_str() const
Get a constant (un-modifiable) pointer to String content.
Definition: WString.h:609
size_t length(void) const
Obtain the String length in characters, excluding NUL terminator.
Definition: WString.h:238
IDataSourceStream * stream
The currently active stream being sent.
Definition: TcpClient.h:165
Class to manage URL instance.
Definition: Url.h:67
const String & getQueryParameter(const String &name, const String &defaultValue=nullptr) const
Get a query parameter.
Definition: Url.h:184