tkomatsu/webserv

1024byteより大きいサイズのuploadリクエストに反応がない

tkomatsu opened this issue · 2 comments

1024バイトの文字列をリクエストボディに含めて送るとuploadに成功しますが、1025バイト以上のものを送ると待機状態になりレスポンスが返ってきません。
クライアント側であるcurlのメッセージでは全てリクエストを送信したことになっています。

$ curl localhost:8080/upload/ -X POST -d $(python -c 'print("a" * 1024)') -v
Note: Unnecessary use of -X or --request, POST is already inferred.
*   Trying ::1...
* TCP_NODELAY set
* Connected to localhost (::1) port 8080 (#0)
> POST /upload/ HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.64.1
> Accept: */*
> Content-Length: 1024
> Content-Type: application/x-www-form-urlencoded
> 
* upload completely sent off: 1024 out of 1024 bytes
< HTTP/1.1 201 Created
< Content-Length: 0
< Content-Location: /upload/1630980214625438.html
< Content-Type: text/html
< Date: Tue, Sep 2021 02:03:34 GMT
< Server: webserv
< 
* Connection #0 to host localhost left intact
* Closing connection 0
$ curl localhost:8080/upload/ -X POST -d $(python -c 'print("a" * 1025)') -v
Note: Unnecessary use of -X or --request, POST is already inferred.
*   Trying ::1...
* TCP_NODELAY set
* Connected to localhost (::1) port 8080 (#0)
> POST /upload/ HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.64.1
> Accept: */*
> Content-Length: 1025
> Content-Type: application/x-www-form-urlencoded
> Expect: 100-continue
> 
* Done waiting for 100-continue
* We are completely uploaded and fine

curl は POST や PUT でリクエストボディの長さが長いなどの特定条件になると「こんなに長いけど、今いけますか?」的な意味合いで、まず Expect: 100-continue をつけてリクエストを送るようで。そしてサーバー側のレスポンス100を待ってからリクエストボディを改めて送るという行儀が良い実装になっているようです。

$ curl localhost:8080/upload/ -X POST -d $(python -c 'print("a" * 1025)') -v -H "Expect:"

としてExpectヘッダーを指定しなければ動きました。

今回の課題については、100-continueに対応するHTTPサーバーにしなくていいんじゃないかなと思います。

対応しない方向で!