Я разработал серверное приложение, которое, среди прочего, обрабатывает загрузку больших кусков данных.Когда начинается запрос на загрузку, еще до получения чанка, серверное приложение выполняет несколько проверок, чтобы клиент мог прервать операцию, если что-то пойдет не так, вместо того, чтобы обнаруживать, что существует проблема только после того, как он отправит гигабайты данных.
При игре с серверным приложением с использованием curl
я обнаружил странное поведение.
При включении подробного вывода, вот что я вижу:
$ curl -X PUT --limit-rate 2M http://127.0.0.1/blob -F files[]=@/tmp/tmp75hw30vc -v
* Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to 127.0.0.1 (127.0.0.1) port 80 (#0)
> PUT /blob HTTP/1.1
> Host: 127.0.0.1
> User-Agent: curl/7.58.0
> Accept: */*
> Content-Length: 2439352842
> Content-Type: multipart/form-data; boundary=------------------------32c442f4cf8abe0c
> Expect: 100-continue
>
< HTTP/1.1 100 Continue
< HTTP/1.1 403 FORBIDDEN
< Server: nginx/1.10.3
< Date: Sat, 29 Sep 2018 22:03:16 GMT
< Content-Type: application/json
< Content-Length: 30
< Connection: keep-alive
* HTTP error before end of send, stop sending
<
* transfer closed with 30 bytes remaining to read
* stopped the pause stream!
* Closing connection 0
curl: (18) transfer closed with 30 bytes remaining to read
На стороне сервера код (с использованием Flask) следующий:
def receive_blob():
if _can_upload():
return flask.jsonify({"error": "already-uploading"}), 403
...
Я не уверен, что понимаю, связана ли проблема с моим способом использования Flask или с curl
варианты я используюнг.
Что я должен сделать, чтобы избежать этой ситуации, т.е. заставить curl
отображать сообщение об ошибке JSON, возвращаемое сервером?
Вопросне является дубликатом Как обрабатывать HTTP-сообщение "100 continue"? , поскольку мой явно спрашивает, как заставить curl
отображать сообщение об ошибке JSON.Связанный вопрос предлагает добавить --fail
, что вместо этого привело бы к выводу «curl: (22) Запрошенный URL-адрес возвратил ошибку: 403 FORBIDDEN»