@@ -172,3 +172,47 @@ func TestHTTPHeaders(t *testing.T) {
172172 }
173173 }
174174}
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