72514


# 環境

  * python 3.8
  * requests 2.24.0

# やりたいこと

pythonの[requests](https://requests.readthedocs.io/)モジュールでファイルをアップロードしたいです。

# 質問

空ファイルをStreaming Uploadすると、リクエストヘッダに`{'Transfer-Encoding':
'chunked'}`という情報が追加されます。  
なぜ`Transfer-Encoding`がリクエストヘッダに追加されるのでしょうか？  
また、空ファイルをStreaming Uploadする際、`Transfer-
Encoding`を追加しないようにするは、どのような設定をすればよいでしょうか？

# 試したこと

## ファイルの種類

  * `empty.txt`: 空ファイル（0byte）
  * `foo.txt`: `foo`という文字のみのファイル（3byte）

## Streaming Upload

<https://requests.readthedocs.io/en/master/user/advanced/#streaming-uploads>

[code]

    def upload_streaming(file):
        with open(file, mode="rb") as f:
            r = requests.put("https://httpbin.org/put", data=f)
            print(r.request.headers)
    
    upload_streaming("foo.txt")
    # {'User-Agent': 'python-requests/2.24.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Length': '3'}
    
    upload_streaming("empty.txt")
    # {'User-Agent': 'python-requests/2.24.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Transfer-Encoding': 'chunked'}
    
[/code]

## File Upload

[code]

    def upload_file(file):
        r = requests.put("https://httpbin.org/put", data=file)
        print(r.request.headers)
    
    upload_file("foo.txt")
    # {'User-Agent': 'python-requests/2.24.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Length': '7'}
    
    upload_file("empty.txt")
    # {'User-Agent': 'python-requests/2.24.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Length': '9'}
    
    
[/code]


CC BY-SA 4.0
2020-12-08T17:02:44.270
72506
2020-12-09T03:27:01.300
19524
question
python python-requests
python requestsモジュールで空ファイルをアップロードすると、リクエストヘッダに`Transfer-Encoding`が追加されます。なぜ追加されるのでしょうか？


自己解決しました。

> なぜTransfer-Encodingがリクエストヘッダに追加されるのでしょうか？

以下のような処理だったから。

[code]

            if is_stream:
                try:
                    length = super_len(data)
                except (TypeError, AttributeError, UnsupportedOperation):
                    length = None
    
                body = data
    
                # 省略
    
                if length:
                    self.headers['Content-Length'] = builtin_str(length)
                else:
                    self.headers['Transfer-Encoding'] = 'chunked'
    
[/code]

<https://github.com/psf/requests/blob/8149e9fe54c36951290f198e90d83c8a0498289c/requests/models.py#L500>

> また、空ファイルをStreaming Uploadする際、Transfer-
> Encodingを追加しないようにするは、どのような設定をすればよいでしょうか？

`requests.put`メソッドの`headers`引数でコントロールする


CC BY-SA 4.0
2020-12-09T03:27:01.300
72514
2020-12-09T03:27:01.300
19524
72506
answer