8000 Added support for url parameters · m4k3r-org/esp32_https_server@7208938 · GitHub
[go: up one dir, main page]

Skip to content

Commit 7208938

Browse files
committed
Added support for url parameters
1 parent 7f258a5 commit 7208938

13 files changed

+364
-22
lines changed

https/HTTPRequest.cpp

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,10 @@
99

1010
namespace httpsserver {
1111

12-
HTTPRequest::HTTPRequest(ConnectionContext * con, HTTPHeaders * headers):
12+
HTTPRequest::HTTPRequest(ConnectionContext * con, HTTPHeaders * headers, ResourceParameters * params):
1313
_con(con),
14-
_headers(headers) {
14+
_headers(headers),
15+
_params(params) {
1516

1617
HTTPHeader * contentLength = headers->get("Content-Length");
1718
if (contentLength == NULL) {
@@ -28,6 +29,11 @@ HTTPRequest::~HTTPRequest() {
2829

2930
}
3031

32+
33+
ResourceParameters * HTTPRequest::getParams() {
34+
return _params;
35+
}
36+
3137
std::string HTTPRequest::getHeader(std::string name) {
3238
HTTPHeader * h = _headers->get(name);
3339
if (h != NULL) {

https/HTTPRequest.hpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,15 @@
1414
#include "util.hpp"
1515

1616
#include "ConnectionContext.hpp"
17+
#include "ResourceParameters.hpp"
1718
#include "HTTPHeaders.hpp"
1819
#include "HTTPHeader.hpp"
1920

2021
namespace httpsserver {
2122

2223
class HTTPRequest {
2324
public:
24-
HTTPRequest(ConnectionContext * con, HTTPHeaders * headers);
25+
HTTPRequest(ConnectionContext * con, HTTPHeaders * headers, ResourceParameters * resource);
2526
virtual ~HTTPRequest();
2627

2728
std::string getHeader(std::string name);
@@ -30,11 +31,14 @@ class HTTPRequest {
3031
size_t readBytes(byte * buffer, size_t length);
3132
size_t getContentLength();
3233
bool requestComplete();
34+
ResourceParameters * getParams();
3335
private:
3436
ConnectionContext * _con;
3537

3638
HTTPHeaders * _headers;
3739

40+
ResourceParameters * _params;
41+
3842
bool _contentLengthSet;
3943
size_t _remainingContent;
4044
};

https/HTTPResponse.cpp

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,8 @@ void HTTPResponse::printHeader() {
9797
HTTPS_DLOG("[ ] Printing headers")
9898

9999
// Status line, like: "HTTP/1.1 200 OK\r\n"
100-
std::string statusLine = "HTTP/1.1 " + intToString(_statusCode) + " " + _statusText + "\r\n";
100+
//intToString(_statusCode)
101+
std::string statusLine = "HTTP/1.1 200 " + _statusText + "\r\n";
101102
printInternal(statusLine, true);
102103

103104
// Each header, like: "Host: myEsp32\r\n"
@@ -141,7 +142,7 @@ size_t HTTPResponse::writeBytesInternal(const void * data, int length, bool skip
141142
if (!_headerWritten) {
142143
setHeader("Connection", "close");
143144
}
144-
drainBuffer();
145+
drainBuffer(true);
145146
}
146147
}
147148
HTTPS_DLOG("[ ] Writing response data to ssl socket");
@@ -152,17 +153,20 @@ size_t HTTPResponse::writeBytesInternal(const void * data, int length, bool skip
152153
}
153154
}
154155

155-
void HTTPResponse::drainBuffer() {
156+
void HTTPResponse::drainBuffer(bool onOverflow) {
156157
if (!_headerWritten) {
157-
if (_responseCache != NULL) {
158+
if (_responseCache != NULL && !onOverflow) {
158159
_headers.set(new HTTPHeader("Content-Length", intToString(_responseCachePointer)));
159160
}
160161
printHeader();
161162
}
162163

163164
if (_responseCache != NULL) {
164165
HTTPS_DLOG("[ ] Draining response buffer")
165-
SSL_write(_con->ssl(), _responseCache, _responseCachePointer);
166+
// Check for 0 as it may be an overflow reaction without any data that has been written earlier
167+
if(_responseCachePointer > 0) {
168+
SSL_write(_con->ssl(), _responseCache, _responseCachePointer);
169+
}
166170
delete[] _responseCache;
167171
_responseCache = NULL;
168172
}

https/HTTPResponse.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ class HTTPResponse : public Print {
4949
void printHeader();
5050
void printInternal(const std::string &str, bool skipBuffer = false);
5151
size_t writeBytesInternal(const void * data, int length, bool skipBuffer = false);
52-
void drainBuffer();
52+
void drainBuffer(bool onOverflow = false);
5353

5454
ConnectionContext * _con;
5555

https/HTTPSConnection.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -392,7 +392,7 @@ void HTTPSConnection::loop() {
392392
}
393393

394394
// Create request context
395-
HTTPRequest req = HTTPRequest(this, _httpHeaders);
395+
HTTPRequest req = HTTPRequest(this, _httpHeaders, resolvedResource.getParams());
396396
HTTPResponse res = HTTPResponse(this);
397397

398398
// Call the callback

https/ResolvedResource.cpp

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,14 @@ namespace httpsserver {
1111

1212
ResolvedResource::ResolvedResource() {
1313
_matchingNode = NULL;
14+
_params = NULL;
1415
}
1516

1617
ResolvedResource::~ResolvedResource() {
17-
18+
// Delete only params, nodes are reused/server-internal
19+
if (_params != NULL) {
20+
delete _params;
21+
}
1822
}
1923

2024
bool ResolvedResource::didMatch() {
@@ -29,4 +33,15 @@ void ResolvedResource::setMatchingNode(ResourceNode * node) {
2933
_matchingNode = node;
3034
}
3135

36+
ResourceParameters * ResolvedResource::getParams() {
37+
return _params;
38+
}
39+
40+
void ResolvedResource::setParams(ResourceParameters * params) {
41+
if (_params != NULL && _params!=params) {
42+
delete _params;
43+
}
44+
_params = params;
45+
}
46+
3247
} /* namespace httpsserver */

https/ResolvedResource.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#define HTTPS_RESOLVEDRESOURCE_HPP_
1010

1111
#include "ResourceNode.hpp"
12+
#include "ResourceParameters.hpp"
1213

1314
namespace httpsserver {
1415

@@ -20,9 +21,12 @@ class ResolvedResource {
2021
void setMatchingNode(ResourceNode * node);
2122
ResourceNode * getMatchingNode();
2223
bool didMatch();
24+
ResourceParameters * getParams();
25+
void setParams(ResourceParameters * params);
2326

2427
private:
2528
ResourceNode * _matchingNode;
29+
ResourceParameters * _params;
2630
};
2731

2832
} /* namespace httpsserver */

https/ResourceNode.cpp

F987 Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,47 @@ ResourceNode::ResourceNode(const std::string path, const std::string method, con
1414
_method(std::move(method)),
1515
_callback(callback) {
1616

17-
17+
// Count the parameters
18+
_urlParamCount = 0;
19+
size_t idx = 0;
20+
while((idx = path.find("/*", idx)) != std::string::npos) {
21+
_urlParamCount+=1;
22+
// If we don't do this, the same index will be found again... and again... and again...
23+
idx+=1;
24+
};
25+
26+
// Check if there are parameters
27+
if (_urlParamCount > 0) {
28+
// If there are parameters, store their indices
29+
_urlParamIdx = new size_t[_urlParamCount];
30+
for(int i = 0; i < _urlParamCount; i++) {
31+
_urlParamIdx[i] = path.find("/*", i==0 ? 0 : _urlParamIdx[i-1])+1;
32+
}
33+
} else {
34+
_urlParamIdx = NULL;
35+
}
1836
}
1937

2038
ResourceNode::~ResourceNode() {
39+
if (_urlParamIdx != NULL) {
40+
delete[] _urlParamIdx;
41+
}
42+
}
43+
44+
bool ResourceNode::hasUrlParameter() {
45+
return _urlParamCount > 0;
46+
}
47+
48+
size_t ResourceNode::getParamIdx(uint8_t idx) {
49+
if (idx<_urlParamCount) {
50+
return _urlParamIdx[idx];
51+
} else {
52+
return -1;
53+
}
54+
}
2155

56+
uint8_t ResourceNode::getUrlParamCount() {
57+
return _urlParamCount;
2258
}
2359

2460
} /* namespace httpsserver */

https/ResourceNode.hpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,13 @@ class ResourceNode {
2323
const std::string _method;
2424
const HTTPSCallbackFunction * _callback;
2525

26+
bool hasUrlParameter();
27+
uint8_t getUrlParamCount();
28+
size_t getParamIdx(uint8_t);
29+
30+
private:
31+
uint8_t _urlParamCount;
32+
size_t * _urlParamIdx;
2633
};
2734

2835
} /* namespace httpsserver */

https/ResourceParameters.cpp

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
/*
2+
* ResourceParameters.cpp
3+
*
4+
* Created on: Dec 18, 2017
5+
* Author: frank
6+
*/
7+
8+
#include "ResourceParameters.hpp"
9+
10+
namespace httpsserver {
11+
12+
ResourceParameters::ResourceParameters() {
13+
14+
}
15+
16+
ResourceParameters::~ResourceParameters() {
17+
18+
}
19+
20+
21+
std::string ResourceParameters::getRequestParameter(std::string &name) {
22+
return "";
23+
}
24+
25+
uint16_t ResourceParameters::getRequestParameterInt(std::string &name) {
26+
return parseInt(getRequestParameter(name));
27+
}
28+
29+
/**
30+
* Returns an URL parameter as string.
31+
*
32+
* URL parameters are defined by resource nodes like object/?/property
33+
*
34+
* The parameter idx defines the index of the parameter, starting with 0.
35+
*/
36+
std::string ResourceParameters::getUrlParameter(uint8_t idx) {
37+
return _urlParams.at(idx);
38+
}
39+
40+
/**
41+
* Returns an URL parameter as int.
42+
*
43+
* URL parameters are defined by resource nodes like object/?/property
44+
*
45+
* The parameter idx defines the index of the parameter, starting with 0.
46+
*/
47+
uint16_t ResourceParameters::getUrlParameterInt(uint8_t idx) {
48+
return parseInt(getUrlParameter(idx));
49+
}
50+
51+
void ResourceParameters::resetUrlParameters() {
52+
_urlParams.clear();
53+
}
54+
55+
void ResourceParameters::setUrlParameter(uint8_t idx, std::string val) {
56+
if(idx>=_urlParams.capacity()) {
57+
_urlParams.resize(idx + 1);
58+
}
59+
_urlParams.at(idx) = val;
60+
}
61+
62+
} /* namespace httpsserver */

0 commit comments

Comments
 (0)
0