* Remove warnings, errors during host tests in CI
Debug strings often included format parameters which did not exactly match
the passed in format parameters, resulting in warnings in the host test build
process like
````
/home/runner/work/Arduino/Arduino/libraries/ESP8266WiFi/src/ESP8266WiFiAP.cpp:107:20: warning: format ‘%u’ expects argument of type ‘unsigned int’, but argument 3 has type ‘size_t’ {aka ‘long unsigned int’} [-Wformat=]
107 | DEBUG_WIFI("[AP] SSID length %u, too long or missing!\n", ssid_len);
| ~~~~~~~~
| |
| size_t {aka long unsigned int}
````
Fix by applying casting or PRxxx macros as appropriate.
Also, fix one debug message which was trying to use a `String` as a `char *`:
````
/home/runner/work/Arduino/Arduino/libraries/ESP8266WiFi/src/ESP8266WiFiMulti.cpp: In member function ‘wl_status_t ESP8266WiFiMulti::connectWiFiMulti(uint32_t)’:
/home/runner/work/Arduino/Arduino/libraries/ESP8266WiFi/src/ESP8266WiFiMulti.cpp:331:34: warning: format ‘%s’ expects argument of type ‘char*’, but argument 3 has type ‘String’ [-Wformat=]
331 | DEBUG_WIFI_MULTI("[WIFIM] Connecting %s\n", ssid);
````
* Clean up SpeedTest.ino host build
* ESP8266WebServer - drop current HC_WAIT_READ connection sooner when another has data
Safari sometimes opens two connections when loading a page and only
sends a request over the second one, resulting in a 5 second wait
(HTTP_MAX_DATA_WAIT) before the request is processed. This commit
drops the current connection after 30ms (HTTP_MAX_DATA_AVAILABLE_WAIT)
when there is a new connection with data available or the buffer of
pending TCP clients is full (currently 5).
fixes for WiFiClient::write(Stream) and Stream transfers
- remove deprecated WiFiClient::write(Stream,size)
- fix and deprecate WiFiClient::write(Stream) to use Stream::sendAll instead of ::sendAvailable
- update ESP8266WebServer::streamFile to use file.sendAll(client) instead of client.write(file)
- remove stream dependence in ClientContext
- Stream::send(): honor timeout in all case, avoid short transfer when output is temporarily full
- example WiFiEcho: show sendAll and sendAvailable
* More user-friendly, less RODATA usage.
eg. `webServer.collectHeaders(F("Content-Type"), F("Origin"));`
In this example, less about 20 bytes than the traditional way.
When a file upload ends in \r\n (i.e. a Windows formatted text file) the
sequence of bytes on the wire is `\r\n\r\n----...boundary-marker...`.
When the FSM in Webserver was evaluating the stream, that 2nd `\r` would
be written as valid data and the FSM parser would be reset and see `\n`
as the 1st character, which wouldn't match. This would a) add an extra
`\r` to uploaded files, and b) cause uploads to hang.
Fix by checking on a header FSM mismatch if the next character input
could possibly match our marker, and if so handle it properly.
Fixes#7803
* implemented with native md5
* testing locals variables
* less memory used, partil refactoring
* reworked serveStatic logic, different handler for File and Directory
Use a simpler, cleaner implementation of multipart form detection as
defined in https://tools.ietf.org/html/rfc7578 .
Implements a simple state machine that detects the `\r\n--<boundary>`
stream in input a character at a time, instead of buffering and
comparing in chunks which can miss things due to alignment issues and
which also had a problem with replacing characters in a binary stream.
Adjust the private _uploadReadByte function to return -1 on error (like
a read()), and the main file upload handler to use that return value
instead of duplicating logic.
Fixes#7723
The boundary parsing in the webserver could end up missing boundaries if the
uploaded file had `--` at the start of the line because it read in the entire boundary
length worth of bytes. Fix by only reading up to either the boundary length or
a newline, avoiding the issue.
Fixes#7542
* webhook api
* simplify webserver debug printouts, move text to flash
* Hook examples in HelloServer example
* print executable code address in example
* simplify example per @mcspr suggestion
* WebServer: Allow client to send many requests on the same connection
* WebServer: Keep the connection alive with a client by default
* WebServer: Use the request's HTTP version and Connection header to set the default keep alive value
* Fix a typo in a comment
* Flash size reduction for mime-type
* moving from fixed size strings to standard PROGMEM strings
* adding `#define MIMETYPE_MINIMAL` to reduce the footprint to
mime-types that are strictly necessary
* Added MIMETYPE_MINIMAL conditionals
* Refactored to make getContentType public for 3rd party use.
* Added missing "jpeg" extension
* Use getContentType() from mime namespace.
* Also add .jpeg extension
* Update Uri.h
* Add a simple test for the new constructor
Convert a c-str to a FPSTR in the example to have a section
of code in our CI that will catch any future breaks of this specific
kind.
Co-authored-by: Earle F. Philhower, III <earlephilhower@yahoo.com>
Previously, when the path was a directory, but didn't have a slash at
the end, a 0 byte response would be sent when using LittleFS. Now, it
will return a 404, like was always the case when using SPIFFS.
* Add path args
* Add example
* Update code format
* Add missing include
* Fix codestyle and unsigned int
* fix unsigned int
* Remove tabs
* use vector<>.resize
* rename j to requestUriIndex
* using assert checking the path argument index
* Add missing include "assert.h"
* The order no longer matters.
Path arguments may not contain the value '/'
Updated the example
* make pathArg return a const
* Update PathArgServer.ino
fix trailing space
* const String&
* Add regex support
* Fix to match templating
* Add Uri with support for staticUri, regexUri and globUri
* Update example
* Add deconstructor to remove _uri pointer
* Add newline to end of files
* Suppress gcc warnings (unused params)
* Replace regex with regex.h
* Use the standard STASSID/PSK settings for example
Make the example match the existing examples which allow setting
the SSID/PSK in the local platform.txt file.
* Use 115.2Kbaud for example, match others
Co-authored-by: david gauchard <gauchard@laas.fr>
Co-authored-by: Earle F. Philhower, III <earlephilhower@yahoo.com>
Fixes#6984
When a directory index is requested with an explicit index.html, follow
the original webserver order and check for: index.htm, index.htm.gz,
index.html, index.html.gz, in order.
Fixes the regressions introduced in 9f2cfb8 and 6768116
* Remove trailing whitespace
* Improve "is file" check for LittleFS support
The previous implementation was based on a quirk of SPIFFS (that exists
returns false for directories) so it wouldn't work with LittleFS. This
implementation works with both.
Co-authored-by: Develo <deveyes@gmail.com>
* PROGMEM footprint cleanup for responseCodeToString
Doing returns with String/FlashStringHelper conversion for every
case means that the code for doing that is duplicated, which
is wasteful. doing it only once saves about 250 bytes (50%) of
code size.
* Remove "I'm a teapot" error code
* Add inline code comment to explain rationale
Use the proper api (::clear(), isEmpty()) instead of doing
comparisons/assignments of empty strings. Also fix mixture
of tabs and spaces in the source code.
The method #send(int, char*, char*[, size_t])) is a virtual method which
calculates the size of the content then calls #send_P(int, PGM_P, PGM_P,
size_t). This particular implementation of #send_P differs from the other
implementations of #send and #send_P in that it uses #sendContent for
headers and always calls #sendContent_P for contents even when the
contents is not specified.
The method #sendContent is intended for body and prepends the chunksize
in chunk mode but this breaks the HTTP protocol which does not expect a
chunksize prior to the headers.
Fix is simply to do the same thing as all the other methods - call
_currentClient.write and only call #sendContent_P if there is content to
send.
* Add const char* content to ESP8266WebSerer::send()
Supercedes #3492
Allow sending raw binary data or strings directly without conversion to
a String to reduce memory overhead when possible.
From original @timw1971 PR #3492
Added public functions to allow content to be uploaded using const
char*. For some cases, this can remove the need for content to be copied
into a String, and thus can be considerably more space-efficient.
* Fix example formatting
* Make GIF example use static const array
* Make the example really need to use const char*
Make the generated GIF dynamic in the example and move the original to
PROGMEM (since that's where const arrays like this belong).
Fixes#6792
Only append the "l" to ".htm" when there actually is a ".html" file
present. If not, fall-thru like before and try .gz through the normal
paths.
There are actually several instances where we pass in read-only
parameters as pass-by-value, where in the case of String() that
is inefficient as it involves copy-constructor/temp string creations.
We can avoid that, similarly to single character string concatenations
done via string literals instead of char literals.
* Put longer string literals into PROGMEM
* Use Flash Strings for Debug output
This is hopefully very infrequently used, so it shouldn't
be in main memory.
* Add HTTP_HEAD to HTTPMethod
* Parse the HTTP_HEAD variant of HTTPMethod from a method string
* Add HTTP_HEAD to the ESP8266WebServer constants
* Skip sending the content of the response if the HTTP method is HEAD method
* Convert the HTTP status code 418 to string
This status code is an easter egg from the IETF and is described in
[RFC2324](https://tools.ietf.org/html/rfc2324#section-2.3.2)
Fixes#2567
Allow the web server to send plain C strings instead of requring they be
encapsulated inside a String class object. Saves memory vs. having to
convert C strings to Strings (i.e. duplication of data), overloads on
the efficient sendContent_P(char*) methods.