Skip to content

Commit a16c41d

Browse files
committed
Merge pull request #933 from luc-github/esp8266
Add header access using same method as arguments 2
2 parents 56bd4a7 + ee0b862 commit a16c41d

File tree

4 files changed

+197
-0
lines changed

4 files changed

+197
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
#include <ESP8266WiFi.h>
2+
#include <WiFiClient.h>
3+
#include <ESP8266WebServer.h>
4+
5+
const char* ssid = "........";
6+
const char* password = "........";
7+
8+
ESP8266WebServer server(80);
9+
10+
//Check if header is present and correct
11+
bool is_authentified(){
12+
Serial.println("Enter is_authentified");
13+
if (server.hasHeader("Cookie")){
14+
Serial.print("Found cookie: ");
15+
String cookie = server.header("Cookie");
16+
Serial.println(cookie);
17+
if (cookie.indexOf("ESPSESSIONID=1") != -1) {
18+
Serial.println("Authentification Successful");
19+
return true;
20+
}
21+
}
22+
Serial.println("Authentification Failed");
23+
return false;
24+
}
25+
26+
//login page, also called for disconnect
27+
void handleLogin(){
28+
String msg;
29+
if (server.hasHeader("Cookie")){
30+
Serial.print("Found cookie: ");
31+
String cookie = server.header("Cookie");
32+
Serial.println(cookie);
33+
}
34+
if (server.hasArg("DISCONNECT")){
35+
Serial.println("Disconnection");
36+
String header = "HTTP/1.1 301 OK\r\nSet-Cookie: ESPSESSIONID=0\r\nLocation: /login\r\nCache-Control: no-cache\r\n\r\n";
37+
server.sendContent(header);
38+
return;
39+
}
40+
if (server.hasArg("USERNAME") && server.hasArg("PASSWORD")){
41+
if (server.arg("USERNAME") == "admin" && server.arg("PASSWORD") == "admin" ){
42+
String header = "HTTP/1.1 301 OK\r\nSet-Cookie: ESPSESSIONID=1\r\nLocation: /\r\nCache-Control: no-cache\r\n\r\n";
43+
server.sendContent(header);
44+
Serial.println("Log in Successful");
45+
return;
46+
}
47+
msg = "Wrong username/password! try again.";
48+
Serial.println("Log in Failed");
49+
}
50+
String content = "<html><body><form action='/login' method='POST'>To log in, please use : admin/admin<br>";
51+
content += "User:<input type='text' name='USERNAME' placeholder='user name'><br>";
52+
content += "Password:<input type='password' name='PASSWORD' placeholder='password'><br>";
53+
content += "<input type='submit' name='SUBMIT' value='Submit'></form>" + msg + "<br>";
54+
content += "You also can go <a href='/inline'>here</a></body></html>";
55+
server.send(200, "text/html", content);
56+
}
57+
58+
//root page can be accessed only if authentification is ok
59+
void handleRoot(){
60+
Serial.println("Enter handleRoot");
61+
String header;
62+
if (!is_authentified()){
63+
String header = "HTTP/1.1 301 OK\r\nLocation: /login\r\nCache-Control: no-cache\r\n\r\n";
64+
server.sendContent(header);
65+
return;
66+
}
67+
String content = "<html><body><H2>hello, you successfully connected to esp8266!</H2><br>";
68+
if (server.hasHeader("User-Agent")){
69+
content += "the user agent used is : " + server.header("User-Agent") + "<br><br>";
70+
}
71+
content += "You can access this page until you <a href=\"/login?DISCONNECT=YES\">disconnect</a></body></html>";
72+
server.send(200, "text/html", content);
73+
}
74+
75+
//no need authentification
76+
void handleNotFound(){
77+
String message = "File Not Found\n\n";
78+
message += "URI: ";
79+
message += server.uri();
80+
message += "\nMethod: ";
81+
message += (server.method() == HTTP_GET)?"GET":"POST";
82+
message += "\nArguments: ";
83+
message += server.args();
84+
message += "\n";
85+
for (uint8_t i=0; i<server.args(); i++){
86+
message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
87+
}
88+
server.send(404, "text/plain", message);
89+
}
90+
91+
void setup(void){
92+
Serial.begin(115200);
93+
WiFi.begin(ssid, password);
94+
Serial.println("");
95+
96+
// Wait for connection
97+
while (WiFi.status() != WL_CONNECTED) {
98+
delay(500);
99+
Serial.print(".");
100+
}
101+
Serial.println("");
102+
Serial.print("Connected to ");
103+
Serial.println(ssid);
104+
Serial.print("IP address: ");
105+
Serial.println(WiFi.localIP());
106+
107+
108+
server.on("/", handleRoot);
109+
server.on("/login", handleLogin);
110+
server.on("/inline", [](){
111+
server.send(200, "text/plain", "this works without need of authentification");
112+
});
113+
114+
server.onNotFound(handleNotFound);
115+
//here the list of headers to be recorded
116+
const char * headerkeys[] = {"User-Agent","Cookie"} ;
117+
size_t headerkeyssize = sizeof(headerkeys)/sizeof(char*);
118+
//ask server to track these headers
119+
server.collectHeaders(headerkeys, headerkeyssize );
120+
server.begin();
121+
Serial.println("HTTP server started");
122+
}
123+
124+
void loop(void){
125+
server.handleClient();
126+
}

libraries/ESP8266WebServer/src/ESP8266WebServer.cpp

+47
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,15 @@ ESP8266WebServer::ESP8266WebServer(int port)
3737
, _lastHandler(0)
3838
, _currentArgCount(0)
3939
, _currentArgs(0)
40+
,_headerKeysCount(0)
41+
,_currentHeaders(0)
4042
{
4143
}
4244

4345
ESP8266WebServer::~ESP8266WebServer() {
46+
if (_currentHeaders)
47+
delete[]_currentHeaders;
48+
_headerKeysCount = 0;
4449
if (!_firstHandler)
4550
return;
4651
RequestHandler* handler = _firstHandler;
@@ -283,6 +288,48 @@ bool ESP8266WebServer::hasArg(const char* name) {
283288
return false;
284289
}
285290

291+
String ESP8266WebServer::header(const char* name) {
292+
for (int i = 0; i < _headerKeysCount; ++i) {
293+
if (_currentHeaders[i].key == name)
294+
return _currentHeaders[i].value;
295+
}
296+
return String();
297+
}
298+
299+
void ESP8266WebServer::collectHeaders(const char* headerKeys[], const size_t headerKeysCount) {
300+
_headerKeysCount = headerKeysCount;
301+
if (_currentHeaders)
302+
delete[]_currentHeaders;
303+
_currentHeaders = new RequestArgument[_headerKeysCount];
304+
for (int i = 0; i < _headerKeysCount; i++){
305+
_currentHeaders[i].key = headerKeys[i];
306+
}
307+
}
308+
309+
String ESP8266WebServer::header(int i) {
310+
if (i < _headerKeysCount)
311+
return _currentHeaders[i].value;
312+
return String();
313+
}
314+
315+
String ESP8266WebServer::headerName(int i) {
316+
if (i < _headerKeysCount)
317+
return _currentHeaders[i].key;
318+
return String();
319+
}
320+
321+
int ESP8266WebServer::headers() {
322+
return _headerKeysCount;
323+
}
324+
325+
bool ESP8266WebServer::hasHeader(const char* name) {
326+
for (int i = 0; i < _headerKeysCount; ++i) {
327+
if ((_currentHeaders[i].key == name) && (_currentHeaders[i].value.length() > 0))
328+
return true;
329+
}
330+
return false;
331+
}
332+
286333
String ESP8266WebServer::hostHeader() {
287334
return _hostHeader;
288335
}

libraries/ESP8266WebServer/src/ESP8266WebServer.h

+9
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,12 @@ class ESP8266WebServer
8383
String argName(int i); // get request argument name by number
8484
int args(); // get arguments count
8585
bool hasArg(const char* name); // check if argument exists
86+
void collectHeaders(const char* headerKeys[], const size_t headerKeysCount); // set the request headers to collect
87+
String header(const char* name); // get request header value by name
88+
String header(int i); // get request header value by number
89+
String headerName(int i); // get request header name by number
90+
int headers(); // get header count
91+
bool hasHeader(const char* name); // check if header exists
8692

8793
String hostHeader(); // get request host header if available or empty String if not
8894

@@ -124,6 +130,7 @@ template<typename T> size_t streamFile(T &file, const String& contentType){
124130
void _uploadWriteByte(uint8_t b);
125131
uint8_t _uploadReadByte(WiFiClient& client);
126132
void _prepareHeader(String& response, int code, const char* content_type, size_t contentLength);
133+
bool _collectHeader(const char* headerName, const char* headerValue);
127134

128135
struct RequestArgument {
129136
String key;
@@ -140,6 +147,8 @@ template<typename T> size_t streamFile(T &file, const String& contentType){
140147
RequestArgument* _currentArgs;
141148
HTTPUpload _currentUpload;
142149

150+
RequestArgument* _currentHeaders;
151+
size_t _headerKeysCount;
143152
size_t _contentLength;
144153
String _responseHeaders;
145154

libraries/ESP8266WebServer/src/Parsing.cpp

+15
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,10 @@ bool ESP8266WebServer::_parseRequest(WiFiClient& client) {
3131
// Read the first line of HTTP request
3232
String req = client.readStringUntil('\r');
3333
client.readStringUntil('\n');
34+
//reset header value
35+
for (int i = 0; i < _headerKeysCount; ++i) {
36+
_currentHeaders[i].value =String();
37+
}
3438

3539
// First line of HTTP request looks like "GET /path HTTP/1.1"
3640
// Retrieve the "/path" part by finding the spaces
@@ -96,6 +100,7 @@ bool ESP8266WebServer::_parseRequest(WiFiClient& client) {
96100
}
97101
headerName = req.substring(0, headerDiv);
98102
headerValue = req.substring(headerDiv + 2);
103+
_collectHeader(headerName.c_str(),headerValue.c_str());
99104

100105
#ifdef DEBUG
101106
DEBUG_OUTPUT.print("headerName: ");
@@ -161,6 +166,7 @@ bool ESP8266WebServer::_parseRequest(WiFiClient& client) {
161166
}
162167
headerName = req.substring(0, headerDiv);
163168
headerValue = req.substring(headerDiv + 2);
169+
_collectHeader(headerName.c_str(),headerValue.c_str());
164170

165171
#ifdef DEBUG
166172
DEBUG_OUTPUT.print("headerName: ");
@@ -187,6 +193,15 @@ bool ESP8266WebServer::_parseRequest(WiFiClient& client) {
187193
return true;
188194
}
189195

196+
bool ESP8266WebServer::_collectHeader(const char* headerName, const char* headerValue) {
197+
for (size_t i = 0; i < _headerKeysCount; i++) {
198+
if (_currentHeaders[i].key==headerName) {
199+
_currentHeaders[i].value=headerValue;
200+
return true;
201+
}
202+
}
203+
return false;
204+
}
190205

191206
void ESP8266WebServer::_parseArguments(String data) {
192207
#ifdef DEBUG

0 commit comments

Comments
 (0)