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"
22 #include "HttpHeaders.h"
23 #include "HttpParams.h"
24 #include "Data/ObjectMap.h"
25 
27 
31 
32 /*
33  * Encapsulates an incoming or outgoing request
34  */
36 {
37  friend class HttpClientConnection;
38  friend class HttpServerConnection;
39 
40 public:
42  {
43  }
44 
45  HttpRequest(const Url& uri) : uri(uri)
46  {
47  }
48 
53  HttpRequest(const HttpRequest& value)
54  : uri(value.uri), method(value.method), headers(value.headers), postParams(value.postParams),
57  {
58  }
59 
65  HttpRequest* clone() const
66  {
67  return new HttpRequest(*this);
68  }
69 
72  {
73  return *this;
74  }
75 
77  {
78  reset();
79  }
80 
82  {
83  this->uri = uri;
84  return this;
85  }
86 
88  {
89  this->method = method;
90  return this;
91  }
92 
94  {
95  this->headers.setMultiple(headers);
96  return this;
97  }
98 
99  HttpRequest* setHeader(const String& name, const String& value)
100  {
101  headers[name] = value;
102  return this;
103  }
104 
109  {
110  postParams = params;
111  return this;
112  }
113 
114  HttpRequest* setPostParameter(const String& name, const String& value)
115  {
116  postParams[name] = value;
117  return this;
118  }
119 
127  HttpRequest* setFile(const String& formElementName, ReadWriteStream* stream)
128  {
129  if(stream != nullptr) {
130  files[formElementName] = stream;
131  }
132  return this;
133  }
134 
135 #ifdef ENABLE_HTTP_REQUEST_AUTH
136  // Authentication adapters set here
138  {
139  adapter->setRequest(this);
140  auth = adapter;
141  return this;
142  }
143 #endif
144 
145  const String& getHeader(const String& name)
146  {
147  return static_cast<const HttpHeaders&>(headers)[name];
148  }
149 
150  const String& getPostParameter(const String& name)
151  {
152  return static_cast<const HttpParams&>(postParams)[name];
153  }
154 
157  {
158  return uri.Path;
159  }
160 
161  /* @deprecated Use methods of `uri.Query` instead */
162  String getQueryParameter(const String& parameterName, const String& defaultValue = nullptr) const
163  {
164  return reinterpret_cast<const HttpParams&>(uri.Query)[parameterName] ?: defaultValue;
165  }
166 
176  String getBody();
177 
184  {
185  return bodyStream;
186  }
187 
188  HttpRequest* setBody(const String& body)
189  {
190  setBody(reinterpret_cast<const uint8_t*>(body.c_str()), body.length());
191  return this;
192  }
193 
195 
196  HttpRequest* setBody(const uint8_t* rawData, size_t length);
197 
206 
211  {
212  return responseStream;
213  }
214 
216  {
217  headersCompletedDelegate = delegateFunction;
218  return this;
219  }
220 
222  {
223  requestBodyDelegate = delegateFunction;
224  return this;
225  }
226 
228  {
229  requestCompletedDelegate = delegateFunction;
230  return this;
231  }
232 
234  void reset();
235 
240 
246  {
247  sslInitDelegate = delegate;
248  return this;
249  }
250 
251 #ifndef SMING_RELEASE
252 
256  String toString();
257 #endif
258 
259 public:
261  HttpMethod method = HTTP_GET;
265 
266  int retries = 0; // how many times the request should be send again...
267 
268  void* args = nullptr; // Used to store data that should be valid during a single request
269 
270 protected:
275 
278 
279 #ifdef ENABLE_HTTP_REQUEST_AUTH
280  AuthAdapter* auth = nullptr;
281 #endif
282 
283 private:
284  HttpParams* queryParams = nullptr; // << @todo deprecate
285 };
HttpRequest * setPostParameters(const HttpParams &params)
Definition: HttpRequest.h:108
HttpRequest * setHeader(const String &name, const String &value)
Definition: HttpRequest.h:99
IDataSourceStream * getBodyStream()
Return the current body stream.
Definition: HttpRequest.h:183
RequestCompletedDelegate requestCompletedDelegate
Definition: HttpRequest.h:273
Class to manage URL instance.
Definition: Url.h:66
String getBody()
Returns content from the body stream as string.
Definition: HttpParams.h:31
HttpParams postParams
Definition: HttpRequest.h:263
HttpRequest * onBody(RequestBodyDelegate delegateFunction)
Definition: HttpRequest.h:221
const char * c_str() const
Get a constant (un-modifiable) pointer to String content.
Definition: WString.h:600
String toString()
Tries to present a readable version of the current request values.
Base class for data source stream.
Definition: DataSourceStream.h:39
virtual void setRequest(HttpRequest *request)=0
HttpRequest(const HttpRequest &value)
Copy constructor.
Definition: HttpRequest.h:53
HttpRequest()
Definition: HttpRequest.h:41
Definition: HttpServerConnection.h:33
const String & getPostParameter(const String &name)
Definition: HttpRequest.h:150
The String class.
Definition: WString.h:136
Delegate< int(HttpConnection &client, const char *at, size_t length)> RequestBodyDelegate
Definition: HttpRequest.h:29
enum http_method HttpMethod
Definition: HttpCommon.h:34
HttpParams Query
Definition: Url.h:176
String Path
with leading "/"
Definition: Url.h:175
String getPath()
Definition: HttpRequest.h:156
Encapsulates a set of HTTP header information.
Definition: HttpHeaders.h:96
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:162
Url uri
Definition: HttpRequest.h:260
AuthAdapter * auth
Definition: HttpRequest.h:280
int retries
Definition: HttpRequest.h:266
Definition: HttpRequestAuth.h:19
ReadWriteStream * getResponseStream()
Get the response stream (if any)
Definition: HttpRequest.h:210
ReadWriteStream * responseStream
User-requested stream to store response.
Definition: HttpRequest.h:277
HttpRequest & operator=(const HttpRequest &rhs)
Definition: HttpRequest.h:71
SslInitDelegate sslInitDelegate
Definition: HttpRequest.h:274
IDataSourceStream * bodyStream
Definition: HttpRequest.h:276
#define SMING_DEPRECATED
Definition: sming_attr.h:30
HttpMethod method
Definition: HttpRequest.h:261
const String & getHeader(const String &name)
Definition: HttpRequest.h:145
size_t length(void) const
Obtain the String length in characters, excluding NUL terminator.
Definition: WString.h:228
void setMultiple(const HttpHeaders &headers)
Definition: HttpHeaders.h:182
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:264
void * args
Definition: HttpRequest.h:268
HttpRequest * onSslInit(SslInitDelegate delegate)
To customise SSL session options, provide a callback.
Definition: HttpRequest.h:245
HttpRequest * clone() const
Clone this request into a new object using the copy constructor.
Definition: HttpRequest.h:65
HttpRequest * onHeadersComplete(RequestHeadersCompletedDelegate delegateFunction)
Definition: HttpRequest.h:215
Definition: HttpRequest.h:35
HttpRequest * setFile(const String &formElementName, ReadWriteStream *stream)
Sets a file to be sent.
Definition: HttpRequest.h:127
Provides http base used for client and server connections.
Definition: HttpConnection.h:27
HttpRequest * setURL(const Url &uri)
Definition: HttpRequest.h:81
HttpRequest(const Url &uri)
Definition: HttpRequest.h:45
HttpRequest * setBody(const String &body)
Definition: HttpRequest.h:188
IDataSourceStream * stream
The currently active stream being sent.
Definition: TcpClient.h:145
Delegate< int(HttpConnection &client, HttpResponse &response)> RequestHeadersCompletedDelegate
Definition: HttpRequest.h:26
HttpRequest * setMethod(HttpMethod method)
Definition: HttpRequest.h:87
Base class for read/write stream.
Definition: ReadWriteStream.h:22
HttpRequest * onRequestComplete(RequestCompletedDelegate delegateFunction)
Definition: HttpRequest.h:227
Delegate< int(HttpConnection &client, bool successful)> RequestCompletedDelegate
Definition: HttpRequest.h:30
HttpRequest * setPostParameter(const String &name, const String &value)
Definition: HttpRequest.h:114
~HttpRequest()
Definition: HttpRequest.h:76
HttpRequest * setHeaders(const HttpHeaders &headers)
Definition: HttpRequest.h:93
Definition: HttpClientConnection.h:27
RequestBodyDelegate requestBodyDelegate
Definition: HttpRequest.h:272
RequestHeadersCompletedDelegate headersCompletedDelegate
Definition: HttpRequest.h:271
HttpHeaders headers
Definition: HttpRequest.h:262
HttpRequest * setAuth(AuthAdapter *adapter)
Definition: HttpRequest.h:137