10000 Added support for default headers that are included in every response · quentin/esp32_https_server@28a16b7 · GitHub
[go: up one dir, main page]

Skip to content

Commit 28a16b7

Browse files
committed
Added support for default headers that are included in every response
1 parent ba0ee6d commit 28a16b7

File tree

7 files changed

+50
-6
lines changed

7 files changed

+50
-6
lines changed

https/HTTPHeaders.cpp

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,7 @@ HTTPHeaders::HTTPHeaders() {
1515
}
1616

1717
HTTPHeaders::~HTTPHeaders() {
18-
for(std::vector<HTTPHeader*>::iterator header = _headers->begin(); header != _headers->end(); ++header) {
19-
delete (*header);
20-
}
18+
clearAll();
2119
delete _headers;
2220
}
2321

@@ -45,4 +43,14 @@ std::vector<HTTPHeader *> * HTTPHeaders::getAll() {
4543
return _headers;
4644
}
4745

46+
/**
47+
* Deletes all headers
48+
*/
49+
void HTTPHeaders::clearAll() {
50+
for(std::vector<HTTPHeader*>::iterator header = _headers->begin(); header != _headers->end(); ++header) {
51+
delete (*header);
52+
}
53+
_headers->clear();
54+
}
55+
4856
} /* namespace httpsserver */

https/HTTPHeaders.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ class HTTPHeaders {
2929

3030
std::vector<HTTPHeader *> * getAll();
3131

32+
void clearAll();
33+
3234
private:
3335
std::vector<HTTPHeader*> * _headers;
3436
};

https/HTTPSConnection.cpp

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ HTTPSConnection::HTTPSConnection(ResourceResolver * resResolver):
2222
_connectionState = STATE_UNDEFINED;
2323
_clientState = CSTATE_UNDEFINED;
2424
_httpHeaders = NULL;
25+
_defaultHeaders = NULL;
2526
_isKeepAlive = false;
2627
_lastTransmissionTS = millis();
2728
}
@@ -36,8 +37,9 @@ HTTPSConnection::~HTTPSConnection() {
3637
*
3738
* The call WILL BLOCK if accept(serverSocketID) blocks. So use select() to check for that in advance.
3839
*/
39-
int HTTPSConnection::initialize(int serverSocketID, SSL_CTX * sslCtx) {
40+
int HTTPSConnection::initialize(int serverSocketID, SSL_CTX * sslCtx, HTTPHeaders *defaultHeaders) {
4041
if (_connectionState == STATE_UNDEFINED) {
42+
_defaultHeaders = defaultHeaders;
4143
_socket = accept(serverSocketID, (struct sockaddr * )&_sockAddr, &_addrLen);
4244

4345
// Build up SSL Connection context if the socket has been created successfully
@@ -421,6 +423,12 @@ void HTTPSConnection::loop() {
421423
HTTPRequest req = HTTPRequest(this, _httpHeaders, resolvedResource.getParams());
422424
HTTPResponse res = HTTPResponse(this);
423425

426+
// Add default headers to the response
427+
auto allDefaultHeaders = _defaultHeaders->getAll();
428+
for(std::vector<HTTPHeader*>::iterator header = allDefaultHeaders->begin(); header != allDefaultHeaders->end(); ++header) {
429+
res.setHeader((*header)->_name, (*header)->_value);
430+
}
431+
424432
// Call the callback
425433
HTTPS_DLOG("[ ] Calling handler function");
426434
resolvedResource.getMatchingNode()->_callback(&req, &res);
@@ -437,7 +445,11 @@ void HTTPSConnection::loop() {
437445
res.setHeader("Connection", "keep-alive");
438446
res.finalize();
439447
if (_clientState != CSTATE_CLOSED) {
448+
// Refresh the timeout for the new request
440449
refreshTimeout();
450+
// Reset headers for the new connection
451+
_httpHeaders->clearAll();
452+
// Go back to initial state
441453
_connectionState = STATE_INITIAL;
442454
}
443455
}

https/HTTPSConnection.hpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ class HTTPSConnection : private ConnectionContext {
3737
HTTPSConnection(ResourceResolver * resResolver);
3838
virtual ~HTTPSConnection();
3939

40-
int initialize(int serverSocketID, SSL_CTX * sslCtx);
40+
int initialize(int serverSocketID, SSL_CTX * sslCtx, HTTPHeaders *defaultHeaders);
4141
void loop();
4242
void closeConnection();
4343
bool isClosed();
@@ -89,6 +89,9 @@ class HTTPSConnection : private ConnectionContext {
8989
std::string _httpResource;
9090
HTTPHeaders * _httpHeaders;
9191

92+
// Default headers that are applied to every response
93+
HTTPHeaders * _defaultHeaders;
94+
9295
// Should we use keep alive
9396
bool _isKeepAlive;
9497

https/HTTPSServer.cpp

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,15 @@ void HTTPSServer::stop() {
9595
}
9696
}
9797

98+
/**
99+
* Adds a default header that is included in every response.
100+
*
101+
* This could be used for example to add a Server: header or for CORS options
102+
*/
< 9E88 /td>
103+
void HTTPSServer::setDefaultHeader(std::string name, std::string value) {
104+
_defaultHeaders.set(new HTTPHeader(name, value));
105+
}
106+
98107
/**
99108
* The loop method can either be called by periodical interrupt or in the main loop and handles processing
100109
* of data
@@ -150,7 +159,7 @@ void HTTPSServer::loop() {
150159
_connections[freeConnectionIdx] = new HTTPSConnection(this);
151160

152161
// Start to accept data on the socket
153-
int socketIdentifier = _connections[freeConnectionIdx]->initialize(_socket, _sslctx);
162+
int socketIdentifier = _connections[freeConnectionIdx]->initialize(_socket, _sslctx, &_defaultHeaders);
154163

155164
// If initializing did not work, discard the new socket immediately
156165
if (socketIdentifier < 0) {

https/HTTPSServer.hpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@
2626

2727
// Internal includes
2828
#include "HTTPSServerConstants.hpp"
29+
#include "HTTPHeaders.hpp"
30+
#include "HTTPHeader.hpp"
2931
#include "ResourceNode.hpp"
3032
#include "ResourceResolver.hpp"
3133
#include "ResolvedResource.hpp"
@@ -45,6 +47,8 @@ class HTTPSServer : public ResourceResolver {
4547

4648
void loop();
4749

50+
void setDefaultHeader(std::string name, std::string value);
51+
4852
private:
4953
// Static configuration. Port, keys, etc. ====================
5054
// Certificate that should be used (includes private key)
@@ -67,6 +71,8 @@ class HTTPSServer : public ResourceResolver {
6771
int _socket;
6872
// The server socket address, that our service is bound to
6973
sockaddr_in _sock_addr;
74+
// Headers that are included in every response
75+
HTTPHeaders _defaultHeaders;
7076

7177
// Setup functions
7278
uint8_t setupSSLCTX();

https_server.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -293,6 +293,10 @@ void serverTask(void *params) {
293293
server.registerNode(echoNodePut);
294294
server.registerNode(corsNode);
295295

296+
// Add a default header to the server that will be added to every response. In this example, we
297+
// use it only for adding the server name, but it could also be used to add CORS-headers to every response
298+
server.setDefaultHeader("Server", "esp32-http-server");
299+
296300
// The web server can be start()ed and stop()ed. When it's stopped, it will close its server port and
297301
// all open connections and free the resources. Theoretically, it should be possible to run multiple
298302
// web servers in parallel, however, there might be some restrictions im memory.

0 commit comments

Comments
 (0)
0