うちぱらめも

I will be back...(デデンデンデデン)

responderでboundaryを含んだform valueが取得できない

タイトル通りです. responderでform valueを取得するコードを書いたときに,boundaryを含むmultipart/form-dataリクエストを投げると,parseに失敗し,正しく値を取得することができません.

Enviroment

versionは以下になります。

responder 1.3.1

Example

import responder

api = responder.API()

@api.route("/")
async def hoge(req, resp):
    req.media = await req.media()

if __name__ == "__main__":
    api.run(port=8080)

boundaryを含まないrequest

import requests

URL = "http://127.0.0.1:8080"
payload = {
    "user": "test_user",
    "password": "hoge",
}

r = requests.post(URL, data=payload)
print(r.text)  # => {"user": "test_user", "password": "hoge"}

boundaryを含むrequest

import requests

URL = "http://127.0.0.1:8080"
files = {
    "user": (None,"test_user"),
    "password": (None, "hoge"),
}

r = requests.post(URL, files=files)
print(r.text)  # => {" name": "\"password\"\r\n\r\nhoge\r\n--3dec707edd260e174530419810e62f2c--\r\n"}

curlなどでmultipart/form-dataのrequestを投げると, form valueのみでもboundaryがついてくるので, APIを作ってcurlでテストしていたりしたらハマると思います。

$ curl -X POST -F "user=test_user" -F "password=hoge" localhost:8080

対応策

prを出してmergeされたので,GitHubからpip installすると使えるようになります。 https://github.com/taoufik07/responder/pull/367
https://github.com/taoufik07/responder/pull/378

8/22追記

pypiに新しいversionが登録されたようなので、pip installで行けると思います.