Skip to content

Commit e9b184c

Browse files
committed
ESP8266WebServer: pathArgs() to complement pathArg(N)
similar to ::args(), returns number of parsed path arguments shortened esp8266#9100
1 parent c2f1365 commit e9b184c

File tree

5 files changed

+58
-18
lines changed

5 files changed

+58
-18
lines changed

libraries/ESP8266WebServer/README.rst

+23-11
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,10 @@ Class Constructor
1616
1717
Creates the ESP8266WebServer class object.
1818

19-
*Parameters:*
19+
*Parameters:*
2020

2121
host IP address: ``IPaddress addr`` (optional)
22-
22+
2323
host port number: ``int port`` (default is the standard HTTP port 80)
2424

2525
Basic Operations
@@ -61,7 +61,7 @@ Client request handlers
6161
void onNotFound();
6262
void onFileUpload();
6363
64-
*Example:*
64+
*Example:*
6565

6666
.. code:: cpp
6767
@@ -75,7 +75,7 @@ Client request filters
7575
^^^^^^^^^^^^^^^^^^^^^^
7676

7777
.. code:: cpp
78-
78+
7979
RequestHandler<ServerType>& setFilter();
8080
8181
*Example:*
@@ -110,10 +110,10 @@ Getting information about request arguments
110110

111111
.. code:: cpp
112112
113-
const String & arg();
114-
const String & argName();
113+
const String & arg(int);
114+
const String & argName(int);
115115
int args();
116-
bool hasArg();
116+
bool hasArg(const String&);
117117
118118
``arg`` - get request argument value, use ``arg("plain")`` to get POST body
119119

@@ -133,14 +133,14 @@ Getting information about request headers
133133
const String & hostHeader();
134134
int headers();
135135
bool hasHeader();
136-
136+
137137
138138
``header`` - get request header value
139139

140140
``headerName`` - get request header name
141141

142142
``hostHeader`` - get request host header if available, else empty string
143-
143+
144144
``headers`` - get header count
145145

146146
``hasHeader`` - check if header exist
@@ -165,20 +165,32 @@ Authentication
165165
server.requestAuthentication();
166166
}
167167
168+
Getting information about request path arguments
169+
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
170+
171+
.. code:: cpp
172+
173+
const String & pathArg(int) const;
174+
int pathArgs() const;
175+
176+
``pathArg`` - get request path argument by index (starting with 0)
177+
178+
``pathArgs`` - get path arguments count, make sure to check it before accessing ``pathArg`` value
179+
168180

169181
Other Function Calls
170182
~~~~~~~~~~~~~~~~~~~~
171183

172184
.. code:: cpp
173185
174186
const String & uri(); // get the current uri
175-
HTTPMethod method(); // get the current method
187+
HTTPMethod method(); // get the current method
176188
WiFiClient & client(); // get the current client
177189
HTTPUpload & upload(); // get the current upload
178190
void setContentLength(); // set content length
179191
void sendHeader(); // send HTTP header
180192
void sendContent(); // send content
181-
void sendContent_P();
193+
void sendContent_P();
182194
void collectHeaders(); // set the request headers to collect
183195
void serveStatic();
184196
size_t streamFile();

libraries/ESP8266WebServer/examples/PathArgServer/PathArgServer.ino

+17
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,15 @@ const char *password = STAPSK;
1616

1717
ESP8266WebServer server(80);
1818

19+
bool checkPathArgs(int number) {
20+
if (server.pathArgs() == number) {
21+
return true;
22+
}
23+
24+
server.send(500, "text/plain", "request handler received unexpected number of path arguments");
25+
return false;
26+
}
27+
1928
void setup(void) {
2029
Serial.begin(115200);
2130
WiFi.mode(WIFI_STA);
@@ -40,11 +49,19 @@ void setup(void) {
4049
});
4150

4251
server.on(UriBraces("/users/{}"), []() {
52+
if (!checkPathArgs(1)) {
53+
return;
54+
}
55+
4356
String user = server.pathArg(0);
4457
server.send(200, "text/plain", "User: '" + user + "'");
4558
});
4659

4760
server.on(UriRegex("^\\/users\\/([0-9]+)\\/devices\\/([0-9]+)$"), []() {
61+
if (!checkPathArgs(2)) {
62+
return;
63+
}
64+
4865
String user = server.pathArg(0);
4966
String device = server.pathArg(1);
5067
server.send(200, "text/plain", "User: '" + user + "' and Device: '" + device + "'");

libraries/ESP8266WebServer/src/ESP8266WebServer-impl.h

+8-1
Original file line numberDiff line numberDiff line change
@@ -657,8 +657,15 @@ void ESP8266WebServerTemplate<ServerType>::_streamFileCore(const size_t fileSize
657657
}
658658

659659
template <typename ServerType>
660-
const String& ESP8266WebServerTemplate<ServerType>::pathArg(unsigned int i) const {
660+
int ESP8266WebServerTemplate<ServerType>::pathArgs() const {
661661
if (_currentHandler != nullptr)
662+
return _currentHandler->pathArgsSize();
663+
return 0;
664+
}
665+
666+
template <typename ServerType>
667+
const String& ESP8266WebServerTemplate<ServerType>::pathArg(int i) const {
668+
if (i >= 0 && _currentHandler != nullptr && (size_t)i < _currentHandler->pathArgsSize())
662669
return _currentHandler->pathArg(i);
663670
return emptyString;
664671
}

libraries/ESP8266WebServer/src/ESP8266WebServer.h

+3-1
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,9 @@ class ESP8266WebServerTemplate
141141
// Allows setting server options (i.e. SSL keys) by the instantiator
142142
ServerType &getServer() { return _server; }
143143

144-
const String& pathArg(unsigned int i) const; // get request path argument by number
144+
const String& pathArg(int i) const; // get request path argument by number
145+
int pathArgs() const; // get path arguments count
146+
145147
const String& arg(const String& name) const; // get request argument value by name
146148
const String& arg(int i) const; // get request argument value by number
147149
const String& argName(int i) const; // get request argument name by number

libraries/ESP8266WebServer/src/detail/RequestHandler.h

+7-5
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33

44
#include <ESP8266WebServer.h>
55
#include <vector>
6-
#include <assert.h>
76

87
namespace esp8266webserver {
98

@@ -16,7 +15,7 @@ class RequestHandler {
1615
/*
1716
note: old handler API for backward compatibility
1817
*/
19-
18+
2019
virtual bool canHandle(HTTPMethod method, const String& uri) {
2120
(void) method;
2221
(void) uri;
@@ -43,7 +42,7 @@ class RequestHandler {
4342
return false;
4443
}
4544
virtual bool handle(WebServerType& server, HTTPMethod requestMethod, const String& requestUri) {
46-
(void) server;
45+
(void) server;
4746
(void) requestMethod;
4847
(void) requestUri;
4948
return false;
@@ -74,8 +73,11 @@ class RequestHandler {
7473
std::vector<String> pathArgs;
7574

7675
public:
77-
const String& pathArg(unsigned int i) {
78-
assert(i < pathArgs.size());
76+
size_t pathArgsSize() const {
77+
return pathArgs.size();
78+
}
79+
80+
const String& pathArg(unsigned int i) const {
7981
return pathArgs[i];
8082
}
8183
};

0 commit comments

Comments
 (0)