@@ -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+
851881int 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,
877915static 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