MCPcopy Index your code
hub / github.com/pywebio/PyWebIO / handle_request_context

Method handle_request_context

pywebio/platform/adaptor/http.py:252–339  ·  view source on GitHub ↗

called when every http request

(self, context: HttpContext)

Source from the content-addressed store, hash-verified

250
251 @contextmanager
252 def handle_request_context(self, context: HttpContext):
253 """called when every http request"""
254 cls = type(self)
255
256 if _event_loop:
257 asyncio.set_event_loop(_event_loop)
258
259 request_headers = context.request_headers()
260
261 # CORS process start ############################
262 if context.request_method() == 'OPTIONS': # preflight request for CORS
263 self._process_cors(context)
264 context.set_status(204)
265 return context.get_response()
266
267 if request_headers.get('Origin'): # set headers for CORS request
268 self._process_cors(context)
269 # CORS process end ############################
270
271 if context.request_url_parameter('test'): # 测试接口,当会话使用基于http的backend时,返回 ok
272 context.set_content('ok')
273 return context.get_response()
274
275 # 对首页HTML的请求
276 if 'webio-session-id' not in request_headers:
277 app = self.app_loader(context)
278 html = render_page(app, protocol='http', cdn=self.get_cdn(context))
279 context.set_content(html)
280 return context.get_response()
281
282 ack = int(context.request_url_parameter('ack', 0))
283 webio_session_id = request_headers['webio-session-id']
284 new_request = False
285 if webio_session_id.startswith('NEW-'):
286 new_request = True
287 webio_session_id = webio_session_id[4:]
288
289 if new_request and webio_session_id not in cls._webio_sessions: # 初始请求,创建新 Session
290 if context.request_method() == 'POST': # 不能在POST请求中创建Session,防止CSRF攻击
291 context.set_status(403)
292 return context.get_response()
293
294 session_info = get_session_info_from_headers(context.request_headers())
295 session_info['user_ip'] = context.get_client_ip()
296 session_info['request'] = context.request_obj()
297 session_info['backend'] = context.backend_name
298 session_info['protocol'] = 'http'
299
300 application = self.app_loader(context)
301
302 if iscoroutinefunction(application) or isgeneratorfunction(application):
303 session_cls = CoroutineBasedSession
304 else:
305 session_cls = ThreadBasedSession
306 webio_session = session_cls(application, session_info=session_info)
307 cls._webio_sessions[webio_session_id] = webio_session
308 cls._webio_transports[webio_session_id] = ReliableTransport(webio_session)
309 yield cls.WAIT_MS_ON_POST / 1000.0 # <--- <--- <--- <--- <--- <--- <--- <--- <--- <--- <--- <---

Callers 2

handle_requestMethod · 0.95
handle_request_asyncMethod · 0.95

Calls 15

_process_corsMethod · 0.95
get_cdnMethod · 0.95
read_event_dataMethod · 0.95
interval_cleaningMethod · 0.95
_remove_webio_sessionMethod · 0.95
render_pageFunction · 0.85
iscoroutinefunctionFunction · 0.85
isgeneratorfunctionFunction · 0.85
ReliableTransportClass · 0.85
close_messageMethod · 0.80
push_eventMethod · 0.80

Tested by

no test coverage detected