(request: EmscriptenRequest)
| 497 | |
| 498 | |
| 499 | def send_request(request: EmscriptenRequest) -> EmscriptenResponse: |
| 500 | if has_jspi(): |
| 501 | return send_jspi_request(request, False) |
| 502 | elif is_in_node(): |
| 503 | raise _RequestError( |
| 504 | message=NODE_JSPI_ERROR, |
| 505 | request=request, |
| 506 | response=None, |
| 507 | ) |
| 508 | try: |
| 509 | js_xhr = js.XMLHttpRequest.new() |
| 510 | |
| 511 | if not is_in_browser_main_thread(): |
| 512 | js_xhr.responseType = "arraybuffer" |
| 513 | if request.timeout: |
| 514 | js_xhr.timeout = int(request.timeout * 1000) |
| 515 | else: |
| 516 | js_xhr.overrideMimeType("text/plain; charset=ISO-8859-15") |
| 517 | if request.timeout: |
| 518 | # timeout isn't available on the main thread - show a warning in console |
| 519 | # if it is set |
| 520 | _show_timeout_warning() |
| 521 | |
| 522 | js_xhr.open(request.method, request.url, False) |
| 523 | for name, value in request.headers.items(): |
| 524 | if name.lower() not in HEADERS_TO_IGNORE: |
| 525 | js_xhr.setRequestHeader(name, value) |
| 526 | |
| 527 | js_xhr.send(to_js(request.body)) |
| 528 | |
| 529 | headers = dict(Parser().parsestr(js_xhr.getAllResponseHeaders())) |
| 530 | |
| 531 | if not is_in_browser_main_thread(): |
| 532 | body = js_xhr.response.to_py().tobytes() |
| 533 | else: |
| 534 | body = js_xhr.response.encode("ISO-8859-15") |
| 535 | return EmscriptenResponse( |
| 536 | status_code=js_xhr.status, headers=headers, body=body, request=request |
| 537 | ) |
| 538 | except JsException as err: |
| 539 | if err.name == "TimeoutError": |
| 540 | raise _TimeoutError(err.message, request=request) |
| 541 | elif err.name == "NetworkError": |
| 542 | raise _RequestError(err.message, request=request) |
| 543 | else: |
| 544 | # general http error |
| 545 | raise _RequestError(err.message, request=request) |
| 546 | |
| 547 | |
| 548 | def send_jspi_request( |
no test coverage detected