From 8414f4a6a341ba7ecb911f2e7316c968da577cdc Mon Sep 17 00:00:00 2001 From: Jm Casler Date: Fri, 16 Oct 2020 16:36:52 -0700 Subject: [PATCH 1/5] Added access-control-allow headers --- src/meshwifi/meshhttp.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/meshwifi/meshhttp.cpp b/src/meshwifi/meshhttp.cpp index 38492db38..db705ebb5 100644 --- a/src/meshwifi/meshhttp.cpp +++ b/src/meshwifi/meshhttp.cpp @@ -332,6 +332,8 @@ void handleAPIv1FromRadio(HTTPRequest *req, HTTPResponse *res) // Status code is 200 OK by default. res->setHeader("Content-Type", "application/x-protobuf"); + res->setHeader("Access-Control-Allow-Origin", "*"); + res->setHeader("Access-Control-Allow-Methods", "PUT, GET"); uint8_t txBuf[MAX_STREAM_BUF_SIZE]; @@ -359,6 +361,8 @@ void handleAPIv1ToRadio(HTTPRequest *req, HTTPResponse *res) // Status code is 200 OK by default. res->setHeader("Content-Type", "application/x-protobuf"); + res->setHeader("Access-Control-Allow-Origin", "*"); + res->setHeader("Access-Control-Allow-Methods", "PUT, GET"); byte buffer[MAX_TO_FROM_RADIO_SIZE]; size_t s = req->readBytes(buffer, MAX_TO_FROM_RADIO_SIZE); From b9df2c00fa38412b9b0fb08b0484214d714257ca Mon Sep 17 00:00:00 2001 From: Jm Casler Date: Fri, 16 Oct 2020 17:07:35 -0700 Subject: [PATCH 2/5] fromradio all option requesting fromradio will return one protobuf 4:56 requesting fromradio?all=true will give you all of them. --- src/meshwifi/meshhttp.cpp | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/meshwifi/meshhttp.cpp b/src/meshwifi/meshhttp.cpp index db705ebb5..bd5bd1e8f 100644 --- a/src/meshwifi/meshhttp.cpp +++ b/src/meshwifi/meshhttp.cpp @@ -330,15 +330,31 @@ void handleAPIv1FromRadio(HTTPRequest *req, HTTPResponse *res) http://10.10.30.198/api/v1/fromradio */ + // Get access to the parameters + ResourceParameters *params = req->getParams(); + + // std::string paramAll = "all"; + std::string valueAll; + // Status code is 200 OK by default. res->setHeader("Content-Type", "application/x-protobuf"); res->setHeader("Access-Control-Allow-Origin", "*"); res->setHeader("Access-Control-Allow-Methods", "PUT, GET"); uint8_t txBuf[MAX_STREAM_BUF_SIZE]; - uint32_t len = 1; - while (len) { + + if (params->getQueryParameter("all", valueAll)) { + if (valueAll == "true") { + while (len) { + len = webAPI.getFromRadio(txBuf); + res->write(txBuf, len); + } + } else { + len = webAPI.getFromRadio(txBuf); + res->write(txBuf, len); + } + } else { len = webAPI.getFromRadio(txBuf); res->write(txBuf, len); } From ba549d8fcdb25fc95a5393f1cd5d8552a6cc625d Mon Sep 17 00:00:00 2001 From: Jm Casler Date: Fri, 16 Oct 2020 17:41:08 -0700 Subject: [PATCH 3/5] Return OPTIONS when requested for toradio --- src/meshwifi/meshhttp.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/meshwifi/meshhttp.cpp b/src/meshwifi/meshhttp.cpp index bd5bd1e8f..a05d3d623 100644 --- a/src/meshwifi/meshhttp.cpp +++ b/src/meshwifi/meshhttp.cpp @@ -207,6 +207,7 @@ void initWebServer() // For every resource available on the server, we need to create a ResourceNode // The ResourceNode links URL and HTTP method to a handler function + ResourceNode *nodeAPIv1ToRadioOptions = new ResourceNode("/api/v1/toradio", "OPTIONS", &handleAPIv1ToRadio); ResourceNode *nodeAPIv1ToRadio = new ResourceNode("/api/v1/toradio", "PUT", &handleAPIv1ToRadio); ResourceNode *nodeAPIv1FromRadio = new ResourceNode("/api/v1/fromradio", "GET", &handleAPIv1FromRadio); ResourceNode *nodeCSS = new ResourceNode("/css/style.css", "GET", &handleStyleCSS); @@ -217,6 +218,7 @@ void initWebServer() ResourceNode *node404 = new ResourceNode("", "GET", &handle404); // Secure nodes + secureServer->registerNode(nodeAPIv1ToRadioOptions); secureServer->registerNode(nodeAPIv1ToRadio); secureServer->registerNode(nodeAPIv1FromRadio); secureServer->registerNode(nodeCSS); @@ -229,6 +231,7 @@ void initWebServer() secureServer->addMiddleware(&middlewareSpeedUp240); // Insecure nodes + insecureServer->registerNode(nodeAPIv1ToRadioOptions); insecureServer->registerNode(nodeAPIv1ToRadio); insecureServer->registerNode(nodeAPIv1FromRadio); insecureServer->registerNode(nodeCSS); @@ -378,7 +381,14 @@ void handleAPIv1ToRadio(HTTPRequest *req, HTTPResponse *res) // Status code is 200 OK by default. res->setHeader("Content-Type", "application/x-protobuf"); res->setHeader("Access-Control-Allow-Origin", "*"); - res->setHeader("Access-Control-Allow-Methods", "PUT, GET"); + res->setHeader("Access-Control-Allow-Methods", "PUT, OPTIONS"); + + if (req->getMethod() == "OPTIONS") { + res->setStatusCode(204); + res->print(""); + return; + } + byte buffer[MAX_TO_FROM_RADIO_SIZE]; size_t s = req->readBytes(buffer, MAX_TO_FROM_RADIO_SIZE); From 8f0105ccd9eebbf7a3f45cc011294a4906cf6a60 Mon Sep 17 00:00:00 2001 From: Jm Casler Date: Fri, 16 Oct 2020 17:46:22 -0700 Subject: [PATCH 4/5] don't send content-type when options is set --- src/meshwifi/meshhttp.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/meshwifi/meshhttp.cpp b/src/meshwifi/meshhttp.cpp index a05d3d623..bba6db6da 100644 --- a/src/meshwifi/meshhttp.cpp +++ b/src/meshwifi/meshhttp.cpp @@ -379,7 +379,11 @@ void handleAPIv1ToRadio(HTTPRequest *req, HTTPResponse *res) */ // Status code is 200 OK by default. - res->setHeader("Content-Type", "application/x-protobuf"); + + if (req->getMethod() != "OPTIONS") { + res->setHeader("Content-Type", "application/x-protobuf"); + } + res->setHeader("Access-Control-Allow-Origin", "*"); res->setHeader("Access-Control-Allow-Methods", "PUT, OPTIONS"); From 0d9481b6ea81e3dace9ca82b21568f3d77383f83 Mon Sep 17 00:00:00 2001 From: Jm Casler Date: Fri, 16 Oct 2020 18:00:28 -0700 Subject: [PATCH 5/5] add allow-headers --- src/meshwifi/meshhttp.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/meshwifi/meshhttp.cpp b/src/meshwifi/meshhttp.cpp index bba6db6da..85e4bf73e 100644 --- a/src/meshwifi/meshhttp.cpp +++ b/src/meshwifi/meshhttp.cpp @@ -382,8 +382,12 @@ void handleAPIv1ToRadio(HTTPRequest *req, HTTPResponse *res) if (req->getMethod() != "OPTIONS") { res->setHeader("Content-Type", "application/x-protobuf"); + } else { + res->setHeader("Content-Type", "application/x-protobuf"); + } - + + res->setHeader("Access-Control-Allow-Headers", "Content-Type"); res->setHeader("Access-Control-Allow-Origin", "*"); res->setHeader("Access-Control-Allow-Methods", "PUT, OPTIONS");