Skip to content

Commit 64f747f

Browse files
krish2718rlubos
authored andcommitted
net: lib: softap_wifi_provision: Add CORS headers
In case provisioning is done by a webapp using AJAX then without CORS headers the request fails. Fix by adding CORS headers with wildcard (any origin) accept. Signed-off-by: Chaitanya Tata <[email protected]>
1 parent 220a0d5 commit 64f747f

File tree

1 file changed

+95
-8
lines changed

1 file changed

+95
-8
lines changed

subsys/net/lib/softap_wifi_provision/softap_wifi_provision.c

Lines changed: 95 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -848,20 +848,58 @@ static int send_response(struct http_req *request, char *response, size_t len, i
848848
return 0;
849849
}
850850

851+
/* Append CORS headers and final CRLF to HTTP response.
852+
*
853+
* @param[in,out] response Response buffer to append CORS headers to.
854+
* @param[in] len Maximum size of the response buffer.
855+
* @param[in,out] current_len Current length of the response string, updated
856+
* to new length after appending CORS headers and CRLF.
857+
*
858+
* @retval 0 on success.
859+
* @retval -ENOMEM if buffer is too small.
860+
*/
861+
static int append_cors_headers_and_crlf(char *response, size_t len, size_t *current_len)
862+
{
863+
int ret;
864+
size_t remaining = len - *current_len;
865+
866+
ret = snprintk(response + *current_len, remaining,
867+
"Access-Control-Allow-Origin: *\r\n"
868+
"Access-Control-Allow-Methods: GET, POST, OPTIONS\r\n"
869+
"Access-Control-Allow-Headers: Content-Type\r\n"
870+
"Access-Control-Max-Age: 86400\r\n"
871+
"\r\n");
872+
if ((ret < 0) || (ret >= remaining)) {
873+
LOG_ERR("snprintk, error: %d", ret);
874+
return -ENOMEM;
875+
}
876+
877+
*current_len += ret;
878+
return 0;
879+
}
880+
851881
int method_verify(enum http_method method, enum http_method method_expected,
852882
char *response, size_t len, int socket)
853883
{
854884
int ret;
885+
size_t current_len;
855886

856887
if (method != method_expected) {
857-
ret = snprintk(response, len, "%sContent-Length: %d\r\n\r\n",
888+
ret = snprintk(response, len, "%sContent-Length: %d\r\n",
858889
RESPONSE_405, 0);
859890
if ((ret < 0) || (ret >= len)) {
860891
LOG_DBG("snprintk, error: %d", ret);
861892
return ret;
862893
}
863894

864-
ret = send_response(&request, response, strlen(response), socket);
895+
current_len = ret;
896+
ret = append_cors_headers_and_crlf(response, len, &current_len);
897+
if (ret) {
898+
LOG_ERR("append_cors_headers_and_crlf, error: %d", ret);
899+
return ret;
900+
}
901+
902+
ret = send_response(&request, response, current_len, socket);
865903
if (ret) {
866904
LOG_ERR("send_response, error: %d", ret);
867905
return ret;
@@ -877,6 +915,32 @@ int method_verify(enum http_method method, enum http_method method_expected,
877915
static int http_request_handle(struct http_req *request, char *response, size_t len, int socket)
878916
{
879917
int ret;
918+
size_t current_len;
919+
920+
/* Handle OPTIONS preflight requests for CORS */
921+
if (request->method == HTTP_OPTIONS) {
922+
ret = snprintk(response, len, "%sContent-Length: %d\r\n",
923+
RESPONSE_200, 0);
924+
if ((ret < 0) || (ret >= len)) {
925+
LOG_DBG("snprintk, error: %d", ret);
926+
return ret;
927+
}
928+
929+
current_len = ret;
930+
ret = append_cors_headers_and_crlf(response, len, &current_len);
931+
if (ret) {
932+
LOG_ERR("append_cors_headers_and_crlf, error: %d", ret);
933+
return ret;
934+
}
935+
936+
ret = send_response(request, response, current_len, socket);
937+
if (ret) {
938+
LOG_ERR("send_response, error: %d", ret);
939+
return ret;
940+
}
941+
942+
return 0;
943+
}
880944

881945
if ((strlen(request->url) == sizeof("/prov/networks") - 1) &&
882946
(strncmp(request->url, "/prov/networks", strlen(request->url)) == 0)) {
@@ -892,15 +956,22 @@ static int http_request_handle(struct http_req *request, char *response, size_t
892956
}
893957

894958
ret = snprintk(response, len,
895-
"%sContent-Type: application/x-protobuf\r\nContent-Length: %d\r\n\r\n",
959+
"%sContent-Type: application/x-protobuf\r\nContent-Length: %d\r\n",
896960
RESPONSE_200, scan_result_buffer_len);
897961
if ((ret < 0) || (ret >= len)) {
898962
LOG_DBG("snprintk, error: %d", ret);
899963
return ret;
900964
}
901965

966+
current_len = ret;
967+
ret = append_cors_headers_and_crlf(response, len, &current_len);
968+
if (ret) {
969+
LOG_ERR("append_cors_headers_and_crlf, error: %d", ret);
970+
return ret;
971+
}
972+
902973
/* Send headers */
903-
ret = send_response(request, response, strlen(response), socket);
974+
ret = send_response(request, response, current_len, socket);
904975
if (ret) {
905976
LOG_ERR("send_response (headers), error: %d", ret);
906977
return ret;
@@ -932,13 +1003,21 @@ static int http_request_handle(struct http_req *request, char *response, size_t
9321003
return ret;
9331004
}
9341005

935-
ret = snprintk(response, len, "%sContent-Length: %d\r\n\r\n", RESPONSE_200, 0);
1006+
ret = snprintk(response, len, "%sContent-Length: %d\r\n",
1007+
RESPONSE_200, 0);
9361008
if ((ret < 0) || (ret >= len)) {
9371009
LOG_DBG("snprintk, error: %d", ret);
9381010
return ret;
9391011
}
9401012

941-
ret = send_response(request, response, strlen(response), socket);
1013+
current_len = ret;
1014+
ret = append_cors_headers_and_crlf(response, len, &current_len);
1015+
if (ret) {
1016+
LOG_ERR("append_cors_headers_and_crlf, error: %d", ret);
1017+
return ret;
1018+
}
1019+
1020+
ret = send_response(request, response, current_len, socket);
9421021
if (ret) {
9431022
LOG_ERR("send_response, error: %d", ret);
9441023
return ret;
@@ -949,14 +1028,22 @@ static int http_request_handle(struct http_req *request, char *response, size_t
9491028
} else {
9501029
LOG_DBG("Unrecognized HTTP resource, ignoring...");
9511030

952-
ret = snprintk(response, len, "%sContent-Length: %d\r\n\r\n", RESPONSE_404, 0);
1031+
ret = snprintk(response, len, "%sContent-Length: %d\r\n",
1032+
RESPONSE_404, 0);
9531033
if ((ret < 0) || (ret >= len)) {
9541034
LOG_DBG("snprintk, error: %d", ret);
9551035
return ret;
9561036
}
9571037

1038+
current_len = ret;
1039+
ret = append_cors_headers_and_crlf(response, len, &current_len);
1040+
if (ret) {
1041+
LOG_ERR("append_cors_headers_and_crlf, error: %d", ret);
1042+
return ret;
1043+
}
1044+
9581045
/* Send headers */
959-
ret = send_response(request, response, strlen(response), socket);
1046+
ret = send_response(request, response, current_len, socket);
9601047
if (ret) {
9611048
LOG_ERR("send_response (headers), error: %d", ret);
9621049
return ret;

0 commit comments

Comments
 (0)