dev-resources.site
for different kinds of informations.
MicroPython 1.24.0 的 requests 重新導向的問題
Published at
12/6/2024
Categories
micropython
Author
codemee
Categories
1 categories in total
micropython
open
MicroPython 的 requests 模組中實作的 request 函式有個問題,如果叫用時傳入的 headers 引數中包含有 Host 表頭,它就會採用該表頭做為主機,而不是使用實際上從 url 引數中取出的主機:
if "Host" not in headers:
headers["Host"] = host
這是為了方便讓你強制指定主機。不過如果伺服器回應 301 等重新導向的要求時,理論上就應該要改用重新導向的 url 中的主機才對,不過 1.24.0 的實作中會傳入目前的 headers 遞迴叫用自己:
if redirect:
s.close()
if status in [301, 302, 303]:
return request("GET", redirect, None, None, headers, stream)
else:
return request(method, redirect, data, json, headers, stream)
這使得重新導向時仍然沿用原本的主機,如果重新導向的 url 中主機和原本的不同,就可能會導致重新導向失敗。
舉例來說,如果你使用 Google 的 Apps Script 實作 web 應用,並透過 TextOutput 物件傳回文字類型的回應,礙於安全因素,它會在回應時要求重新導向,才能取得真正的回應內容。取用 web 應用的網址是:
https://script.google.com/....
但重新導向的網址卻是:
https://script.googleusercontent.com/...
如果重新導向時仍然採用原本的 script.google.com 為 Host 表頭,就會得到 404 的回應。
為了解決這個問題,我們必須要伺服器要求重新導向的時候,把 Host 表頭從 headers 內移除:
if redirect:
s.close()
# use the Host in the redirect URL
if "Host" in headers:
headers.pop("Host")
if status in [301, 302, 303]:
return request("GET", redirect, None, None, headers, stream)
else:
return request(method, redirect, data, json, headers, stream)
Articles
12 articles in total
Windows 上 VSCode 的 C/C++ 延伸模組處理編碼的問題
read article
PowerShell 的文字編碼
read article
使用 uv 管理 Python 環境
read article
Broadcom APDS 系列晶片
read article
IRRemote 程式庫搭配 Adafruit_NeoPoxel 程式庫的問題
read article
為什麼 member function 不叫做 function member?
read article
MicroPython 1.24.0 的 requests 重新導向的問題
currently reading
使用 selenium 讀取需要登入會員的網頁
read article
HTML meta 標籤中 viewport 的設定
read article
Arduino Serial.parseInt 函式的運作方式
read article
用程式控制 Arduino UNO R4 WiFi 的 TX/RX 指示燈
read article
C++ 為什麼要有 delete 和 delete[]
read article
Featured ones: