@@ -101,7 +101,17 @@ def handle_rate_limit_exception(e):
101101local_regexes = [r"^https?://localhost(:\d+)?$" , r"^https?://127\.0\.0\.1(:\d+)?$" ]
102102
103103cors_origins = explicit_allowed + local_regexes
104- CORS (app , supports_credentials = True , origins = cors_origins )
104+
105+ CORS (app ,
106+ resources = {r"/*" : {
107+ "origins" : cors_origins ,
108+ "methods" : ["GET" , "POST" , "PUT" , "PATCH" , "DELETE" , "OPTIONS" ],
109+ "allow_headers" : ["Content-Type" , "Authorization" , "X-Requested-With" , "Accept" ],
110+ "expose_headers" : ["Content-Type" , "Authorization" ],
111+ "supports_credentials" : True ,
112+ "max_age" : 3600
113+ }}
114+ )
105115
106116def origin_allowed (origin ):
107117 """Return True if the provided origin string is allowed by explicit allowed
@@ -126,17 +136,17 @@ def add_cors_headers(response):
126136 This complements flask-cors and guards against cases where exception paths
127137 or other middleware may return responses without the proper headers.
128138 """
139+ if response .headers .get ("Access-Control-Allow-Origin" ):
140+ return response
141+
129142 try :
130143 origin = request .headers .get ("Origin" )
131144 if origin and origin_allowed (origin ):
132145 response .headers ["Access-Control-Allow-Origin" ] = origin
133146 response .headers ["Access-Control-Allow-Credentials" ] = "true"
134- else :
135- fallback = explicit_allowed [0 ] if explicit_allowed else "http://localhost:10008"
136- response .headers .setdefault ("Access-Control-Allow-Origin" , fallback )
137- response .headers .setdefault ("Access-Control-Allow-Credentials" , "true" )
138- response .headers .setdefault ("Access-Control-Allow-Headers" , "Content-Type,Authorization" )
139- response .headers .setdefault ("Access-Control-Allow-Methods" , "GET,POST,PUT,PATCH,DELETE,OPTIONS" )
147+ response .headers ["Access-Control-Allow-Headers" ] = "Content-Type,Authorization,X-Requested-With,Accept"
148+ response .headers ["Access-Control-Allow-Methods" ] = "GET,POST,PUT,PATCH,DELETE,OPTIONS"
149+ response .headers ["Access-Control-Expose-Headers" ] = "Content-Type,Authorization"
140150 except Exception :
141151 pass
142152 return response
@@ -165,28 +175,32 @@ def handle_all_exceptions(e):
165175 if origin and origin_allowed (origin ):
166176 resp .headers ["Access-Control-Allow-Origin" ] = origin
167177 resp .headers ["Access-Control-Allow-Credentials" ] = "true"
178+ resp .headers ["Access-Control-Allow-Headers" ] = "Content-Type,Authorization,X-Requested-With,Accept"
179+ resp .headers ["Access-Control-Allow-Methods" ] = "GET,POST,PUT,PATCH,DELETE,OPTIONS"
180+ resp .headers ["Access-Control-Expose-Headers" ] = "Content-Type,Authorization"
168181 else :
169182 fallback = explicit_allowed [0 ] if explicit_allowed else "http://localhost:10008"
170183 resp .headers .setdefault ("Access-Control-Allow-Origin" , fallback )
171184 resp .headers .setdefault ("Access-Control-Allow-Credentials" , "true" )
172- resp .headers .setdefault ("Access-Control-Allow-Headers" , "Content-Type,Authorization" )
173- resp .headers .setdefault ("Access-Control-Allow-Methods" , "GET,POST,PUT,PATCH,DELETE,OPTIONS" )
185+ resp .headers .setdefault ("Access-Control-Allow-Headers" , "Content-Type,Authorization,X-Requested-With,Accept" )
186+ resp .headers .setdefault ("Access-Control-Allow-Methods" , "GET,POST,PUT,PATCH,DELETE,OPTIONS" )
187+ resp .headers .setdefault ("Access-Control-Expose-Headers" , "Content-Type,Authorization" )
174188 return resp
175189 except Exception :
176190 # If even the error handler fails, return a minimal JSON response
177191 logger .exception ("Error while handling exception" )
178192 out = make_response (json .dumps ({"status" : "error" , "message" : "Fatal error" }), 500 )
179193 out .headers .setdefault ("Access-Control-Allow-Origin" , "http://localhost:10008" )
180194 out .headers .setdefault ("Access-Control-Allow-Credentials" , "true" )
181- out .headers .setdefault ("Access-Control-Allow-Headers" , "Content-Type,Authorization" )
195+ out .headers .setdefault ("Access-Control-Allow-Headers" , "Content-Type,Authorization,X-Requested-With,Accept " )
182196 out .headers .setdefault ("Access-Control-Allow-Methods" , "GET,POST,PUT,PATCH,DELETE,OPTIONS" )
183197 out .headers ["Content-Type" ] = "application/json"
184198 return out
185199
186200
187201from flask_socketio import SocketIO
188202import services .socketio_service as socketio_service
189- socketio = SocketIO (app , cors_allowed_origins = "*" , async_mode = "threading" )
203+ socketio = SocketIO (app , cors_allowed_origins = cors_origins , async_mode = "threading" )
190204socketio_service .socketio = socketio
191205socketio_service .register_socketio_handlers ()
192206
0 commit comments