JSON content type not being set when a single header is present
まだ誰も着手していません。
評価
調査の方向性
Issue にある 2 つの https post pie.dev/post コマンドを、--debug バリアントを含めて再現し、HTTPie の Python リクエストが送信前に Content-Type を表示する箇所でリクエスト構築を追跡します。カスタムヘッダーを 1 つ付けたリクエストが Content-Type: application/json を引き続き送信し、その詳細出力とサーバー応答の両方でそのヘッダーが報告されれば完了です。
索引モデルが issue の本文から書いたものです。
説明
Checklist
- I've searched for similar issues.
- I'm using the latest version of HTTPie.
Minimal reproduction code and steps
$ https post pie.dev/post -v 'header1: xyz' x=1$ https post pie.dev/post -v 'header1: xyz' 'header2: abc' x=1
Current result
output from step 1:
POST /post HTTP/1.1
Accept-Encoding: gzip, deflate
Connection: keep-alive
Host: pie.dev
header1: xyz
{"x": "1"}
HTTP/1.1 200 OK
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: *
CF-RAY: 95566dc8c8d1f7c9-LAX
Cf-Cache-Status: DYNAMIC
Connection: keep-alive
Content-Encoding: gzip
Content-Type: application/json
Date: Wed, 25 Jun 2025 18:11:41 GMT
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=T5F5MLxiQSAvDrINeG1ku5IkxuGFXPCXZCppIMBEnShUajvjeC3%2BvZcwVBmdlCmAv4Nb9LuUyx2EnQd45Dnmkx%2FAojwaiPk%3D"}]}
Server: cloudflare
Transfer-Encoding: chunked
alt-svc: h3=":443"; ma=86400
{
"args": {},
"data": "{\"x\": \"1\"}",
"files": {},
"form": {},
"headers": {
"Accept-Encoding": "gzip, br",
"Cdn-Loop": "cloudflare; loops=1",
"Cf-Connecting-Ip": "<REDACTED>",
"Cf-Ipcountry": "US",
"Cf-Ray": "95566dc8c8d1f7c9-FRA",
"Cf-Visitor": "{\"scheme\":\"https\"}",
"Content-Length": "10",
"Header1": "xyz",
"Host": "pie.dev",
"User-Agent": "python-urllib3/2.5.0"
},
"json": {
"x": "1"
},
"origin": "<REDACTED>",
"url": "https://pie.dev/post"
}
(Neither HTTPie's verbose output or pie.dev's response reports Content-Type: application/json)
…
Expected result
output from step 2:
POST /post HTTP/1.1
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Type: application/json
header1: xyz
header2: abc
Host: pie.dev
{"x": "1"}
HTTP/1.1 200 OK
Date: Wed, 25 Jun 2025 18:13:03 GMT
Content-Type: application/json
Transfer-Encoding: chunked
Connection: keep-alive
Server: cloudflare
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
Cf-Cache-Status: DYNAMIC
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=rtMPq5%2BI8UInMXCz1Fm7mh3yvd5yUt%2BZrSaQMEqe68bvTDT0Aka8A3gc8wSEQP1ZNkbhXMV6QB%2FcyVjAgpW04b439a9nRYM%3D"}]}
Content-Encoding: gzip
CF-RAY: 95566fc8bb3c279a-LAX
alt-svc: h3=":443"; ma=86400
{
"args": {},
"data": "{\"x\": \"1\"}",
"files": {},
"form": {},
"headers": {
"Accept-Encoding": "gzip, br",
"Cdn-Loop": "cloudflare; loops=1",
"Cf-Connecting-Ip": "<REDACTED>",
"Cf-Ipcountry": "US",
"Cf-Ray": "95566fc8bb3c279a-FRA",
"Cf-Visitor": "{\"scheme\":\"https\"}",
"Content-Length": "10",
"Content-Type": "application/json",
"Header1": "xyz",
"Header2": "abc",
"Host": "pie.dev",
"User-Agent": "python-urllib3/2.5.0"
},
"json": {
"x": "1"
},
"origin": "<REDACTED>",
"url": "https://pie.dev/post"
}
(both HTTPie's verbose output and pie.dev's response report Content-Type: application/json)
…
Debug output
Please re-run the command with --debug, then copy the entire command & output and paste both below:
$ https post pie.dev/post --debug -v 'header1: xyz' x=1
HTTPie 3.2.4
Requests 2.32.4
Pygments 2.19.1
Python 3.13.5 (main, Jun 11 2025, 15:36:57) [Clang 17.0.0 (clang-1700.0.13.3)]
/opt/homebrew/Cellar/httpie/3.2.4_3/libexec/bin/python
Darwin 24.5.0
<Environment {'apply_warnings_filter': <function Environment.apply_warnings_filter at 0x101b88cc0>,
'args': Namespace(),
'as_silent': <function Environment.as_silent at 0x101b88b80>,
'colors': 256,
'config': {'default_options': []},
'config_dir': PosixPath('/Users/andrewmuro/.config/httpie'),
'devnull': <property object at 0x101b66a70>,
'is_windows': False,
'log_error': <function Environment.log_error at 0x101b88c20>,
'program_name': 'https',
'quiet': 0,
'rich_console': <functools.cached_property object at 0x10103e690>,
'rich_error_console': <functools.cached_property object at 0x101b5cc00>,
'show_displays': True,
'stderr': <_io.TextIOWrapper name='<stderr>' mode='w' encoding='utf-8'>,
'stderr_isatty': True,
'stdin': <_io.TextIOWrapper name='<stdin>' mode='r' encoding='utf-8'>,
'stdin_encoding': 'utf-8',
'stdin_isatty': True,
'stdout': <_io.TextIOWrapper name='<stdout>' mode='w' encoding='utf-8'>,
'stdout_encoding': 'utf-8',
'stdout_isatty': True}>
<PluginManager {'adapters': [],
'auth': [<class 'httpie.plugins.builtin.BasicAuthPlugin'>,
<class 'httpie.plugins.builtin.DigestAuthPlugin'>,
<class 'httpie.plugins.builtin.BearerAuthPlugin'>],
'converters': [],
'formatters': [<class 'httpie.output.formatters.headers.HeadersFormatter'>,
<class 'httpie.output.formatters.json.JSONFormatter'>,
<class 'httpie.output.formatters.xml.XMLFormatter'>,
<class 'httpie.output.formatters.colors.ColorFormatter'>]}>
>>> requests.request(**{'auth': None,
'data': b'{"x": "1"}',
'headers': <HTTPHeadersDict('User-Agent': b'HTTPie/3.2.4', 'Accept': b'application/json, */*;q=0.5', 'Content-Type': b'application/json', 'header1': b'xyz')>,
'method': 'post',
'params': <generator object MultiValueOrderedDict.items at 0x101facf40>,
'url': 'https://pie.dev/post'})
POST /post HTTP/1.1
Accept-Encoding: gzip, deflate
Connection: keep-alive
Host: pie.dev
header1: xyz
{"x": "1"}
HTTP/1.1 200 OK
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: *
CF-RAY: 95567851aa815263-LAX
Cf-Cache-Status: DYNAMIC
Connection: keep-alive
Content-Encoding: gzip
Content-Type: application/json
Date: Wed, 25 Jun 2025 18:18:53 GMT
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=esCpq2VXduYA9W9gSJ1M5zi9BdGYBrkJ8fq8Jc8tIJf2QEO4REGWcuonYlkM5cAHzETL%2BPuzAcAuyUgokl6O74%2F7D53b"}]}
Server: cloudflare
Transfer-Encoding: chunked
alt-svc: h3=":443"; ma=86400
{
"args": {},
"data": "{\"x\": \"1\"}",
"files": {},
"form": {},
"headers": {
"Accept-Encoding": "gzip, br",
"Cdn-Loop": "cloudflare; loops=1",
"Cf-Connecting-Ip": "<REDACTED>",
"Cf-Ipcountry": "US",
"Cf-Ray": "95567851aa815263-FRA",
"Cf-Visitor": "{\"scheme\":\"https\"}",
"Content-Length": "10",
"Header1": "xyz",
"Host": "pie.dev",
"User-Agent": "python-urllib3/2.5.0"
},
"json": {
"x": "1"
},
"origin": "<REDACTED>",
"url": "https://pie.dev/post"
}
Additional information, screenshots, or code examples
The underlying issue here is that when sending a request to a Serverless app (in my case, using only an Authorization header), API gateway will automatically encode the request body as base64 because the Content-Type header isn't set, which causes JSON parsing of the body to fail.
…
- 主要言語
- Python
- スター
- 38.6k
- フォーク
- 4k
- PR マージ指標
- 30日以内にマージされた PR はありません
コントリビューションガイド
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
httpie/cli のほかの issue
-
new
難易度 2/5 1〜3時間 初心者へのやさしさ 70/100
-
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
-
bug new
難易度 4/5 3〜5日 初心者へのやさしさ 48/100
-
難易度 3/5 1〜2日 初心者へのやさしさ 55/100
-
難易度 4/5 3〜5日 初心者へのやさしさ 35/100
似ている issue
-
bug
難易度 2/5 1〜3時間 初心者へのやさしさ 75/100
stephrobert/dsoxlab#238 ·
-
難易度 2/5 1〜3時間 初心者へのやさしさ 75/100
-
難易度 2/5 1〜3時間 初心者へのやさしさ 75/100
sublimehq/package_control#1780 ·
-
難易度 2/5 1〜3時間 初心者へのやさしさ 65/100
-
難易度 2/5 1〜3時間 初心者へのやさしさ 70/100
nwg-piotr/nwg-displays#145 ·