tkomatsu/webserv

client_max_body_sizeより大きいサイズのリクエストが来てもファイルは作成されてしまう

Closed this issue · 1 comments

config fileでclient_max_body_sizeディレクティブを設定し、それより大きいサイズのアップロードリクエストを送信した際、レスポンスは413が返ってきます。一方で、ファイル自体は生成されます。

ボディが空のuploadリクエストの場合とサーバー側の状態が同一になってしまいます。
413を返すのであれば、ファイルの作成自体もしないようにすべきだと思います。

$ curl localhost:8080/upload/ -X POST -d $(python -c 'print("a" * 100)') -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: 100
> Content-Type: application/x-www-form-urlencoded
> 
* upload completely sent off: 100 out of 100 bytes
< HTTP/1.1 413 Payload Too Large
< Connection: keep-alive
< Content-Length: 163
< Content-Type: text/html
< Date: Tue, Sep 2021 02:09:05 GMT
< Server: webserv/0.4.2
< 
<html>
<head><title>413 Payload Too Large</title></head>
<body>
<center><h1>413 Payload Too Large</h1></center>
<hr><center>webserv/0.4.2</center>
</body>
</html>
* Connection #0 to host localhost left intact
* Closing connection 0
$ curl localhost:8080/upload/ -X POST -d "" -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: 0
> Content-Type: application/x-www-form-urlencoded
> 
< HTTP/1.1 201 Created
< Content-Length: 0
< Content-Location: /upload/1630980778379899.html
< Content-Type: text/html
< Date: Tue, Sep 2021 02:12:58 GMT
< Server: webserv
< 
* Connection #0 to host localhost left intact
* Closing connection 0

Preprocess()の実行後にClientMaxBodySizeの比較をしてしまっているので、その処理を前に持ってくる必要がありますね。