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 
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 
73  {
74  return *this;
75  }
76 
78  {
79  reset();
80  }
81 
83  {
84  this->uri = uri;
85  return this;
86  }
87 
89  {
90  this->method = method;
91  return this;
92  }
93 
95  {
96  this->headers.setMultiple(headers);
97  return this;
98  }
99 
100  HttpRequest* setHeader(const String& name, const String& value)
101  {
102  headers[name] = value;
103  return this;
104  }
105 
110  {
111  postParams = params;
112  return this;
113  }
114 
115  HttpRequest* setPostParameter(const String& name, const String& value)
116  {
117  postParams[name] = value;
118  return this;
119  }
120 
128  HttpRequest* setFile(const String& formElementName, ReadWriteStream* stream)
129  {
130  if(stream != nullptr) {
131  files[formElementName] = stream;
132  }
133  return this;
134  }
135 
136 #ifdef ENABLE_HTTP_REQUEST_AUTH
137  // Authentication adapters set here
139  {
140  adapter->setRequest(this);
141  auth = adapter;
142  return this;
143  }
144 #endif
145 
146  const String& getHeader(const String& name)
147  {
148  return static_cast<const HttpHeaders&>(headers)[name];
149  }
150 
151  const String& getPostParameter(const String& name)
152  {
153  return static_cast<const HttpParams&>(postParams)[name];
154  }
155 
158  {
159  return uri.Path;
160  }
161 
162  /* @deprecated Use methods of `uri.Query` instead */
163  String getQueryParameter(const String& parameterName, const String& defaultValue = nullptr) const
164  {
165  return static_cast<const HttpParams&>(uri.Query)[parameterName] ?: defaultValue;
166  }
167 
176  {
177  String s;
178  if(bodyStream != nullptr) {
180  }
181  return s;
182  }
183 
190  {
191  return bodyStream;
192  }
193 
198  HttpRequest* setBody(const String& body)
199  {
200  return setBody(reinterpret_cast<const uint8_t*>(body.c_str()), body.length());
201  }
202 
203  HttpRequest* setBody(String&& body) noexcept;
204 
206 
207  HttpRequest* setBody(const uint8_t* rawData, size_t length);
218 
223  {
224  return responseStream;
225  }
226 
228  {
229  headersCompletedDelegate = delegateFunction;
230  return this;
231  }
232 
234  {
235  requestBodyDelegate = delegateFunction;
236  return this;
237  }
238 
240  {
241  requestCompletedDelegate = delegateFunction;
242  return this;
243  }
244 
246  void reset();
247 
252 
258  {
259  sslInitDelegate = delegate;
260  return this;
261  }
262 
267  String toString() const;
268 
275  static String toString(const HttpRequest& req)
276  {
277  return req.toString();
278  }
279 
280 public:
282  HttpMethod method = HTTP_GET;
286 
287  int retries = 0; // how many times the request should be send again...
288 
289  void* args = nullptr; // Used to store data that should be valid during a single request
290 
291 protected:
296 
299 
300 #ifdef ENABLE_HTTP_REQUEST_AUTH
301  AuthAdapter* auth = nullptr;
302 #endif
303 
304 private:
305  HttpParams* queryParams = nullptr; // << @todo deprecate
306 };
307 
308 inline String toString(const HttpRequest& req)
309 {
310  return req.toString();
311 }
HttpRequest * setPostParameters(const HttpParams &params)
Definition: HttpRequest.h:109
HttpRequest * setHeader(const String &name, const String &value)
Definition: HttpRequest.h:100
IDataSourceStream * getBodyStream()
Return the current body stream.
Definition: HttpRequest.h:189
RequestCompletedDelegate requestCompletedDelegate
Definition: HttpRequest.h:294
Class to manage URL instance.
Definition: Url.h:66
String getBody()
Moves content from the body stream into a String.
Definition: HttpRequest.h:175
Handles the query portion of a URI.
Definition: HttpParams.h:34
HttpParams postParams
Definition: HttpRequest.h:284
HttpRequest * onBody(RequestBodyDelegate delegateFunction)
Definition: HttpRequest.h:233
const char * c_str() const
Get a constant (un-modifiable) pointer to String content.
Definition: WString.h:641
static String toString(const HttpRequest &req)
Tries to present a readable version of the request.
Definition: HttpRequest.h:275
Base class for read-only stream.
Definition: DataSourceStream.h:40
virtual void setRequest(HttpRequest *request)=0
HttpRequest(const HttpRequest &value)
Copy constructor.
Definition: HttpRequest.h:54
HttpRequest()
Definition: HttpRequest.h:42
Definition: HttpServerConnection.h:33
const String & getPostParameter(const String &name)
Definition: HttpRequest.h:151
The String class.
Definition: WString.h:136
HttpParams Query
Definition: Url.h:176
String Path
with leading "/"
Definition: Url.h:175
String getPath()
Definition: HttpRequest.h:157
Encapsulates a set of HTTP header information.
Definition: HttpHeaders.h:34
void reset()
Clear buffers and reset to default state in preparation for another request.
String getQueryParameter(const String &parameterName, const String &defaultValue=nullptr) const
Definition: HttpRequest.h:163
Url uri
Definition: HttpRequest.h:281
AuthAdapter * auth
Definition: HttpRequest.h:301
int retries
Definition: HttpRequest.h:287
Definition: HttpRequestAuth.h:19
ReadWriteStream * getResponseStream()
Get the response stream (if any)
Definition: HttpRequest.h:222
ReadWriteStream * responseStream
User-requested stream to store response.
Definition: HttpRequest.h:298
HttpRequest & operator=(const HttpRequest &rhs)
Definition: HttpRequest.h:72
SslInitDelegate sslInitDelegate
Definition: HttpRequest.h:295
IDataSourceStream * bodyStream
Definition: HttpRequest.h:297
#define SMING_DEPRECATED
Definition: sming_attr.h:30
HttpMethod method
Definition: HttpRequest.h:282
const String & getHeader(const String &name)
Definition: HttpRequest.h:146
size_t length(void) const
Obtain the String length in characters, excluding NUL terminator.
Definition: WString.h:237
void setMultiple(const HttpHeaders &headers)
HttpRequest * setResponseStream(ReadWriteStream *stream)
Instead of storing the response body we can set a stream that will take care to process it...
HttpFiles files
Definition: HttpRequest.h:285
void * args
Definition: HttpRequest.h:289
HttpMethod
Strongly-typed enum which shadows http_method from http_parser library.
Definition: HttpCommon.h:42
HttpRequest * onSslInit(SslInitDelegate delegate)
To customise SSL session options, provide a callback.
Definition: HttpRequest.h:257
HttpRequest * clone() const
Clone this request into a new object using the copy constructor.
Definition: HttpRequest.h:66
HttpRequest * onHeadersComplete(RequestHeadersCompletedDelegate delegateFunction)
Definition: HttpRequest.h:227
Encapsulates an incoming or outgoing request.
Definition: HttpRequest.h:36
HttpRequest * setFile(const String &formElementName, ReadWriteStream *stream)
Sets a file to be sent.
Definition: HttpRequest.h:128
Provides http base used for client and server connections.
Definition: HttpConnection.h:27
String toString() const
Tries to present a readable version of the current request values.
HttpRequest * setURL(const Url &uri)
Definition: HttpRequest.h:82
HttpRequest(const Url &uri)
Definition: HttpRequest.h:46
HttpRequest * setBody(const String &body)
Definition: HttpRequest.h:198
IDataSourceStream * stream
The currently active stream being sent.
Definition: TcpClient.h:157
HttpRequest * setMethod(HttpMethod method)
Definition: HttpRequest.h:88
Base class for read/write stream.
Definition: ReadWriteStream.h:19
virtual bool moveString(String &s)
Memory-based streams may be able to move content into a String.
Definition: DataSourceStream.h:194
HttpRequest * onRequestComplete(RequestCompletedDelegate delegateFunction)
Definition: HttpRequest.h:239
HttpRequest * setPostParameter(const String &name, const String &value)
Definition: HttpRequest.h:115
~HttpRequest()
Definition: HttpRequest.h:77
HttpRequest * setHeaders(const HttpHeaders &headers)
Definition: HttpRequest.h:94
Definition: HttpClientConnection.h:28
RequestBodyDelegate requestBodyDelegate
Definition: HttpRequest.h:293
RequestHeadersCompletedDelegate headersCompletedDelegate
Definition: HttpRequest.h:292
HttpHeaders headers
Definition: HttpRequest.h:283
HttpRequest * setAuth(AuthAdapter *adapter)
Definition: HttpRequest.h:138