|
@@ -83,15 +83,19 @@ static esp_err_t httpd_static_handler(httpd_req_t *req)
|
|
|
uri = req->uri;
|
|
|
while (*uri == '/')
|
|
|
uri++; /* Skip leading slashes */
|
|
|
-
|
|
|
+
|
|
|
enduri = strchr(uri, '\0');
|
|
|
if (enduri == uri) {
|
|
|
- uri = index_filename; /* Empty string */
|
|
|
- } else if (enduri[0] == '/') {
|
|
|
+ add_index = true;
|
|
|
+ } else if (enduri[-1] == '/') {
|
|
|
add_index = true;
|
|
|
enduri--; /* Drop terminal slash */
|
|
|
+ } else {
|
|
|
+ add_index = false; /* Try the plain filename first */
|
|
|
}
|
|
|
|
|
|
+ MSG("requesting: /%.*s\n", enduri - uri, uri);
|
|
|
+
|
|
|
buffer = malloc(buffer_size);
|
|
|
zip = malloc(sizeof *zip);
|
|
|
if (!buffer || !zip) {
|
|
@@ -99,15 +103,22 @@ static esp_err_t httpd_static_handler(httpd_req_t *req)
|
|
|
goto out;
|
|
|
}
|
|
|
|
|
|
- if (enduri - req->uri + 1 + sizeof index_filename >= buffer_size) {
|
|
|
+ if (enduri - uri + 1 + sizeof index_filename >= buffer_size) {
|
|
|
err = httpd_resp_send_err(req, 414, "URI too long");
|
|
|
goto out;
|
|
|
}
|
|
|
|
|
|
- char *p = mempcpy(buffer, req->uri, enduri - req->uri);
|
|
|
+ char *p = mempcpy(buffer, uri, enduri - uri);
|
|
|
*p = '\0';
|
|
|
|
|
|
- int found;
|
|
|
+ unz = unzOpen(NULL, (void *)gwwwzipData, gwwwzipSize,
|
|
|
+ zip, NULL, NULL, NULL, NULL);
|
|
|
+ if (!unz) {
|
|
|
+ MSG("[HTTP] unzOpen failed!\n");
|
|
|
+ err = httpd_resp_send_err(req, 500, "Cannot open content archive");
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+
|
|
|
while (1) {
|
|
|
if (add_index) {
|
|
|
if (p > buffer)
|
|
@@ -115,6 +126,7 @@ static esp_err_t httpd_static_handler(httpd_req_t *req)
|
|
|
p = mempcpy(p, index_filename, sizeof index_filename);
|
|
|
}
|
|
|
|
|
|
+ MSG("trying to open: %s\n", buffer);
|
|
|
if (unzLocateFile(unz, buffer, 1) == UNZ_OK)
|
|
|
break;
|
|
|
|
|
@@ -123,14 +135,14 @@ static esp_err_t httpd_static_handler(httpd_req_t *req)
|
|
|
goto out;
|
|
|
}
|
|
|
|
|
|
- add_index = true; /* Try again with the index file */
|
|
|
+ add_index = true; /* Try again with the index filename */
|
|
|
}
|
|
|
|
|
|
/* Note: p points to the end of the filename string */
|
|
|
size_t filelen = p - buffer;
|
|
|
-
|
|
|
+
|
|
|
const struct mime_type *mime_type = mime_types;
|
|
|
- /* The default entry with extension "" will always match */
|
|
|
+ /* The default entry with length 0 will always match */
|
|
|
while (mime_type->ext_len) {
|
|
|
len = mime_type->ext_len;
|
|
|
|
|
@@ -139,13 +151,6 @@ static esp_err_t httpd_static_handler(httpd_req_t *req)
|
|
|
|
|
|
mime_type++;
|
|
|
}
|
|
|
-
|
|
|
- unz = unzOpen(NULL, (void *)gwwwzipData, gwwwzipSize,
|
|
|
- zip, NULL, NULL, NULL, NULL);
|
|
|
- if (!unz) {
|
|
|
- err = httpd_resp_send_err(req, 500, "Cannot open content archive");
|
|
|
- goto out;
|
|
|
- }
|
|
|
|
|
|
unz_file_info fileinfo;
|
|
|
memset(&fileinfo, 0, sizeof fileinfo);
|
|
@@ -156,7 +161,7 @@ static esp_err_t httpd_static_handler(httpd_req_t *req)
|
|
|
* way to not have to build the whole response in memory even
|
|
|
* though the length is known a priori.
|
|
|
*/
|
|
|
-
|
|
|
+
|
|
|
len = snprintf(buffer, buffer_size,
|
|
|
"HTTP/1.1 200 OK\r\n"
|
|
|
"Content-Type: %s\r\n"
|
|
@@ -188,7 +193,7 @@ static esp_err_t httpd_static_handler(httpd_req_t *req)
|
|
|
goto out;
|
|
|
}
|
|
|
file_open = true;
|
|
|
-
|
|
|
+
|
|
|
len = fileinfo.uncompressed_size;
|
|
|
while (len) {
|
|
|
size_t chunk = len;
|
|
@@ -223,19 +228,19 @@ out:
|
|
|
|
|
|
static const httpd_uri_t uri_handlers[] = {
|
|
|
{
|
|
|
- .uri = "/",
|
|
|
+ .uri = "/*",
|
|
|
.method = HTTP_GET,
|
|
|
.handler = httpd_static_handler,
|
|
|
.user_ctx = NULL
|
|
|
},
|
|
|
{
|
|
|
- .uri = "/",
|
|
|
+ .uri = "/*",
|
|
|
.method = HTTP_HEAD,
|
|
|
.handler = httpd_static_handler,
|
|
|
.user_ctx = NULL
|
|
|
},
|
|
|
{
|
|
|
- .uri = "/firmware-upgrade",
|
|
|
+ .uri = "/fwupdate/?",
|
|
|
.method = HTTP_POST,
|
|
|
.handler = httpd_firmware_upgrade_handler,
|
|
|
.user_ctx = NULL
|
|
@@ -265,6 +270,8 @@ void my_httpd_start(void)
|
|
|
config.stack_size <<= 2;
|
|
|
printf("[HTTP] Requesting stack size: %zu\n", config.stack_size);
|
|
|
|
|
|
+ config.uri_match_fn = httpd_uri_match_wildcard;
|
|
|
+
|
|
|
if (httpd_start(&server, &config) != ESP_OK)
|
|
|
return;
|
|
|
|