@@ -73,6 +73,7 @@ nothrow @nogc:
7373 {
7474 _server.add_uri_handler(HTTPMethod.GET , _uri, &handle_request);
7575 _server.add_uri_handler(HTTPMethod.POST , _uri, &handle_request);
76+ _server.add_uri_handler(HTTPMethod.OPTIONS , _uri, &handle_request);
7677 }
7778 else
7879 _default_handler = _server.hook_global_handler(&handle_request);
@@ -110,6 +111,10 @@ private:
110111 {
111112 const (char )[] tail = request.request_target[_uri.length .. $];
112113
114+ // Handle CORS preflight OPTIONS requests
115+ if (request.method == HTTPMethod.OPTIONS )
116+ return handle_options (request, stream);
117+
113118 if (tail == " /health" )
114119 return handle_health (request, stream);
115120 if (tail == " /cli/execute" )
@@ -126,9 +131,25 @@ private:
126131 return 0 ;
127132 }
128133
134+ void add_cors_headers (ref HTTPMessage response)
135+ {
136+ response.headers ~= HTTPParam(StringLit! " Access-Control-Allow-Origin" , StringLit! " *" );
137+ response.headers ~= HTTPParam(StringLit! " Access-Control-Allow-Methods" , StringLit! " GET, POST, PUT, DELETE, OPTIONS" );
138+ response.headers ~= HTTPParam(StringLit! " Access-Control-Allow-Headers" , StringLit! " Content-Type" );
139+ }
140+
141+ int handle_options (ref const HTTPMessage request, ref Stream stream)
142+ {
143+ HTTPMessage response = create_response(request.http_version, 204 , StringLit! " No Content" , String(), null );
144+ add_cors_headers(response);
145+ stream.write(response.format_message()[]);
146+ return 0 ;
147+ }
148+
129149 int handle_health (ref const HTTPMessage request, ref Stream stream)
130150 {
131151 HTTPMessage response = create_response(request.http_version, 200 , StringLit! " OK" , StringLit! " application/json" , tconcat(" {\" status\" :\" healthy\" ,\" uptime\" :" , getAppTime().as! " seconds" , " }" ));
152+ add_cors_headers(response);
132153 stream.write(response.format_message()[]);
133154 return 0 ;
134155 }
@@ -149,6 +170,7 @@ private:
149170 if (command_text.length == 0 )
150171 {
151172 HTTPMessage response = create_response(request.http_version, 400 , StringLit! " Bad Request" , StringLit! " application/json" , " {\" error\" :\" Command body required\" }" );
173+ add_cors_headers(response);
152174 stream.write(response.format_message()[]);
153175 return 0 ;
154176 }
@@ -186,7 +208,7 @@ private:
186208 }
187209 else
188210 response.content ~= " \"\" }" ;
189-
211+ add_cors_headers(response);
190212 stream.write(response.format_message()[]);
191213 }
192214
0 commit comments