@@ -121,3 +121,37 @@ def handler() -> dict[str, str]:
121121 assert response .headers .get ("Access-Control-Allow-Origin" ) == origin
122122 else :
123123 assert not response .headers .get ("Access-Control-Allow-Origin" )
124+
125+
126+ @pytest .mark .parametrize (
127+ "allow_origin,origin,host,should_allow" ,
128+ [
129+ ("httpx://good.example" , "https://goodXexample" , "example.com" , False ),
130+ ("https://*good.example" , "https://very.good.example" , "very.good.example" , True ),
131+ ("https://*good.example" , "https://verygood.example" , "vergood.example" , True ),
132+ ("https://*good.example" , "https://good.example" , "good.example" , True ),
133+ ("https://*good.example" , "https://bad.example" , "bad.example" , False ),
134+ ("https://*.good.example" , "https://very.good.example" , "very.good.example" , True ),
135+ ("https://*.good.example" , "https://verygood.example" , "verygood.example" , False ),
136+ ("https://*.good.example" , "https://some.verygood.example" , "verygood.example" , False ),
137+ ("https://*.good.example" , "https://good.example" , "good.example" , False ),
138+ ],
139+ )
140+ def test_cors_test_regex_escape (allow_origin : str , origin : str , host : str , should_allow : bool ) -> None :
141+ @get ("/" )
142+ async def handler () -> None :
143+ return None
144+
145+ with create_test_client (
146+ [handler ],
147+ cors_config = CORSConfig (
148+ allow_origins = [allow_origin ],
149+ allow_credentials = True ,
150+ ),
151+ ) as client :
152+ res = client .get ("/" , headers = {"Origin" : origin , "Host" : host })
153+
154+ if should_allow :
155+ assert "Access-Control-Allow-Origin" in res .headers
156+ else :
157+ assert "Access-Control-Allow-Origin" not in res .headers
0 commit comments