@@ -172,3 +172,47 @@ func TestHTTPHeaders(t *testing.T) {
172
172
}
173
173
}
174
174
}
175
+
176
+ // TestBasicAuthIsNotNeededForMethodOptions validates that OPTIONS method is always allowed
177
+ func TestBasicAuthIsNotNeededForMethodOptions (t * testing.T ) {
178
+ server := & http.Server {
179
+ Addr : port ,
180
+ Handler : http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
181
+ if r .Method == http .MethodOptions {
182
+ w .Header ().Set ("Access-Control-Allow-Origin" , "https://example.com:8080" )
183
+ w .Header ().Set ("Access-Control-Expose-Headers" , "Date" )
184
+ w .Header ().Set ("Access-Control-Allow-Methods" , "GET,OPTIONS,POST" )
185
+ w .Header ().Set ("Access-Control-Allow-Headers" , "Accept,Authorization,Date,Content-Type,Origin" )
186
+ w .Header ().Set ("Access-Control-Allow-Credentials" , "true" )
187
+ w .WriteHeader (http .StatusNoContent )
188
+ }
189
+ w .WriteHeader (http .StatusMethodNotAllowed )
190
+ }),
191
+ }
192
+
193
+ done := make (chan struct {})
194
+ t .Cleanup (func () {
195
+ if err := server .Shutdown (context .Background ()); err != nil {
196
+ t .Fatal (err )
197
+ }
198
+ <- done
199
+ })
200
+
201
+ go func () {
202
+ ListenAndServe (server , "testdata/web_config_users_noTLS.good.yml" , testlogger )
203
+ close (done )
204
+ }()
205
+
206
+ client := & http.Client {}
207
+ req , err := http .NewRequest ("OPTIONS" , "http://localhost" + port , nil )
208
+ if err != nil {
209
+ t .Fatal (err )
210
+ }
211
+ r , err := client .Do (req )
212
+ if err != nil {
213
+ t .Fatal (err )
214
+ }
215
+ if r .StatusCode != 204 {
216
+ t .Fatalf ("bad return code, expected %d, got %d" , 204 , r .StatusCode )
217
+ }
218
+ }
0 commit comments