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

Lines changed: 23 additions & 11 deletions
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

Lines changed: 17 additions & 0 deletions
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

Lines changed: 8 additions & 1 deletion
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

Lines changed: 3 additions & 1 deletion
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

Lines changed: 7 additions & 5 deletions
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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy