1
0
mirror of https://github.com/esp8266/Arduino.git synced 2025-06-13 13:01:55 +03:00

Add header access using same method as arguments 2

based on @brianensor PR
+sample and some sanity check
This commit is contained in:
luc
2015-10-28 13:58:53 +08:00
parent fbae22f86b
commit ee0b8621f3
4 changed files with 197 additions and 0 deletions

View File

@ -37,10 +37,15 @@ ESP8266WebServer::ESP8266WebServer(int port)
, _lastHandler(0)
, _currentArgCount(0)
, _currentArgs(0)
,_headerKeysCount(0)
,_currentHeaders(0)
{
}
ESP8266WebServer::~ESP8266WebServer() {
if (_currentHeaders)
delete[]_currentHeaders;
_headerKeysCount = 0;
if (!_firstHandler)
return;
RequestHandler* handler = _firstHandler;
@ -283,6 +288,48 @@ bool ESP8266WebServer::hasArg(const char* name) {
return false;
}
String ESP8266WebServer::header(const char* name) {
for (int i = 0; i < _headerKeysCount; ++i) {
if (_currentHeaders[i].key == name)
return _currentHeaders[i].value;
}
return String();
}
void ESP8266WebServer::collectHeaders(const char* headerKeys[], const size_t headerKeysCount) {
_headerKeysCount = headerKeysCount;
if (_currentHeaders)
delete[]_currentHeaders;
_currentHeaders = new RequestArgument[_headerKeysCount];
for (int i = 0; i < _headerKeysCount; i++){
_currentHeaders[i].key = headerKeys[i];
}
}
String ESP8266WebServer::header(int i) {
if (i < _headerKeysCount)
return _currentHeaders[i].value;
return String();
}
String ESP8266WebServer::headerName(int i) {
if (i < _headerKeysCount)
return _currentHeaders[i].key;
return String();
}
int ESP8266WebServer::headers() {
return _headerKeysCount;
}
bool ESP8266WebServer::hasHeader(const char* name) {
for (int i = 0; i < _headerKeysCount; ++i) {
if ((_currentHeaders[i].key == name) && (_currentHeaders[i].value.length() > 0))
return true;
}
return false;
}
String ESP8266WebServer::hostHeader() {
return _hostHeader;
}

View File

@ -83,6 +83,12 @@ public:
String argName(int i); // get request argument name by number
int args(); // get arguments count
bool hasArg(const char* name); // check if argument exists
void collectHeaders(const char* headerKeys[], const size_t headerKeysCount); // set the request headers to collect
String header(const char* name); // get request header value by name
String header(int i); // get request header value by number
String headerName(int i); // get request header name by number
int headers(); // get header count
bool hasHeader(const char* name); // check if header exists
String hostHeader(); // get request host header if available or empty String if not
@ -124,6 +130,7 @@ protected:
void _uploadWriteByte(uint8_t b);
uint8_t _uploadReadByte(WiFiClient& client);
void _prepareHeader(String& response, int code, const char* content_type, size_t contentLength);
bool _collectHeader(const char* headerName, const char* headerValue);
struct RequestArgument {
String key;
@ -140,6 +147,8 @@ protected:
RequestArgument* _currentArgs;
HTTPUpload _currentUpload;
RequestArgument* _currentHeaders;
size_t _headerKeysCount;
size_t _contentLength;
String _responseHeaders;

View File

@ -31,6 +31,10 @@ bool ESP8266WebServer::_parseRequest(WiFiClient& client) {
// Read the first line of HTTP request
String req = client.readStringUntil('\r');
client.readStringUntil('\n');
//reset header value
for (int i = 0; i < _headerKeysCount; ++i) {
_currentHeaders[i].value =String();
}
// First line of HTTP request looks like "GET /path HTTP/1.1"
// Retrieve the "/path" part by finding the spaces
@ -96,6 +100,7 @@ bool ESP8266WebServer::_parseRequest(WiFiClient& client) {
}
headerName = req.substring(0, headerDiv);
headerValue = req.substring(headerDiv + 2);
_collectHeader(headerName.c_str(),headerValue.c_str());
#ifdef DEBUG
DEBUG_OUTPUT.print("headerName: ");
@ -161,6 +166,7 @@ bool ESP8266WebServer::_parseRequest(WiFiClient& client) {
}
headerName = req.substring(0, headerDiv);
headerValue = req.substring(headerDiv + 2);
_collectHeader(headerName.c_str(),headerValue.c_str());
#ifdef DEBUG
DEBUG_OUTPUT.print("headerName: ");
@ -187,6 +193,15 @@ bool ESP8266WebServer::_parseRequest(WiFiClient& client) {
return true;
}
bool ESP8266WebServer::_collectHeader(const char* headerName, const char* headerValue) {
for (size_t i = 0; i < _headerKeysCount; i++) {
if (_currentHeaders[i].key==headerName) {
_currentHeaders[i].value=headerValue;
return true;
}
}
return false;
}
void ESP8266WebServer::_parseArguments(String data) {
#ifdef DEBUG