Как именно я должен правильно прерывать запросы на загрузку HTTP? - PullRequest
0 голосов
/ 30 сентября 2018

Я разработал серверное приложение, которое, среди прочего, обрабатывает загрузку больших кусков данных.Когда начинается запрос на загрузку, еще до получения чанка, серверное приложение выполняет несколько проверок, чтобы клиент мог прервать операцию, если что-то пойдет не так, вместо того, чтобы обнаруживать, что существует проблема только после того, как он отправит гигабайты данных.

При игре с серверным приложением с использованием curl я обнаружил странное поведение.

  • curl запускает запрос, готовый к потоковой передаче данных.
  • Сервер немедленно отвечает HTTP 403, чтобы сообщить о проблеме, и предоставляет JSON-ответ с подробной информацией о проблеме.
  • curl завершается неудачно с кодом выхода 18 и следующим выводом:

    curl: (18) передача закрыта с 30 байтами, остающимися для чтения

При включении подробного вывода, вот что я вижу:

$ 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»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...