forked from extern/httpie-cli
Compare commits
30 Commits
auto-updat
...
fix-initia
Author | SHA1 | Date | |
---|---|---|---|
9d2e2afede | |||
418b12bbd6 | |||
ecff53f2d5 | |||
41da87f7c8 | |||
4f172a61b4 | |||
542a2d35de | |||
d9e1dc08c9 | |||
3b734fb0bc | |||
8abe47969e | |||
8173cb0337 | |||
7fd34fc8ce | |||
80ae644464 | |||
69fe5dbfd1 | |||
f09e7564e7 | |||
dc5274e491 | |||
ad2b86ccf4 | |||
11b2af0f59 | |||
b54239b525 | |||
b0b0f3dc53 | |||
9f7612cdeb | |||
5e76ebc5e1 | |||
343a521673 | |||
2142ae60c3 | |||
0b6a9b23c2 | |||
9e1c0b98c7 | |||
003f2095d4 | |||
f9b5c2f696 | |||
76495cbdec | |||
c4d7d05f3b | |||
7a4fb5d966 |
17
.github/workflows/release-choco.yml
vendored
17
.github/workflows/release-choco.yml
vendored
@ -13,7 +13,7 @@ jobs:
|
|||||||
name: Release the Chocolatey
|
name: Release the Chocolatey
|
||||||
runs-on: windows-2019
|
runs-on: windows-2019
|
||||||
env:
|
env:
|
||||||
package-dir: ./httpie/docs/packaging/windows-chocolatey
|
package-dir: docs\packaging\windows-chocolatey
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
@ -30,9 +30,21 @@ jobs:
|
|||||||
run: choco info httpie -s .
|
run: choco info httpie -s .
|
||||||
working-directory: ${{ env.package-dir }}
|
working-directory: ${{ env.package-dir }}
|
||||||
|
|
||||||
- name: Check the Installation
|
- name: Local installation
|
||||||
run: |
|
run: |
|
||||||
choco install httpie -y -dv -s "'.;https://community.chocolatey.org/api/v2/'"
|
choco install httpie -y -dv -s "'.;https://community.chocolatey.org/api/v2/'"
|
||||||
|
working-directory: ${{ env.package-dir }}
|
||||||
|
|
||||||
|
- name: Test the locally installed binaries
|
||||||
|
run: |
|
||||||
|
# Source: https://stackoverflow.com/a/46760714/15330941
|
||||||
|
|
||||||
|
# Make `refreshenv` available right away, by defining the $env:ChocolateyInstall
|
||||||
|
# variable and importing the Chocolatey profile module.
|
||||||
|
$env:ChocolateyInstall = Convert-Path "$((Get-Command choco).Path)\..\.."
|
||||||
|
Import-Module "$env:ChocolateyInstall\helpers\chocolateyProfile.psm1"
|
||||||
|
refreshenv
|
||||||
|
|
||||||
http --version
|
http --version
|
||||||
https --version
|
https --version
|
||||||
httpie --version
|
httpie --version
|
||||||
@ -46,3 +58,4 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
choco apikey --key $CHOCO_API_KEY --source https://push.chocolatey.org/
|
choco apikey --key $CHOCO_API_KEY --source https://push.chocolatey.org/
|
||||||
choco push httpie*.nupkg --source https://push.chocolatey.org/
|
choco push httpie*.nupkg --source https://push.chocolatey.org/
|
||||||
|
working-directory: ${{ env.package-dir }}
|
||||||
|
21
.github/workflows/release-linux-standalone.yml
vendored
21
.github/workflows/release-linux-standalone.yml
vendored
@ -7,6 +7,9 @@ on:
|
|||||||
description: "The branch, tag or SHA to release from"
|
description: "The branch, tag or SHA to release from"
|
||||||
required: true
|
required: true
|
||||||
default: "master"
|
default: "master"
|
||||||
|
tag_name:
|
||||||
|
description: "Which release to upload the artifacts to (e.g., 3.0)"
|
||||||
|
required: true
|
||||||
|
|
||||||
release:
|
release:
|
||||||
types: [released, prereleased]
|
types: [released, prereleased]
|
||||||
@ -45,24 +48,30 @@ jobs:
|
|||||||
name: httpie.rpm
|
name: httpie.rpm
|
||||||
path: extras/packaging/linux/artifacts/dist/*.rpm
|
path: extras/packaging/linux/artifacts/dist/*.rpm
|
||||||
|
|
||||||
|
- name: Determine the release upload upload_url
|
||||||
|
id: release_id
|
||||||
|
run: |
|
||||||
|
pip install httpie
|
||||||
|
export API_URL="api.github.com/repos/httpie/httpie/releases/tags/${{ github.event.inputs.tag_name }}"
|
||||||
|
export UPLOAD_URL=`https --ignore-stdin GET $API_URL | jq -r ".upload_url"`
|
||||||
|
echo "::set-output name=UPLOAD_URL::$UPLOAD_URL"
|
||||||
|
|
||||||
- name: Publish Debian Package
|
- name: Publish Debian Package
|
||||||
if: github.event_name == 'release'
|
|
||||||
uses: actions/upload-release-asset@v1.0.2
|
uses: actions/upload-release-asset@v1.0.2
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
with:
|
with:
|
||||||
upload_url: ${{ github.event.release.upload_url }}
|
upload_url: ${{ steps.release_id.outputs.UPLOAD_URL }}
|
||||||
asset_path: extras/packaging/linux/artifacts/dist/httpie-${{ github.event.release.tag_name }}.deb
|
asset_path: extras/packaging/linux/artifacts/dist/httpie_${{ github.event.inputs.tag_name }}_amd64.deb
|
||||||
asset_name: httpie-${{ github.event.release.tag_name }}.deb
|
asset_name: httpie-${{ github.event.inputs.tag_name }}.deb
|
||||||
asset_content_type: binary/octet-stream
|
asset_content_type: binary/octet-stream
|
||||||
|
|
||||||
- name: Publish Single Executable
|
- name: Publish Single Executable
|
||||||
if: github.event_name == 'release'
|
|
||||||
uses: actions/upload-release-asset@v1.0.2
|
uses: actions/upload-release-asset@v1.0.2
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
with:
|
with:
|
||||||
upload_url: ${{ github.event.release.upload_url }}
|
upload_url: ${{ steps.release_id.outputs.UPLOAD_URL }}
|
||||||
asset_path: extras/packaging/linux/artifacts/dist/http
|
asset_path: extras/packaging/linux/artifacts/dist/http
|
||||||
asset_name: http
|
asset_name: http
|
||||||
asset_content_type: binary/octet-stream
|
asset_content_type: binary/octet-stream
|
||||||
|
2
.github/workflows/release-pypi.yml
vendored
2
.github/workflows/release-pypi.yml
vendored
@ -22,7 +22,7 @@ jobs:
|
|||||||
python-version: 3.9
|
python-version: 3.9
|
||||||
|
|
||||||
- name: Build a binary wheel and a source tarball
|
- name: Build a binary wheel and a source tarball
|
||||||
run: make build
|
run: make install && make build
|
||||||
|
|
||||||
- name: Release on PyPI
|
- name: Release on PyPI
|
||||||
uses: pypa/gh-action-pypi-publish@master
|
uses: pypa/gh-action-pypi-publish@master
|
||||||
|
18
CHANGELOG.md
18
CHANGELOG.md
@ -3,14 +3,24 @@
|
|||||||
This document records all notable changes to [HTTPie](https://httpie.io).
|
This document records all notable changes to [HTTPie](https://httpie.io).
|
||||||
This project adheres to [Semantic Versioning](https://semver.org/).
|
This project adheres to [Semantic Versioning](https://semver.org/).
|
||||||
|
|
||||||
## [3.1.1.dev0](https://github.com/httpie/httpie/compare/3.1.0...HEAD) (Unreleased)
|
## [3.2.1](https://github.com/httpie/httpie/compare/3.1.0...3.2.1) (2022-05-06)
|
||||||
|
|
||||||
|
- Improved support for determining auto-streaming when the `Content-Type` header includes encoding information. ([#1383](https://github.com/httpie/httpie/pull/1383))
|
||||||
|
- Fixed the display of the crash happening in the secondary process for update checks. ([#1388](https://github.com/httpie/httpie/issues/1388))
|
||||||
|
|
||||||
|
## [3.2.0](https://github.com/httpie/httpie/compare/3.1.0...3.2.0) (2022-05-05)
|
||||||
|
|
||||||
|
- Added a warning for notifying the user about the new updates. ([#1336](https://github.com/httpie/httpie/pull/1336))
|
||||||
|
- Added support for single binary executables. ([#1330](https://github.com/httpie/httpie/pull/1330))
|
||||||
|
- Added support for man pages (and auto generation of them from the parser declaration). ([#1317](https://github.com/httpie/httpie/pull/1317))
|
||||||
|
- Added `http --manual` for man pages & regular manual with pager. ([#1343](https://github.com/httpie/httpie/pull/1343))
|
||||||
- Added support for session persistence of repeated headers with the same name. ([#1335](https://github.com/httpie/httpie/pull/1335))
|
- Added support for session persistence of repeated headers with the same name. ([#1335](https://github.com/httpie/httpie/pull/1335))
|
||||||
- Changed `httpie plugins` to the new `httpie cli` namespace as `httpie cli plugins` (`httpie plugins` continues to work as a hidden alias). ([#1320](https://github.com/httpie/httpie/issues/1320))
|
- Added support for sending `Secure` cookies to the `localhost` (and `.local` suffixed domains). ([#1308](https://github.com/httpie/httpie/issues/1308))
|
||||||
|
- Improved UI for the progress bars. ([#1324](https://github.com/httpie/httpie/pull/1324))
|
||||||
- Fixed redundant creation of `Content-Length` header on `OPTIONS` requests. ([#1310](https://github.com/httpie/httpie/issues/1310))
|
- Fixed redundant creation of `Content-Length` header on `OPTIONS` requests. ([#1310](https://github.com/httpie/httpie/issues/1310))
|
||||||
- Fixed blocking of warning thread on some use cases. ([#1349](https://github.com/httpie/httpie/issues/1349))
|
- Fixed blocking of warning thread on some use cases. ([#1349](https://github.com/httpie/httpie/issues/1349))
|
||||||
- Added support for sending `Secure` cookies to the `localhost` (and `.local` suffixed domains). ([#1308](https://github.com/httpie/httpie/issues/1308))
|
- Changed `httpie plugins` to the new `httpie cli` namespace as `httpie cli plugins` (`httpie plugins` continues to work as a hidden alias). ([#1320](https://github.com/httpie/httpie/issues/1320))
|
||||||
|
- Soft deprecated the `--history-print`. ([#1380](https://github.com/httpie/httpie/pull/1380))
|
||||||
|
|
||||||
## [3.1.0](https://github.com/httpie/httpie/compare/3.0.2...3.1.0) (2022-03-08)
|
## [3.1.0](https://github.com/httpie/httpie/compare/3.0.2...3.1.0) (2022-03-08)
|
||||||
|
|
||||||
|
@ -59,8 +59,10 @@ $ git checkout -b my_topical_branch
|
|||||||
|
|
||||||
#### Setup
|
#### Setup
|
||||||
|
|
||||||
The [Makefile](https://github.com/httpie/httpie/blob/master/Makefile) contains a bunch of tasks to get you started. Just run
|
The [Makefile](https://github.com/httpie/httpie/blob/master/Makefile) contains a bunch of tasks to get you started.
|
||||||
the following command, which:
|
You can run `$ make` to see all the available tasks.
|
||||||
|
|
||||||
|
To get started, run the command below, which:
|
||||||
|
|
||||||
- Creates an isolated Python virtual environment inside `./venv`
|
- Creates an isolated Python virtual environment inside `./venv`
|
||||||
(via the standard library [venv](https://docs.python.org/3/library/venv.html) tool);
|
(via the standard library [venv](https://docs.python.org/3/library/venv.html) tool);
|
||||||
@ -70,7 +72,7 @@ the following command, which:
|
|||||||
- and runs tests (It is the same as running `make install test`).
|
- and runs tests (It is the same as running `make install test`).
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
$ make
|
$ make all
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Python virtual environment
|
#### Python virtual environment
|
||||||
|
22
Makefile
22
Makefile
@ -22,6 +22,26 @@ VENV_PYTHON=$(VENV_BIN)/python
|
|||||||
export PATH := $(VENV_BIN):$(PATH)
|
export PATH := $(VENV_BIN):$(PATH)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
default: list-tasks
|
||||||
|
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
# Default task to get a list of tasks when `make' is run without args.
|
||||||
|
# <https://stackoverflow.com/questions/4219255>
|
||||||
|
###############################################################################
|
||||||
|
|
||||||
|
list-tasks:
|
||||||
|
@echo Available tasks:
|
||||||
|
@echo ----------------
|
||||||
|
@$(MAKE) -pRrq -f $(lastword $(MAKEFILE_LIST)) : 2>/dev/null | awk -v RS= -F: '/^# File/,/^# Finished Make data base/ {if ($$1 !~ "^[#.]") {print $$1}}' | sort | egrep -v -e '^[^[:alnum:]]' -e '^$@$$'
|
||||||
|
@echo
|
||||||
|
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
# Installation
|
||||||
|
###############################################################################
|
||||||
|
|
||||||
all: uninstall-httpie install test
|
all: uninstall-httpie install test
|
||||||
|
|
||||||
|
|
||||||
@ -33,7 +53,7 @@ install-reqs:
|
|||||||
$(VENV_PIP) install --upgrade pip wheel build
|
$(VENV_PIP) install --upgrade pip wheel build
|
||||||
|
|
||||||
@echo $(H1)Installing dev requirements$(H1END)
|
@echo $(H1)Installing dev requirements$(H1END)
|
||||||
$(VENV_PIP) install --upgrade --editable '.[dev]'
|
$(VENV_PIP) install --upgrade '.[dev]' '.[test]'
|
||||||
|
|
||||||
@echo $(H1)Installing HTTPie$(H1END)
|
@echo $(H1)Installing HTTPie$(H1END)
|
||||||
$(VENV_PIP) install --upgrade --editable .
|
$(VENV_PIP) install --upgrade --editable .
|
||||||
|
@ -162,6 +162,8 @@ Also works for other Debian-derived distributions like MX Linux, Linux Mint, dee
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Install httpie
|
# Install httpie
|
||||||
|
$ curl -SsL https://packages.httpie.io/deb/KEY.gpg | apt-key add -
|
||||||
|
$ curl -SsL -o /etc/apt/sources.list.d/httpie.list https://packages.httpie.io/deb/httpie.list
|
||||||
$ apt update
|
$ apt update
|
||||||
$ apt install httpie
|
$ apt install httpie
|
||||||
```
|
```
|
||||||
@ -213,6 +215,21 @@ $ pacman -Syu httpie
|
|||||||
$ pacman -Syu
|
$ pacman -Syu
|
||||||
```
|
```
|
||||||
|
|
||||||
|
#### Single binary executables
|
||||||
|
|
||||||
|
Get the standalone HTTPie Linux executables when you don't want to go through the full installation process
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Install httpie
|
||||||
|
$ https --download packages.httpie.io/binaries/linux/http-latest -o http
|
||||||
|
$ chmod +x ./http
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Upgrade httpie
|
||||||
|
$ https --download packages.httpie.io/binaries/linux/http-latest -o http
|
||||||
|
```
|
||||||
|
|
||||||
### FreeBSD
|
### FreeBSD
|
||||||
|
|
||||||
#### FreshPorts
|
#### FreshPorts
|
||||||
@ -277,7 +294,7 @@ Synopsis:
|
|||||||
$ http [flags] [METHOD] URL [ITEM [ITEM]]
|
$ http [flags] [METHOD] URL [ITEM [ITEM]]
|
||||||
```
|
```
|
||||||
|
|
||||||
See also `http --help`.
|
See also `http --help` (and for systems where man pages are available, you can use `man http`).
|
||||||
|
|
||||||
### Examples
|
### Examples
|
||||||
|
|
||||||
@ -2408,7 +2425,7 @@ You can check whether a new update is available for your system by running `http
|
|||||||
|
|
||||||
In the past `pip` was used to install/uninstall plugins, but on some environments (e.g., brew installed
|
In the past `pip` was used to install/uninstall plugins, but on some environments (e.g., brew installed
|
||||||
packages) it wasn’t working properly. The new interface is a very simple overlay on top of `pip` to allow
|
packages) it wasn’t working properly. The new interface is a very simple overlay on top of `pip` to allow
|
||||||
plugin installations on every installation method.
|
plugin installations on every installation method.
|
||||||
|
|
||||||
By default, the plugins (and their missing dependencies) will be stored under the configuration directory,
|
By default, the plugins (and their missing dependencies) will be stored under the configuration directory,
|
||||||
but this can be modified through `plugins_dir` variable on the config.
|
but this can be modified through `plugins_dir` variable on the config.
|
||||||
|
@ -252,6 +252,7 @@ def fetch_missing_users_details(people: People) -> None:
|
|||||||
def save_awesome_people(people: People) -> None:
|
def save_awesome_people(people: People) -> None:
|
||||||
with DB_FILE.open(mode='w', encoding='utf-8') as fh:
|
with DB_FILE.open(mode='w', encoding='utf-8') as fh:
|
||||||
json.dump(people, fh, indent=4, sort_keys=True)
|
json.dump(people, fh, indent=4, sort_keys=True)
|
||||||
|
fh.write("\n")
|
||||||
|
|
||||||
|
|
||||||
def debug(*args: Any) -> None:
|
def debug(*args: Any) -> None:
|
||||||
|
@ -8,19 +8,27 @@ from jinja2 import Template
|
|||||||
from fetch import HERE, load_awesome_people
|
from fetch import HERE, load_awesome_people
|
||||||
|
|
||||||
TPL_FILE = HERE / 'snippet.jinja2'
|
TPL_FILE = HERE / 'snippet.jinja2'
|
||||||
|
|
||||||
HTTPIE_TEAM = {
|
HTTPIE_TEAM = {
|
||||||
'claudiatd',
|
'claudiatd',
|
||||||
'jakubroztocil',
|
'jakubroztocil',
|
||||||
'jkbr',
|
'jkbr',
|
||||||
|
'isidentical'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOT_ACCOUNTS = {
|
||||||
|
'dependabot-sr'
|
||||||
|
}
|
||||||
|
|
||||||
|
IGNORE_ACCOUNTS = HTTPIE_TEAM | BOT_ACCOUNTS
|
||||||
|
|
||||||
|
|
||||||
def generate_snippets(release: str) -> str:
|
def generate_snippets(release: str) -> str:
|
||||||
people = load_awesome_people()
|
people = load_awesome_people()
|
||||||
contributors = {
|
contributors = {
|
||||||
name: details
|
name: details
|
||||||
for name, details in people.items()
|
for name, details in people.items()
|
||||||
if details['github'] not in HTTPIE_TEAM
|
if details['github'] not in IGNORE_ACCOUNTS
|
||||||
and (release in details['committed'] or release in details['reported'])
|
and (release in details['committed'] or release in details['reported'])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -53,11 +53,13 @@
|
|||||||
},
|
},
|
||||||
"Batuhan Taskaya": {
|
"Batuhan Taskaya": {
|
||||||
"committed": [
|
"committed": [
|
||||||
"3.0.0"
|
"3.0.0",
|
||||||
|
"3.2.0"
|
||||||
],
|
],
|
||||||
"github": "isidentical",
|
"github": "isidentical",
|
||||||
"reported": [
|
"reported": [
|
||||||
"3.0.0"
|
"3.0.0",
|
||||||
|
"3.2.0"
|
||||||
],
|
],
|
||||||
"twitter": "isidentical"
|
"twitter": "isidentical"
|
||||||
},
|
},
|
||||||
@ -118,6 +120,14 @@
|
|||||||
"reported": [],
|
"reported": [],
|
||||||
"twitter": "elena_lape"
|
"twitter": "elena_lape"
|
||||||
},
|
},
|
||||||
|
"Ethan Mills": {
|
||||||
|
"committed": [
|
||||||
|
"3.2.0"
|
||||||
|
],
|
||||||
|
"github": "ethanmills",
|
||||||
|
"reported": [],
|
||||||
|
"twitter": null
|
||||||
|
},
|
||||||
"Fabio Peruzzo": {
|
"Fabio Peruzzo": {
|
||||||
"committed": [],
|
"committed": [],
|
||||||
"github": "peruzzof",
|
"github": "peruzzof",
|
||||||
@ -189,7 +199,8 @@
|
|||||||
"committed": [
|
"committed": [
|
||||||
"2.5.0",
|
"2.5.0",
|
||||||
"2.6.0",
|
"2.6.0",
|
||||||
"3.0.0"
|
"3.0.0",
|
||||||
|
"3.2.0"
|
||||||
],
|
],
|
||||||
"github": "jakubroztocil",
|
"github": "jakubroztocil",
|
||||||
"reported": [
|
"reported": [
|
||||||
@ -213,7 +224,8 @@
|
|||||||
],
|
],
|
||||||
"github": "blyxxyz",
|
"github": "blyxxyz",
|
||||||
"reported": [
|
"reported": [
|
||||||
"3.0.0"
|
"3.0.0",
|
||||||
|
"3.2.0"
|
||||||
],
|
],
|
||||||
"twitter": null
|
"twitter": null
|
||||||
},
|
},
|
||||||
@ -309,7 +321,8 @@
|
|||||||
"committed": [],
|
"committed": [],
|
||||||
"github": "ducaale",
|
"github": "ducaale",
|
||||||
"reported": [
|
"reported": [
|
||||||
"2.5.0"
|
"2.5.0",
|
||||||
|
"3.2.0"
|
||||||
],
|
],
|
||||||
"twitter": null
|
"twitter": null
|
||||||
},
|
},
|
||||||
@ -321,6 +334,22 @@
|
|||||||
],
|
],
|
||||||
"twitter": "sevenc_nanashi"
|
"twitter": "sevenc_nanashi"
|
||||||
},
|
},
|
||||||
|
"Nicklas Ansman Giertz": {
|
||||||
|
"committed": [],
|
||||||
|
"github": "ansman",
|
||||||
|
"reported": [
|
||||||
|
"3.2.0"
|
||||||
|
],
|
||||||
|
"twitter": null
|
||||||
|
},
|
||||||
|
"Oliver Fish": {
|
||||||
|
"committed": [],
|
||||||
|
"github": "Oliver-Fish",
|
||||||
|
"reported": [
|
||||||
|
"3.2.0"
|
||||||
|
],
|
||||||
|
"twitter": null
|
||||||
|
},
|
||||||
"Omer Akram": {
|
"Omer Akram": {
|
||||||
"committed": [
|
"committed": [
|
||||||
"2.6.0",
|
"2.6.0",
|
||||||
@ -357,6 +386,14 @@
|
|||||||
],
|
],
|
||||||
"twitter": null
|
"twitter": null
|
||||||
},
|
},
|
||||||
|
"Roberto L\u00f3pez L\u00f3pez": {
|
||||||
|
"committed": [],
|
||||||
|
"github": "robertolopezlopez",
|
||||||
|
"reported": [
|
||||||
|
"3.2.0"
|
||||||
|
],
|
||||||
|
"twitter": null
|
||||||
|
},
|
||||||
"Russell Shurts": {
|
"Russell Shurts": {
|
||||||
"committed": [],
|
"committed": [],
|
||||||
"github": "rshurts",
|
"github": "rshurts",
|
||||||
@ -487,6 +524,14 @@
|
|||||||
],
|
],
|
||||||
"twitter": null
|
"twitter": null
|
||||||
},
|
},
|
||||||
|
"dependabot[bot]": {
|
||||||
|
"committed": [
|
||||||
|
"3.2.0"
|
||||||
|
],
|
||||||
|
"github": "dependabot-sr",
|
||||||
|
"reported": [],
|
||||||
|
"twitter": null
|
||||||
|
},
|
||||||
"dkreeft": {
|
"dkreeft": {
|
||||||
"committed": [
|
"committed": [
|
||||||
"2.6.0",
|
"2.6.0",
|
||||||
@ -553,6 +598,14 @@
|
|||||||
],
|
],
|
||||||
"twitter": null
|
"twitter": null
|
||||||
},
|
},
|
||||||
|
"luzpaz": {
|
||||||
|
"committed": [
|
||||||
|
"3.2.0"
|
||||||
|
],
|
||||||
|
"github": "luzpaz",
|
||||||
|
"reported": [],
|
||||||
|
"twitter": null
|
||||||
|
},
|
||||||
"nixbytes": {
|
"nixbytes": {
|
||||||
"committed": [
|
"committed": [
|
||||||
"2.5.0"
|
"2.5.0"
|
||||||
@ -593,6 +646,14 @@
|
|||||||
],
|
],
|
||||||
"twitter": null
|
"twitter": null
|
||||||
},
|
},
|
||||||
|
"zhaohanqing95": {
|
||||||
|
"committed": [],
|
||||||
|
"github": "zhaohanqing95",
|
||||||
|
"reported": [
|
||||||
|
"3.2.0"
|
||||||
|
],
|
||||||
|
"twitter": null
|
||||||
|
},
|
||||||
"zoulja": {
|
"zoulja": {
|
||||||
"committed": [],
|
"committed": [],
|
||||||
"github": "zoulja",
|
"github": "zoulja",
|
||||||
@ -627,4 +688,4 @@
|
|||||||
],
|
],
|
||||||
"twitter": null
|
"twitter": null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,9 +2,10 @@
|
|||||||
|
|
||||||
## Community contributions
|
## Community contributions
|
||||||
|
|
||||||
We’d like to thank these amazing people for their contributions to this release: {% for name, details in contributors.items() -%}
|
We’d like to thank these amazing people for their contributions to this release:
|
||||||
[{{ name }}](https://github.com/{{ details.github }}){{ '' if loop.last else ', ' }}
|
{% for name, details in contributors.items() -%}
|
||||||
{%- endfor %}.
|
- [{{ name }}](https://github.com/{{ details.github }}){{ '' if loop.last else '\n' }}
|
||||||
|
{%- endfor %}
|
||||||
|
|
||||||
<!-- Twitter -->
|
<!-- Twitter -->
|
||||||
|
|
||||||
|
@ -17,11 +17,12 @@ docs-structure:
|
|||||||
Windows:
|
Windows:
|
||||||
- chocolatey
|
- chocolatey
|
||||||
Linux:
|
Linux:
|
||||||
- snap-linux
|
|
||||||
- brew-linux
|
|
||||||
- apt
|
- apt
|
||||||
- dnf
|
- dnf
|
||||||
- yum
|
- yum
|
||||||
|
- single-binary
|
||||||
|
- snap-linux
|
||||||
|
- brew-linux
|
||||||
- pacman
|
- pacman
|
||||||
FreeBSD:
|
FreeBSD:
|
||||||
- pkg
|
- pkg
|
||||||
@ -36,6 +37,8 @@ tools:
|
|||||||
package: https://packages.debian.org/sid/web/httpie
|
package: https://packages.debian.org/sid/web/httpie
|
||||||
commands:
|
commands:
|
||||||
install:
|
install:
|
||||||
|
- curl -SsL https://packages.httpie.io/deb/KEY.gpg | apt-key add -
|
||||||
|
- curl -SsL -o /etc/apt/sources.list.d/httpie.list https://packages.httpie.io/deb/httpie.list
|
||||||
- apt update
|
- apt update
|
||||||
- apt install httpie
|
- apt install httpie
|
||||||
upgrade:
|
upgrade:
|
||||||
@ -179,3 +182,16 @@ tools:
|
|||||||
- yum install httpie
|
- yum install httpie
|
||||||
upgrade:
|
upgrade:
|
||||||
- yum upgrade httpie
|
- yum upgrade httpie
|
||||||
|
|
||||||
|
single-binary:
|
||||||
|
title: Single binary executables
|
||||||
|
name: Single binary executables
|
||||||
|
note: Get the standalone HTTPie Linux executables when you don't want to go through the full installation process.
|
||||||
|
links:
|
||||||
|
commands:
|
||||||
|
install:
|
||||||
|
- https --download packages.httpie.io/binaries/linux/http-latest -o http
|
||||||
|
- ln -ls ./http ./https
|
||||||
|
- chmod +x ./http ./https
|
||||||
|
upgrade:
|
||||||
|
- https --download packages.httpie.io/binaries/linux/http-latest -o http
|
||||||
|
@ -22,7 +22,7 @@ If it is needed to be done manually, the following command can be used:
|
|||||||
$ brew bump-formula-pr httpie --version={TARGET_VERSION}
|
$ brew bump-formula-pr httpie --version={TARGET_VERSION}
|
||||||
```
|
```
|
||||||
|
|
||||||
which will bump the formala, and create a PR against the package index.
|
which will bump the formula, and create a PR against the package index.
|
||||||
|
|
||||||
## Hacking
|
## Hacking
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
<package xmlns="http://schemas.microsoft.com/packaging/2015/06/nuspec.xsd">
|
<package xmlns="http://schemas.microsoft.com/packaging/2015/06/nuspec.xsd">
|
||||||
<metadata>
|
<metadata>
|
||||||
<id>httpie</id>
|
<id>httpie</id>
|
||||||
<version>3.1.0</version>
|
<version>3.2.1</version>
|
||||||
<summary>Modern, user-friendly command-line HTTP client for the API era</summary>
|
<summary>Modern, user-friendly command-line HTTP client for the API era</summary>
|
||||||
<description>
|
<description>
|
||||||
HTTPie *aitch-tee-tee-pie* is a user-friendly command-line HTTP client for the API era.
|
HTTPie *aitch-tee-tee-pie* is a user-friendly command-line HTTP client for the API era.
|
||||||
@ -33,7 +33,7 @@ Main features:
|
|||||||
<licenseUrl>https://raw.githubusercontent.com/httpie/httpie/master/LICENSE</licenseUrl>
|
<licenseUrl>https://raw.githubusercontent.com/httpie/httpie/master/LICENSE</licenseUrl>
|
||||||
<iconUrl>https://pie-assets.s3.eu-central-1.amazonaws.com/LogoIcons/GB.png</iconUrl>
|
<iconUrl>https://pie-assets.s3.eu-central-1.amazonaws.com/LogoIcons/GB.png</iconUrl>
|
||||||
<requireLicenseAcceptance>false</requireLicenseAcceptance>
|
<requireLicenseAcceptance>false</requireLicenseAcceptance>
|
||||||
<releaseNotes>See the [changelog](https://github.com/httpie/httpie/releases/tag/3.1.0).</releaseNotes>
|
<releaseNotes>See the [changelog](https://github.com/httpie/httpie/releases/tag/3.2.0).</releaseNotes>
|
||||||
<tags>httpie http https rest api client curl python ssl cli foss oss url</tags>
|
<tags>httpie http https rest api client curl python ssl cli foss oss url</tags>
|
||||||
<projectUrl>https://httpie.io</projectUrl>
|
<projectUrl>https://httpie.io</projectUrl>
|
||||||
<packageSourceUrl>https://github.com/httpie/httpie/tree/master/docs/packaging/windows-chocolatey</packageSourceUrl>
|
<packageSourceUrl>https://github.com/httpie/httpie/tree/master/docs/packaging/windows-chocolatey</packageSourceUrl>
|
||||||
|
@ -1,52 +1,24 @@
|
|||||||
function __fish_httpie_styles
|
function __fish_httpie_styles
|
||||||
echo "
|
printf '%s\n' abap algol algol_nu arduino auto autumn borland bw colorful default emacs friendly fruity gruvbox-dark gruvbox-light igor inkpot lovelace manni material monokai murphy native paraiso-dark paraiso-light pastie perldoc pie pie-dark pie-light rainbow_dash rrt sas solarized solarized-dark solarized-light stata stata-dark stata-light tango trac vim vs xcode zenburn
|
||||||
abap
|
end
|
||||||
algol
|
|
||||||
algol_nu
|
function __fish_httpie_mime_types
|
||||||
arduino
|
test -r /usr/share/mime/types && cat /usr/share/mime/types
|
||||||
auto
|
end
|
||||||
autumn
|
|
||||||
borland
|
function __fish_httpie_print_args
|
||||||
bw
|
set -l arg (commandline -t)
|
||||||
colorful
|
string match -qe H "$arg" || echo -e $arg"H\trequest headers"
|
||||||
default
|
string match -qe B "$arg" || echo -e $arg"B\trequest body"
|
||||||
emacs
|
string match -qe h "$arg" || echo -e $arg"h\tresponse headers"
|
||||||
friendly
|
string match -qe b "$arg" || echo -e $arg"b\tresponse body"
|
||||||
fruity
|
string match -qe m "$arg" || echo -e $arg"m\tresponse metadata"
|
||||||
gruvbox-dark
|
|
||||||
gruvbox-light
|
|
||||||
igor
|
|
||||||
inkpot
|
|
||||||
lovelace
|
|
||||||
manni
|
|
||||||
material
|
|
||||||
monokai
|
|
||||||
murphy
|
|
||||||
native
|
|
||||||
paraiso-dark
|
|
||||||
paraiso-light
|
|
||||||
pastie
|
|
||||||
perldoc
|
|
||||||
rainbow_dash
|
|
||||||
rrt
|
|
||||||
sas
|
|
||||||
solarized
|
|
||||||
solarized-dark
|
|
||||||
solarized-light
|
|
||||||
stata
|
|
||||||
stata-dark
|
|
||||||
stata-light
|
|
||||||
tango
|
|
||||||
trac
|
|
||||||
vim
|
|
||||||
vs
|
|
||||||
xcode
|
|
||||||
zenburn"
|
|
||||||
end
|
end
|
||||||
|
|
||||||
function __fish_httpie_auth_types
|
function __fish_httpie_auth_types
|
||||||
echo -e "basic\tBasic HTTP auth"
|
echo -e "basic\tBasic HTTP auth"
|
||||||
echo -e "digest\tDigest HTTP auth"
|
echo -e "digest\tDigest HTTP auth"
|
||||||
|
echo -e "bearer\tBearer HTTP Auth"
|
||||||
end
|
end
|
||||||
|
|
||||||
function __fish_http_verify_options
|
function __fish_http_verify_options
|
||||||
@ -54,6 +26,7 @@ function __fish_http_verify_options
|
|||||||
echo -e "no\tDisable cert verification"
|
echo -e "no\tDisable cert verification"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
# Predefined Content Types
|
# Predefined Content Types
|
||||||
|
|
||||||
complete -c http -s j -l json -d 'Data items are serialized as a JSON object'
|
complete -c http -s j -l json -d 'Data items are serialized as a JSON object'
|
||||||
@ -70,26 +43,28 @@ complete -c http -s x -l compress -d 'Content compressed with Deflate algorithm'
|
|||||||
|
|
||||||
# Output Processing
|
# Output Processing
|
||||||
|
|
||||||
complete -c http -l pretty -xa "all colors format none" -d 'Controls output processing'
|
complete -c http -l pretty -xa "all colors format none" -d 'Controls output processing'
|
||||||
complete -c http -s s -l style -xa "(__fish_httpie_styles)" -d 'Output coloring style'
|
complete -c http -s s -l style -xa "(__fish_httpie_styles)" -d 'Output coloring style'
|
||||||
complete -c http -l unsorted -d 'Disables all sorting while formatting output'
|
complete -c http -l unsorted -d 'Disables all sorting while formatting output'
|
||||||
complete -c http -l sorted -d 'Re-enables all sorting options while formatting output'
|
complete -c http -l sorted -d 'Re-enables all sorting options while formatting output'
|
||||||
complete -c http -l format-options -x -d 'Controls output formatting'
|
complete -c http -l response-charset -x -d 'Override the response encoding'
|
||||||
|
complete -c http -l response-mime -xa "(__fish_httpie_mime_types)" -d 'Override the response mime type for coloring and formatting'
|
||||||
|
complete -c http -l format-options -x -d 'Controls output formatting'
|
||||||
|
|
||||||
|
|
||||||
# Output Options
|
# Output Options
|
||||||
|
|
||||||
complete -c http -s p -l print -x -d 'String specifying what the output should contain'
|
complete -c http -s p -l print -xa "(__fish_httpie_print_args)" -d 'String specifying what the output should contain'
|
||||||
complete -c http -s h -l headers -d 'Print only the response headers'
|
complete -c http -s h -l headers -d 'Print only the response headers'
|
||||||
complete -c http -s b -l body -d 'Print only the response body'
|
complete -c http -s m -l meta -d 'Print only the response metadata'
|
||||||
complete -c http -s v -l verbose -d 'Print the whole request as well as the response'
|
complete -c http -s b -l body -d 'Print only the response body'
|
||||||
complete -c http -l all -d 'Show any intermediary requests/responses'
|
complete -c http -s v -l verbose -d 'Print the whole request as well as the response'
|
||||||
complete -c http -s P -l history-print -x -d 'The same as --print but applies only to intermediary requests/responses'
|
complete -c http -l all -d 'Show any intermediary requests/responses'
|
||||||
complete -c http -s S -l stream -d 'Always stream the response body by line'
|
complete -c http -s S -l stream -d 'Always stream the response body by line'
|
||||||
complete -c http -s o -l output -F -d 'Save output to FILE'
|
complete -c http -s o -l output -F -d 'Save output to FILE'
|
||||||
complete -c http -s d -l download -d 'Download a file'
|
complete -c http -s d -l download -d 'Download a file'
|
||||||
complete -c http -s c -l continue -d 'Resume an interrupted download'
|
complete -c http -s c -l continue -d 'Resume an interrupted download'
|
||||||
complete -c http -s q -l quiet -d 'Do not print to stdout or stderr'
|
complete -c http -s q -l quiet -d 'Do not print to stdout or stderr'
|
||||||
|
|
||||||
|
|
||||||
# Sessions
|
# Sessions
|
||||||
@ -115,22 +90,24 @@ complete -c http -l max-headers -x -d 'Maximum number of response headers
|
|||||||
complete -c http -l timeout -x -d 'Connection timeout in seconds'
|
complete -c http -l timeout -x -d 'Connection timeout in seconds'
|
||||||
complete -c http -l check-status -d 'Error with non-200 HTTP status code'
|
complete -c http -l check-status -d 'Error with non-200 HTTP status code'
|
||||||
complete -c http -l path-as-is -d 'Bypass dot segment URL squashing'
|
complete -c http -l path-as-is -d 'Bypass dot segment URL squashing'
|
||||||
complete -c http -l chunked -d ''
|
complete -c http -l chunked -d 'Enable streaming via chunked transfer encoding'
|
||||||
|
|
||||||
|
|
||||||
# SSL
|
# SSL
|
||||||
|
|
||||||
complete -c http -l verify -xa "(__fish_http_verify_options)" -d 'Enable/disable cert verification'
|
complete -c http -l verify -xa "(__fish_http_verify_options)" -d 'Enable/disable cert verification'
|
||||||
complete -c http -l ssl -x -d 'Desired protocol version to use'
|
complete -c http -l ssl -x -d 'Desired protocol version to use'
|
||||||
complete -c http -l ciphers -x -d 'String in the OpenSSL cipher list format'
|
complete -c http -l ciphers -x -d 'String in the OpenSSL cipher list format'
|
||||||
complete -c http -l cert -F -d 'Client side SSL certificate'
|
complete -c http -l cert -F -d 'Client side SSL certificate'
|
||||||
complete -c http -l cert-key -F -d 'Private key to use with SSL'
|
complete -c http -l cert-key -F -d 'Private key to use with SSL'
|
||||||
|
complete -c http -l cert-key-pass -x -d 'Passphrase for the given private key'
|
||||||
|
|
||||||
|
|
||||||
# Troubleshooting
|
# Troubleshooting
|
||||||
|
|
||||||
complete -c http -s I -l ignore-stdin -d 'Do not attempt to read stdin'
|
complete -c http -s I -l ignore-stdin -d 'Do not attempt to read stdin'
|
||||||
complete -c http -l help -d 'Show help'
|
complete -c http -l help -d 'Show help'
|
||||||
|
complete -c http -l manual -d 'Show the full manual'
|
||||||
complete -c http -l version -d 'Show version'
|
complete -c http -l version -d 'Show version'
|
||||||
complete -c http -l traceback -d 'Prints exception traceback should one occur'
|
complete -c http -l traceback -d 'Prints exception traceback should one occur'
|
||||||
complete -c http -l default-scheme -x -d 'The default scheme to use'
|
complete -c http -l default-scheme -x -d 'The default scheme to use'
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
.TH http 1 "2022-03-08" "HTTPie 3.1.1.dev0" "HTTPie Manual"
|
.\" This file is auto-generated from the parser declaration in httpie/cli/definition.py by extras/scripts/generate_man_pages.py.
|
||||||
|
.TH http 1 "2022-05-06" "HTTPie 3.2.1" "HTTPie Manual"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
http
|
http
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
@ -6,7 +7,7 @@ http [METHOD] URL [REQUEST_ITEM ...]
|
|||||||
|
|
||||||
.SH DESCRIPTION
|
.SH DESCRIPTION
|
||||||
HTTPie: modern, user-friendly command-line HTTP client for the API era. <https://httpie.io>
|
HTTPie: modern, user-friendly command-line HTTP client for the API era. <https://httpie.io>
|
||||||
.SH Positional Arguments
|
.SH Positional arguments
|
||||||
|
|
||||||
These arguments come after any flags and in the order they are listed here.
|
These arguments come after any flags and in the order they are listed here.
|
||||||
Only URL is required.
|
Only URL is required.
|
||||||
@ -27,8 +28,8 @@ is some data to be sent, otherwise GET:
|
|||||||
.IP "\fB\,URL\/\fR"
|
.IP "\fB\,URL\/\fR"
|
||||||
|
|
||||||
|
|
||||||
The request URL. Scheme defaults to \'http://\' if the URL
|
The request URL. Scheme defaults to \[aq]http://\[aq] if the URL
|
||||||
does not include one. (You can override this with:\fB\,--default-scheme\/\fR=http/https)
|
does not include one. (You can override this with: \fB\,--default-scheme\/\fR=http/https)
|
||||||
|
|
||||||
You can also use a shorthand for localhost
|
You can also use a shorthand for localhost
|
||||||
|
|
||||||
@ -43,44 +44,44 @@ You can also use a shorthand for localhost
|
|||||||
Optional key-value pairs to be included in the request. The separator used
|
Optional key-value pairs to be included in the request. The separator used
|
||||||
determines the type:
|
determines the type:
|
||||||
|
|
||||||
\':\' HTTP headers:
|
\[aq]:\[aq] HTTP headers:
|
||||||
|
|
||||||
Referer:https://httpie.io Cookie:foo=bar User-Agent:bacon/1.0
|
Referer:https://httpie.io Cookie:foo=bar User-Agent:bacon/1.0
|
||||||
|
|
||||||
\'==\' URL parameters to be appended to the request URI:
|
\[aq]==\[aq] URL parameters to be appended to the request URI:
|
||||||
|
|
||||||
search==httpie
|
search==httpie
|
||||||
|
|
||||||
\'=\' Data fields to be serialized into a JSON object (with\fB\,--json\/\fR,\fB\,-j\/\fR)
|
\[aq]=\[aq] Data fields to be serialized into a JSON object (with \fB\,--json\/\fR, \fB\,-j\/\fR)
|
||||||
or form data (with\fB\,--form\/\fR,\fB\,-f\/\fR):
|
or form data (with \fB\,--form\/\fR, \fB\,-f\/\fR):
|
||||||
|
|
||||||
name=HTTPie language=Python description=\'CLI HTTP client\'
|
name=HTTPie language=Python description=\[aq]CLI HTTP client\[aq]
|
||||||
|
|
||||||
\':=\' Non-string JSON data fields (only with\fB\,--json\/\fR,\fB\,-j\/\fR):
|
\[aq]:=\[aq] Non-string JSON data fields (only with \fB\,--json\/\fR, \fB\,-j\/\fR):
|
||||||
|
|
||||||
awesome:=true amount:=42 colors:=\'["red", "green", "blue"]\'
|
awesome:=true amount:=42 colors:=\[aq][\[dq]red\[dq], \[dq]green\[dq], \[dq]blue\[dq]]\[aq]
|
||||||
|
|
||||||
\'@\' Form file fields (only with\fB\,--form\/\fR or\fB\,--multipart\/\fR):
|
\[aq]@\[aq] Form file fields (only with \fB\,--form\/\fR or \fB\,--multipart\/\fR):
|
||||||
|
|
||||||
cv@\~/Documents/CV.pdf
|
cv@\(ti/Documents/CV.pdf
|
||||||
cv@\'\~/Documents/CV.pdf;type=application/pdf\'
|
cv@\[aq]\(ti/Documents/CV.pdf;type=application/pdf\[aq]
|
||||||
|
|
||||||
\'=@\' A data field like \'=\', but takes a file path and embeds its content:
|
\[aq]=@\[aq] A data field like \[aq]=\[aq], but takes a file path and embeds its content:
|
||||||
|
|
||||||
essay=@Documents/essay.txt
|
essay=@Documents/essay.txt
|
||||||
|
|
||||||
\':=@\' A raw JSON field like \':=\', but takes a file path and embeds its content:
|
\[aq]:=@\[aq] A raw JSON field like \[aq]:=\[aq], but takes a file path and embeds its content:
|
||||||
|
|
||||||
package:=@./package.json
|
package:=@./package.json
|
||||||
|
|
||||||
You can use a backslash to escape a colliding separator in the field name:
|
You can use a backslash to escape a colliding separator in the field name:
|
||||||
|
|
||||||
field-name-with\\:colon=value
|
field-name-with\e:colon=value
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.PP
|
.PP
|
||||||
.SH Predefined Content Types
|
.SH Predefined content types
|
||||||
.IP "\fB\,--json\/\fR, \fB\,-j\/\fR"
|
.IP "\fB\,--json\/\fR, \fB\,-j\/\fR"
|
||||||
|
|
||||||
|
|
||||||
@ -104,13 +105,13 @@ multipart/form-data request.
|
|||||||
.IP "\fB\,--multipart\/\fR"
|
.IP "\fB\,--multipart\/\fR"
|
||||||
|
|
||||||
|
|
||||||
Similar to\fB\,--form\/\fR, but always sends a multipart/form-data request (i.e., even without files).
|
Similar to \fB\,--form\/\fR, but always sends a multipart/form-data request (i.e., even without files).
|
||||||
|
|
||||||
|
|
||||||
.IP "\fB\,--boundary\/\fR"
|
.IP "\fB\,--boundary\/\fR"
|
||||||
|
|
||||||
|
|
||||||
Specify a custom boundary string for multipart/form-data requests. Only has effect only together with\fB\,--form\/\fR.
|
Specify a custom boundary string for multipart/form-data requests. Only has effect only together with \fB\,--form\/\fR.
|
||||||
|
|
||||||
|
|
||||||
.IP "\fB\,--raw\/\fR"
|
.IP "\fB\,--raw\/\fR"
|
||||||
@ -119,7 +120,7 @@ Specify a custom boundary string for multipart/form-data requests. Only has effe
|
|||||||
This option allows you to pass raw request data without extra processing
|
This option allows you to pass raw request data without extra processing
|
||||||
(as opposed to the structured request items syntax):
|
(as opposed to the structured request items syntax):
|
||||||
|
|
||||||
$ http\fB\,--raw\/\fR=\'data\' pie.dev/post
|
$ http \fB\,--raw\/\fR=\[aq]data\[aq] pie.dev/post
|
||||||
|
|
||||||
You can achieve the same by piping the data via stdin:
|
You can achieve the same by piping the data via stdin:
|
||||||
|
|
||||||
@ -133,7 +134,7 @@ Or have HTTPie load the raw data from a file:
|
|||||||
|
|
||||||
|
|
||||||
.PP
|
.PP
|
||||||
.SH Content Processing Options
|
.SH Content processing options
|
||||||
.IP "\fB\,--compress\/\fR, \fB\,-x\/\fR"
|
.IP "\fB\,--compress\/\fR, \fB\,-x\/\fR"
|
||||||
|
|
||||||
|
|
||||||
@ -146,39 +147,39 @@ negative. Compression can be forced by repeating the argument.
|
|||||||
|
|
||||||
|
|
||||||
.PP
|
.PP
|
||||||
.SH Output Processing
|
.SH Output processing
|
||||||
.IP "\fB\,--pretty\/\fR"
|
.IP "\fB\,--pretty\/\fR"
|
||||||
|
|
||||||
|
|
||||||
Controls output processing. The value can be "none" to not prettify
|
Controls output processing. The value can be \[dq]none\[dq] to not prettify
|
||||||
the output (default for redirected output), "all" to apply both colors
|
the output (default for redirected output), \[dq]all\[dq] to apply both colors
|
||||||
and formatting (default for terminal output), "colors", or "format".
|
and formatting (default for terminal output), \[dq]colors\[dq], or \[dq]format\[dq].
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.IP "\fB\,--style\/\fR, \fB\,-s\/\fR \fI\,STYLE\/\fR"
|
.IP "\fB\,--style\/\fR, \fB\,-s\/\fR \fI\,STYLE\/\fR"
|
||||||
|
|
||||||
|
|
||||||
Output coloring style (default is "auto"). It can be one of:
|
Output coloring style (default is \[dq]auto\[dq]). It can be one of:
|
||||||
|
|
||||||
auto, pie, pie-dark, pie-light, solarized
|
auto, pie, pie-dark, pie-light, solarized
|
||||||
|
|
||||||
|
|
||||||
For finding out all available styles in your system, try:
|
For finding out all available styles in your system, try:
|
||||||
|
|
||||||
$ http\fB\,--style\/\fR
|
$ http \fB\,--style\/\fR
|
||||||
|
|
||||||
The "auto" style follows your terminal\'s ANSI color styles.
|
The \[dq]auto\[dq] style follows your terminal\[aq]s ANSI color styles.
|
||||||
For non-auto styles to work properly, please make sure that the
|
For non-auto styles to work properly, please make sure that the
|
||||||
$TERM environment variable is set to "xterm-256color" or similar
|
$TERM environment variable is set to \[dq]xterm-256color\[dq] or similar
|
||||||
(e.g., via `export TERM=xterm-256color\' in your \~/.bashrc).
|
(e.g., via `export TERM=xterm-256color\[aq] in your \(ti/.bashrc).
|
||||||
|
|
||||||
.IP "\fB\,--unsorted\/\fR"
|
.IP "\fB\,--unsorted\/\fR"
|
||||||
|
|
||||||
|
|
||||||
Disables all sorting while formatting output. It is a shortcut for:
|
Disables all sorting while formatting output. It is a shortcut for:
|
||||||
|
|
||||||
\fB\,--format-options\/\fR=headers.sort:false,json.sort_keys:false
|
\fB\,--format-options\/\fR=headers.sort:false,json.sort_keys:false
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -187,7 +188,7 @@ Disables all sorting while formatting output. It is a shortcut for:
|
|||||||
|
|
||||||
Re-enables all sorting options while formatting output. It is a shortcut for:
|
Re-enables all sorting options while formatting output. It is a shortcut for:
|
||||||
|
|
||||||
\fB\,--format-options\/\fR=headers.sort:true,json.sort_keys:true
|
\fB\,--format-options\/\fR=headers.sort:true,json.sort_keys:true
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -196,8 +197,8 @@ Re-enables all sorting options while formatting output. It is a shortcut for:
|
|||||||
|
|
||||||
Override the response encoding for terminal display purposes, e.g.:
|
Override the response encoding for terminal display purposes, e.g.:
|
||||||
|
|
||||||
\fB\,--response-charset\/\fR=utf8
|
\fB\,--response-charset\/\fR=utf8
|
||||||
\fB\,--response-charset\/\fR=big5
|
\fB\,--response-charset\/\fR=big5
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -206,8 +207,8 @@ Override the response encoding for terminal display purposes, e.g.:
|
|||||||
|
|
||||||
Override the response mime type for coloring and formatting for the terminal, e.g.:
|
Override the response mime type for coloring and formatting for the terminal, e.g.:
|
||||||
|
|
||||||
\fB\,--response-mime\/\fR=application/json
|
\fB\,--response-mime\/\fR=application/json
|
||||||
\fB\,--response-mime\/\fR=text/xml
|
\fB\,--response-mime\/\fR=text/xml
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -215,7 +216,7 @@ Override the response mime type for coloring and formatting for the terminal, e.
|
|||||||
|
|
||||||
|
|
||||||
Controls output formatting. Only relevant when formatting is enabled
|
Controls output formatting. Only relevant when formatting is enabled
|
||||||
through (explicit or implied)\fB\,--pretty\/\fR=all or\fB\,--pretty\/\fR=format.
|
through (explicit or implied) \fB\,--pretty\/\fR=all or \fB\,--pretty\/\fR=format.
|
||||||
The following are the default options:
|
The following are the default options:
|
||||||
|
|
||||||
headers.sort:true
|
headers.sort:true
|
||||||
@ -229,26 +230,26 @@ You may use this option multiple times, as well as specify multiple
|
|||||||
comma-separated options at the same time. For example, this modifies the
|
comma-separated options at the same time. For example, this modifies the
|
||||||
settings to disable the sorting of JSON keys, and sets the indent size to 2:
|
settings to disable the sorting of JSON keys, and sets the indent size to 2:
|
||||||
|
|
||||||
\fB\,--format-options\/\fR json.sort_keys:false,json.indent:2
|
\fB\,--format-options\/\fR json.sort_keys:false,json.indent:2
|
||||||
|
|
||||||
This is something you will typically put into your config file.
|
This is something you will typically put into your config file.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.PP
|
.PP
|
||||||
.SH Output Options
|
.SH Output options
|
||||||
.IP "\fB\,--print\/\fR, \fB\,-p\/\fR \fI\,WHAT\/\fR"
|
.IP "\fB\,--print\/\fR, \fB\,-p\/\fR \fI\,WHAT\/\fR"
|
||||||
|
|
||||||
|
|
||||||
String specifying what the output should contain:
|
String specifying what the output should contain:
|
||||||
|
|
||||||
\'H\' request headers
|
\[aq]H\[aq] request headers
|
||||||
\'B\' request body
|
\[aq]B\[aq] request body
|
||||||
\'h\' response headers
|
\[aq]h\[aq] response headers
|
||||||
\'b\' response body
|
\[aq]b\[aq] response body
|
||||||
\'m\' response metadata
|
\[aq]m\[aq] response metadata
|
||||||
|
|
||||||
The default behaviour is \'hb\' (i.e., the response
|
The default behaviour is \[aq]hb\[aq] (i.e., the response
|
||||||
headers and body is printed), if standard output is not redirected.
|
headers and body is printed), if standard output is not redirected.
|
||||||
If the output is piped to another program or to a file, then only the
|
If the output is piped to another program or to a file, then only the
|
||||||
response body is printed by default.
|
response body is printed by default.
|
||||||
@ -258,34 +259,34 @@ response body is printed by default.
|
|||||||
.IP "\fB\,--headers\/\fR, \fB\,-h\/\fR"
|
.IP "\fB\,--headers\/\fR, \fB\,-h\/\fR"
|
||||||
|
|
||||||
|
|
||||||
Print only the response headers. Shortcut for\fB\,--print\/\fR=h.
|
Print only the response headers. Shortcut for \fB\,--print\/\fR=h.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.IP "\fB\,--meta\/\fR, \fB\,-m\/\fR"
|
.IP "\fB\,--meta\/\fR, \fB\,-m\/\fR"
|
||||||
|
|
||||||
|
|
||||||
Print only the response metadata. Shortcut for\fB\,--print\/\fR=m.
|
Print only the response metadata. Shortcut for \fB\,--print\/\fR=m.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.IP "\fB\,--body\/\fR, \fB\,-b\/\fR"
|
.IP "\fB\,--body\/\fR, \fB\,-b\/\fR"
|
||||||
|
|
||||||
|
|
||||||
Print only the response body. Shortcut for\fB\,--print\/\fR=b.
|
Print only the response body. Shortcut for \fB\,--print\/\fR=b.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.IP "\fB\,--verbose\/\fR, \fB\,-v\/\fR"
|
.IP "\fB\,--verbose\/\fR, \fB\,-v\/\fR"
|
||||||
|
|
||||||
|
|
||||||
Verbose output. For the level one (with single \fB\,-v\/\fR`/\fB\,--verbose\/\fR`), print
|
Verbose output. For the level one (with single `\fB\,-v\/\fR`/`\fB\,--verbose\/\fR`), print
|
||||||
the whole request as well as the response. Also print any intermediary
|
the whole request as well as the response. Also print any intermediary
|
||||||
requests/responses (such as redirects). For the second level and higher,
|
requests/responses (such as redirects). For the second level and higher,
|
||||||
print these as well as the response metadata.
|
print these as well as the response metadata.
|
||||||
|
|
||||||
Level one is a shortcut for:\fB\,--all\/\fR\fB\,--print\/\fR=BHbh
|
Level one is a shortcut for: \fB\,--all\/\fR \fB\,--print\/\fR=BHbh
|
||||||
Level two is a shortcut for:\fB\,--all\/\fR\fB\,--print\/\fR=BHbhm
|
Level two is a shortcut for: \fB\,--all\/\fR \fB\,--print\/\fR=BHbhm
|
||||||
|
|
||||||
|
|
||||||
.IP "\fB\,--all\/\fR"
|
.IP "\fB\,--all\/\fR"
|
||||||
@ -293,23 +294,23 @@ Level two is a shortcut for:\fB\,--all\/\fR\fB\,--print\/\fR=BHbhm
|
|||||||
|
|
||||||
By default, only the final request/response is shown. Use this flag to show
|
By default, only the final request/response is shown. Use this flag to show
|
||||||
any intermediary requests/responses as well. Intermediary requests include
|
any intermediary requests/responses as well. Intermediary requests include
|
||||||
followed redirects (with\fB\,--follow\/\fR), the first unauthorized request when
|
followed redirects (with \fB\,--follow\/\fR), the first unauthorized request when
|
||||||
Digest auth is used \fB\,--auth\/\fR=digest), etc.
|
Digest auth is used (\fB\,--auth\/\fR=digest), etc.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.IP "\fB\,--stream\/\fR, \fB\,-S\/\fR"
|
.IP "\fB\,--stream\/\fR, \fB\,-S\/\fR"
|
||||||
|
|
||||||
|
|
||||||
Always stream the response body by line, i.e., behave like `tail\fB\,-f\/\fR\'.
|
Always stream the response body by line, i.e., behave like `tail \fB\,-f\/\fR\[aq].
|
||||||
|
|
||||||
Without\fB\,--stream\/\fR and with\fB\,--pretty\/\fR (either set or implied),
|
Without \fB\,--stream\/\fR and with \fB\,--pretty\/\fR (either set or implied),
|
||||||
HTTPie fetches the whole response before it outputs the processed data.
|
HTTPie fetches the whole response before it outputs the processed data.
|
||||||
|
|
||||||
Set this option when you want to continuously display a prettified
|
Set this option when you want to continuously display a prettified
|
||||||
long-lived response, such as one from the Twitter streaming API.
|
long-lived response, such as one from the Twitter streaming API.
|
||||||
|
|
||||||
It is useful also without\fB\,--pretty\/\fR: It ensures that the output is flushed
|
It is useful also without \fB\,--pretty\/\fR: It ensures that the output is flushed
|
||||||
more often and in smaller chunks.
|
more often and in smaller chunks.
|
||||||
|
|
||||||
|
|
||||||
@ -317,7 +318,7 @@ more often and in smaller chunks.
|
|||||||
.IP "\fB\,--output\/\fR, \fB\,-o\/\fR \fI\,FILE\/\fR"
|
.IP "\fB\,--output\/\fR, \fB\,-o\/\fR \fI\,FILE\/\fR"
|
||||||
|
|
||||||
|
|
||||||
Save output to FILE instead of stdout. If\fB\,--download\/\fR is also set, then only
|
Save output to FILE instead of stdout. If \fB\,--download\/\fR is also set, then only
|
||||||
the response body is saved to FILE. Other parts of the HTTP exchange are
|
the response body is saved to FILE. Other parts of the HTTP exchange are
|
||||||
printed to stderr.
|
printed to stderr.
|
||||||
|
|
||||||
@ -327,7 +328,7 @@ printed to stderr.
|
|||||||
|
|
||||||
|
|
||||||
Do not print the response body to stdout. Rather, download it and store it
|
Do not print the response body to stdout. Rather, download it and store it
|
||||||
in a file. The filename is guessed unless specified with\fB\,--output\/\fR
|
in a file. The filename is guessed unless specified with \fB\,--output\/\fR
|
||||||
[filename]. This action is similar to the default behaviour of wget.
|
[filename]. This action is similar to the default behaviour of wget.
|
||||||
|
|
||||||
|
|
||||||
@ -335,7 +336,7 @@ in a file. The filename is guessed unless specified with\fB\,--output\/\fR
|
|||||||
.IP "\fB\,--continue\/\fR, \fB\,-c\/\fR"
|
.IP "\fB\,--continue\/\fR, \fB\,-c\/\fR"
|
||||||
|
|
||||||
|
|
||||||
Resume an interrupted download. Note that the\fB\,--output\/\fR option needs to be
|
Resume an interrupted download. Note that the \fB\,--output\/\fR option needs to be
|
||||||
specified as well.
|
specified as well.
|
||||||
|
|
||||||
|
|
||||||
@ -345,8 +346,8 @@ specified as well.
|
|||||||
|
|
||||||
Do not print to stdout or stderr, except for errors and warnings when provided once.
|
Do not print to stdout or stderr, except for errors and warnings when provided once.
|
||||||
Provide twice to suppress warnings as well.
|
Provide twice to suppress warnings as well.
|
||||||
stdout is still redirected if\fB\,--output\/\fR is specified.
|
stdout is still redirected if \fB\,--output\/\fR is specified.
|
||||||
Flag doesn\'t affect behaviour of download beyond not printing to terminal.
|
Flag doesn\[aq]t affect behaviour of download beyond not printing to terminal.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -383,24 +384,24 @@ exchange.
|
|||||||
|
|
||||||
For username/password based authentication mechanisms (e.g
|
For username/password based authentication mechanisms (e.g
|
||||||
basic auth or digest auth) if only the username is provided
|
basic auth or digest auth) if only the username is provided
|
||||||
\fB\,-a\/\fR username), HTTPie will prompt for the password.
|
(\fB\,-a\/\fR username), HTTPie will prompt for the password.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.IP "\fB\,--auth-type\/\fR, \fB\,-A\/\fR"
|
.IP "\fB\,--auth-type\/\fR, \fB\,-A\/\fR"
|
||||||
|
|
||||||
|
|
||||||
The authentication mechanism to be used. Defaults to "basic".
|
The authentication mechanism to be used. Defaults to \[dq]basic\[dq].
|
||||||
|
|
||||||
"basic": Basic HTTP auth
|
\[dq]basic\[dq]: Basic HTTP auth
|
||||||
|
|
||||||
"digest": Digest HTTP auth
|
\[dq]digest\[dq]: Digest HTTP auth
|
||||||
|
|
||||||
"bearer": Bearer HTTP Auth
|
\[dq]bearer\[dq]: Bearer HTTP Auth
|
||||||
|
|
||||||
For finding out all available authentication types in your system, try:
|
For finding out all available authentication types in your system, try:
|
||||||
|
|
||||||
$ http\fB\,--auth-type\/\fR
|
$ http \fB\,--auth-type\/\fR
|
||||||
|
|
||||||
.IP "\fB\,--ignore-netrc\/\fR"
|
.IP "\fB\,--ignore-netrc\/\fR"
|
||||||
|
|
||||||
@ -413,7 +414,7 @@ Ignore credentials from .netrc.
|
|||||||
.IP "\fB\,--offline\/\fR"
|
.IP "\fB\,--offline\/\fR"
|
||||||
|
|
||||||
|
|
||||||
Build the request and print it but don\'t actually send it.
|
Build the request and print it but don\(gat actually send it.
|
||||||
|
|
||||||
|
|
||||||
.IP "\fB\,--proxy\/\fR \fI\,PROTOCOL:PROXY_URL\/\fR"
|
.IP "\fB\,--proxy\/\fR \fI\,PROTOCOL:PROXY_URL\/\fR"
|
||||||
@ -435,7 +436,7 @@ Follow 30x Location redirects.
|
|||||||
.IP "\fB\,--max-redirects\/\fR"
|
.IP "\fB\,--max-redirects\/\fR"
|
||||||
|
|
||||||
|
|
||||||
By default, requests have a limit of 30 redirects (works with\fB\,--follow\/\fR).
|
By default, requests have a limit of 30 redirects (works with \fB\,--follow\/\fR).
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -466,7 +467,7 @@ exit with an error if the status indicates one.
|
|||||||
|
|
||||||
When the server replies with a 4xx (Client Error) or 5xx (Server Error)
|
When the server replies with a 4xx (Client Error) or 5xx (Server Error)
|
||||||
status code, HTTPie exits with 4 or 5 respectively. If the response is a
|
status code, HTTPie exits with 4 or 5 respectively. If the response is a
|
||||||
3xx (Redirect) and\fB\,--follow\/\fR hasn\'t been set, then the exit status is 3.
|
3xx (Redirect) and \fB\,--follow\/\fR hasn\[aq]t been set, then the exit status is 3.
|
||||||
Also an error message is written to stderr if stdout is redirected.
|
Also an error message is written to stderr if stdout is redirected.
|
||||||
|
|
||||||
|
|
||||||
@ -488,8 +489,8 @@ Enable streaming via chunked transfer encoding. The Transfer-Encoding header is
|
|||||||
.IP "\fB\,--verify\/\fR"
|
.IP "\fB\,--verify\/\fR"
|
||||||
|
|
||||||
|
|
||||||
Set to "no" (or "false") to skip checking the host\'s SSL certificate.
|
Set to \[dq]no\[dq] (or \[dq]false\[dq]) to skip checking the host\[aq]s SSL certificate.
|
||||||
Defaults to "yes" ("true"). You can also pass the path to a CA_BUNDLE file
|
Defaults to \[dq]yes\[dq] (\[dq]true\[dq]). You can also pass the path to a CA_BUNDLE file
|
||||||
for private certs. (Or you can set the REQUESTS_CA_BUNDLE environment
|
for private certs. (Or you can set the REQUESTS_CA_BUNDLE environment
|
||||||
variable instead.)
|
variable instead.)
|
||||||
|
|
||||||
@ -521,14 +522,14 @@ ECDHE+AESGCM:ECDHE+CHACHA20:DHE+AESGCM:DHE+CHACHA20:ECDH+AESGCM:DH+AESGCM:ECDH+A
|
|||||||
|
|
||||||
You can specify a local cert to use as client side SSL certificate.
|
You can specify a local cert to use as client side SSL certificate.
|
||||||
This file may either contain both private key and certificate or you may
|
This file may either contain both private key and certificate or you may
|
||||||
specify\fB\,--cert-key\/\fR separately.
|
specify \fB\,--cert-key\/\fR separately.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.IP "\fB\,--cert-key\/\fR"
|
.IP "\fB\,--cert-key\/\fR"
|
||||||
|
|
||||||
|
|
||||||
The private key to use with SSL. Only needed if\fB\,--cert\/\fR is given and the
|
The private key to use with SSL. Only needed if \fB\,--cert\/\fR is given and the
|
||||||
certificate file does not contain the private key.
|
certificate file does not contain the private key.
|
||||||
|
|
||||||
|
|
||||||
@ -536,9 +537,9 @@ certificate file does not contain the private key.
|
|||||||
.IP "\fB\,--cert-key-pass\/\fR"
|
.IP "\fB\,--cert-key-pass\/\fR"
|
||||||
|
|
||||||
|
|
||||||
The passphrase to be used to with the given private key. Only needed if\fB\,--cert-key\/\fR
|
The passphrase to be used to with the given private key. Only needed if \fB\,--cert-key\/\fR
|
||||||
is given and the key file requires a passphrase.
|
is given and the key file requires a passphrase.
|
||||||
If not provided, you\'ll be prompted interactively.
|
If not provided, you\(gall be prompted interactively.
|
||||||
|
|
||||||
|
|
||||||
.PP
|
.PP
|
||||||
@ -587,4 +588,11 @@ information useful for debugging HTTPie itself and for reporting bugs.
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
.PP
|
.PP
|
||||||
|
.SH SEE ALSO
|
||||||
|
|
||||||
|
For every \fB\,--OPTION\/\fR there is also a \fB\,--no-OPTION\/\fR that reverts OPTION
|
||||||
|
to its default value.
|
||||||
|
|
||||||
|
Suggestions and bug reports are greatly appreciated:
|
||||||
|
https://github.com/httpie/httpie/issues
|
@ -1,9 +1,9 @@
|
|||||||
.TH httpie 1 "2022-03-08" "HTTPie 3.1.1.dev0" "HTTPie Manual"
|
.\" This file is auto-generated from the parser declaration in httpie/manager/cli.py by extras/scripts/generate_man_pages.py.
|
||||||
|
.TH httpie 1 "2022-05-06" "HTTPie 3.2.1" "HTTPie Manual"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
httpie
|
httpie
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
httpie HOSTNAME SESSION_NAME_OR_PATH TARGET TARGET TARGET TARGET TARGET TARGET
|
httpie
|
||||||
|
|
||||||
.SH DESCRIPTION
|
.SH DESCRIPTION
|
||||||
|
|
||||||
Managing interface for the HTTPie itself. <https://httpie.io/docs#manager>
|
Managing interface for the HTTPie itself. <https://httpie.io/docs#manager>
|
||||||
@ -12,12 +12,21 @@ Be aware that you might be looking for http/https commands for sending
|
|||||||
HTTP requests. This command is only available for managing the HTTTPie
|
HTTP requests. This command is only available for managing the HTTTPie
|
||||||
plugins and the configuration around it.
|
plugins and the configuration around it.
|
||||||
|
|
||||||
|
|
||||||
|
If you are looking for the man pages of http/https commands, try one of the following:
|
||||||
|
$ man http
|
||||||
|
$ man https
|
||||||
|
|
||||||
|
|
||||||
.SH httpie cli export-args
|
.SH httpie cli export-args
|
||||||
Export available options for the CLI
|
Export available options for the CLI
|
||||||
.IP "\fB\,-f\/\fR, \fB\,--format\/\fR"
|
.IP "\fB\,-f\/\fR, \fB\,--format\/\fR"
|
||||||
|
|
||||||
|
Format to export in.
|
||||||
|
|
||||||
|
.PP
|
||||||
|
.SH httpie cli check-updates
|
||||||
|
Check for updates
|
||||||
.PP
|
.PP
|
||||||
.SH httpie cli sessions upgrade
|
.SH httpie cli sessions upgrade
|
||||||
Upgrade the given HTTPie session with the latest layout. A list of changes between different session versions can be found in the official documentation.
|
Upgrade the given HTTPie session with the latest layout. A list of changes between different session versions can be found in the official documentation.
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
.TH https 1 "2022-03-08" "HTTPie 3.1.1.dev0" "HTTPie Manual"
|
.\" This file is auto-generated from the parser declaration in httpie/cli/definition.py by extras/scripts/generate_man_pages.py.
|
||||||
|
.TH https 1 "2022-05-06" "HTTPie 3.2.1" "HTTPie Manual"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
https
|
https
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
@ -6,7 +7,7 @@ https [METHOD] URL [REQUEST_ITEM ...]
|
|||||||
|
|
||||||
.SH DESCRIPTION
|
.SH DESCRIPTION
|
||||||
HTTPie: modern, user-friendly command-line HTTP client for the API era. <https://httpie.io>
|
HTTPie: modern, user-friendly command-line HTTP client for the API era. <https://httpie.io>
|
||||||
.SH Positional Arguments
|
.SH Positional arguments
|
||||||
|
|
||||||
These arguments come after any flags and in the order they are listed here.
|
These arguments come after any flags and in the order they are listed here.
|
||||||
Only URL is required.
|
Only URL is required.
|
||||||
@ -27,8 +28,8 @@ is some data to be sent, otherwise GET:
|
|||||||
.IP "\fB\,URL\/\fR"
|
.IP "\fB\,URL\/\fR"
|
||||||
|
|
||||||
|
|
||||||
The request URL. Scheme defaults to \'http://\' if the URL
|
The request URL. Scheme defaults to \[aq]http://\[aq] if the URL
|
||||||
does not include one. (You can override this with:\fB\,--default-scheme\/\fR=http/https)
|
does not include one. (You can override this with: \fB\,--default-scheme\/\fR=http/https)
|
||||||
|
|
||||||
You can also use a shorthand for localhost
|
You can also use a shorthand for localhost
|
||||||
|
|
||||||
@ -43,44 +44,44 @@ You can also use a shorthand for localhost
|
|||||||
Optional key-value pairs to be included in the request. The separator used
|
Optional key-value pairs to be included in the request. The separator used
|
||||||
determines the type:
|
determines the type:
|
||||||
|
|
||||||
\':\' HTTP headers:
|
\[aq]:\[aq] HTTP headers:
|
||||||
|
|
||||||
Referer:https://httpie.io Cookie:foo=bar User-Agent:bacon/1.0
|
Referer:https://httpie.io Cookie:foo=bar User-Agent:bacon/1.0
|
||||||
|
|
||||||
\'==\' URL parameters to be appended to the request URI:
|
\[aq]==\[aq] URL parameters to be appended to the request URI:
|
||||||
|
|
||||||
search==httpie
|
search==httpie
|
||||||
|
|
||||||
\'=\' Data fields to be serialized into a JSON object (with\fB\,--json\/\fR,\fB\,-j\/\fR)
|
\[aq]=\[aq] Data fields to be serialized into a JSON object (with \fB\,--json\/\fR, \fB\,-j\/\fR)
|
||||||
or form data (with\fB\,--form\/\fR,\fB\,-f\/\fR):
|
or form data (with \fB\,--form\/\fR, \fB\,-f\/\fR):
|
||||||
|
|
||||||
name=HTTPie language=Python description=\'CLI HTTP client\'
|
name=HTTPie language=Python description=\[aq]CLI HTTP client\[aq]
|
||||||
|
|
||||||
\':=\' Non-string JSON data fields (only with\fB\,--json\/\fR,\fB\,-j\/\fR):
|
\[aq]:=\[aq] Non-string JSON data fields (only with \fB\,--json\/\fR, \fB\,-j\/\fR):
|
||||||
|
|
||||||
awesome:=true amount:=42 colors:=\'["red", "green", "blue"]\'
|
awesome:=true amount:=42 colors:=\[aq][\[dq]red\[dq], \[dq]green\[dq], \[dq]blue\[dq]]\[aq]
|
||||||
|
|
||||||
\'@\' Form file fields (only with\fB\,--form\/\fR or\fB\,--multipart\/\fR):
|
\[aq]@\[aq] Form file fields (only with \fB\,--form\/\fR or \fB\,--multipart\/\fR):
|
||||||
|
|
||||||
cv@\~/Documents/CV.pdf
|
cv@\(ti/Documents/CV.pdf
|
||||||
cv@\'\~/Documents/CV.pdf;type=application/pdf\'
|
cv@\[aq]\(ti/Documents/CV.pdf;type=application/pdf\[aq]
|
||||||
|
|
||||||
\'=@\' A data field like \'=\', but takes a file path and embeds its content:
|
\[aq]=@\[aq] A data field like \[aq]=\[aq], but takes a file path and embeds its content:
|
||||||
|
|
||||||
essay=@Documents/essay.txt
|
essay=@Documents/essay.txt
|
||||||
|
|
||||||
\':=@\' A raw JSON field like \':=\', but takes a file path and embeds its content:
|
\[aq]:=@\[aq] A raw JSON field like \[aq]:=\[aq], but takes a file path and embeds its content:
|
||||||
|
|
||||||
package:=@./package.json
|
package:=@./package.json
|
||||||
|
|
||||||
You can use a backslash to escape a colliding separator in the field name:
|
You can use a backslash to escape a colliding separator in the field name:
|
||||||
|
|
||||||
field-name-with\\:colon=value
|
field-name-with\e:colon=value
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.PP
|
.PP
|
||||||
.SH Predefined Content Types
|
.SH Predefined content types
|
||||||
.IP "\fB\,--json\/\fR, \fB\,-j\/\fR"
|
.IP "\fB\,--json\/\fR, \fB\,-j\/\fR"
|
||||||
|
|
||||||
|
|
||||||
@ -104,13 +105,13 @@ multipart/form-data request.
|
|||||||
.IP "\fB\,--multipart\/\fR"
|
.IP "\fB\,--multipart\/\fR"
|
||||||
|
|
||||||
|
|
||||||
Similar to\fB\,--form\/\fR, but always sends a multipart/form-data request (i.e., even without files).
|
Similar to \fB\,--form\/\fR, but always sends a multipart/form-data request (i.e., even without files).
|
||||||
|
|
||||||
|
|
||||||
.IP "\fB\,--boundary\/\fR"
|
.IP "\fB\,--boundary\/\fR"
|
||||||
|
|
||||||
|
|
||||||
Specify a custom boundary string for multipart/form-data requests. Only has effect only together with\fB\,--form\/\fR.
|
Specify a custom boundary string for multipart/form-data requests. Only has effect only together with \fB\,--form\/\fR.
|
||||||
|
|
||||||
|
|
||||||
.IP "\fB\,--raw\/\fR"
|
.IP "\fB\,--raw\/\fR"
|
||||||
@ -119,7 +120,7 @@ Specify a custom boundary string for multipart/form-data requests. Only has effe
|
|||||||
This option allows you to pass raw request data without extra processing
|
This option allows you to pass raw request data without extra processing
|
||||||
(as opposed to the structured request items syntax):
|
(as opposed to the structured request items syntax):
|
||||||
|
|
||||||
$ http\fB\,--raw\/\fR=\'data\' pie.dev/post
|
$ http \fB\,--raw\/\fR=\[aq]data\[aq] pie.dev/post
|
||||||
|
|
||||||
You can achieve the same by piping the data via stdin:
|
You can achieve the same by piping the data via stdin:
|
||||||
|
|
||||||
@ -133,7 +134,7 @@ Or have HTTPie load the raw data from a file:
|
|||||||
|
|
||||||
|
|
||||||
.PP
|
.PP
|
||||||
.SH Content Processing Options
|
.SH Content processing options
|
||||||
.IP "\fB\,--compress\/\fR, \fB\,-x\/\fR"
|
.IP "\fB\,--compress\/\fR, \fB\,-x\/\fR"
|
||||||
|
|
||||||
|
|
||||||
@ -146,39 +147,39 @@ negative. Compression can be forced by repeating the argument.
|
|||||||
|
|
||||||
|
|
||||||
.PP
|
.PP
|
||||||
.SH Output Processing
|
.SH Output processing
|
||||||
.IP "\fB\,--pretty\/\fR"
|
.IP "\fB\,--pretty\/\fR"
|
||||||
|
|
||||||
|
|
||||||
Controls output processing. The value can be "none" to not prettify
|
Controls output processing. The value can be \[dq]none\[dq] to not prettify
|
||||||
the output (default for redirected output), "all" to apply both colors
|
the output (default for redirected output), \[dq]all\[dq] to apply both colors
|
||||||
and formatting (default for terminal output), "colors", or "format".
|
and formatting (default for terminal output), \[dq]colors\[dq], or \[dq]format\[dq].
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.IP "\fB\,--style\/\fR, \fB\,-s\/\fR \fI\,STYLE\/\fR"
|
.IP "\fB\,--style\/\fR, \fB\,-s\/\fR \fI\,STYLE\/\fR"
|
||||||
|
|
||||||
|
|
||||||
Output coloring style (default is "auto"). It can be one of:
|
Output coloring style (default is \[dq]auto\[dq]). It can be one of:
|
||||||
|
|
||||||
auto, pie, pie-dark, pie-light, solarized
|
auto, pie, pie-dark, pie-light, solarized
|
||||||
|
|
||||||
|
|
||||||
For finding out all available styles in your system, try:
|
For finding out all available styles in your system, try:
|
||||||
|
|
||||||
$ http\fB\,--style\/\fR
|
$ http \fB\,--style\/\fR
|
||||||
|
|
||||||
The "auto" style follows your terminal\'s ANSI color styles.
|
The \[dq]auto\[dq] style follows your terminal\[aq]s ANSI color styles.
|
||||||
For non-auto styles to work properly, please make sure that the
|
For non-auto styles to work properly, please make sure that the
|
||||||
$TERM environment variable is set to "xterm-256color" or similar
|
$TERM environment variable is set to \[dq]xterm-256color\[dq] or similar
|
||||||
(e.g., via `export TERM=xterm-256color\' in your \~/.bashrc).
|
(e.g., via `export TERM=xterm-256color\[aq] in your \(ti/.bashrc).
|
||||||
|
|
||||||
.IP "\fB\,--unsorted\/\fR"
|
.IP "\fB\,--unsorted\/\fR"
|
||||||
|
|
||||||
|
|
||||||
Disables all sorting while formatting output. It is a shortcut for:
|
Disables all sorting while formatting output. It is a shortcut for:
|
||||||
|
|
||||||
\fB\,--format-options\/\fR=headers.sort:false,json.sort_keys:false
|
\fB\,--format-options\/\fR=headers.sort:false,json.sort_keys:false
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -187,7 +188,7 @@ Disables all sorting while formatting output. It is a shortcut for:
|
|||||||
|
|
||||||
Re-enables all sorting options while formatting output. It is a shortcut for:
|
Re-enables all sorting options while formatting output. It is a shortcut for:
|
||||||
|
|
||||||
\fB\,--format-options\/\fR=headers.sort:true,json.sort_keys:true
|
\fB\,--format-options\/\fR=headers.sort:true,json.sort_keys:true
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -196,8 +197,8 @@ Re-enables all sorting options while formatting output. It is a shortcut for:
|
|||||||
|
|
||||||
Override the response encoding for terminal display purposes, e.g.:
|
Override the response encoding for terminal display purposes, e.g.:
|
||||||
|
|
||||||
\fB\,--response-charset\/\fR=utf8
|
\fB\,--response-charset\/\fR=utf8
|
||||||
\fB\,--response-charset\/\fR=big5
|
\fB\,--response-charset\/\fR=big5
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -206,8 +207,8 @@ Override the response encoding for terminal display purposes, e.g.:
|
|||||||
|
|
||||||
Override the response mime type for coloring and formatting for the terminal, e.g.:
|
Override the response mime type for coloring and formatting for the terminal, e.g.:
|
||||||
|
|
||||||
\fB\,--response-mime\/\fR=application/json
|
\fB\,--response-mime\/\fR=application/json
|
||||||
\fB\,--response-mime\/\fR=text/xml
|
\fB\,--response-mime\/\fR=text/xml
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -215,7 +216,7 @@ Override the response mime type for coloring and formatting for the terminal, e.
|
|||||||
|
|
||||||
|
|
||||||
Controls output formatting. Only relevant when formatting is enabled
|
Controls output formatting. Only relevant when formatting is enabled
|
||||||
through (explicit or implied)\fB\,--pretty\/\fR=all or\fB\,--pretty\/\fR=format.
|
through (explicit or implied) \fB\,--pretty\/\fR=all or \fB\,--pretty\/\fR=format.
|
||||||
The following are the default options:
|
The following are the default options:
|
||||||
|
|
||||||
headers.sort:true
|
headers.sort:true
|
||||||
@ -229,26 +230,26 @@ You may use this option multiple times, as well as specify multiple
|
|||||||
comma-separated options at the same time. For example, this modifies the
|
comma-separated options at the same time. For example, this modifies the
|
||||||
settings to disable the sorting of JSON keys, and sets the indent size to 2:
|
settings to disable the sorting of JSON keys, and sets the indent size to 2:
|
||||||
|
|
||||||
\fB\,--format-options\/\fR json.sort_keys:false,json.indent:2
|
\fB\,--format-options\/\fR json.sort_keys:false,json.indent:2
|
||||||
|
|
||||||
This is something you will typically put into your config file.
|
This is something you will typically put into your config file.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.PP
|
.PP
|
||||||
.SH Output Options
|
.SH Output options
|
||||||
.IP "\fB\,--print\/\fR, \fB\,-p\/\fR \fI\,WHAT\/\fR"
|
.IP "\fB\,--print\/\fR, \fB\,-p\/\fR \fI\,WHAT\/\fR"
|
||||||
|
|
||||||
|
|
||||||
String specifying what the output should contain:
|
String specifying what the output should contain:
|
||||||
|
|
||||||
\'H\' request headers
|
\[aq]H\[aq] request headers
|
||||||
\'B\' request body
|
\[aq]B\[aq] request body
|
||||||
\'h\' response headers
|
\[aq]h\[aq] response headers
|
||||||
\'b\' response body
|
\[aq]b\[aq] response body
|
||||||
\'m\' response metadata
|
\[aq]m\[aq] response metadata
|
||||||
|
|
||||||
The default behaviour is \'hb\' (i.e., the response
|
The default behaviour is \[aq]hb\[aq] (i.e., the response
|
||||||
headers and body is printed), if standard output is not redirected.
|
headers and body is printed), if standard output is not redirected.
|
||||||
If the output is piped to another program or to a file, then only the
|
If the output is piped to another program or to a file, then only the
|
||||||
response body is printed by default.
|
response body is printed by default.
|
||||||
@ -258,34 +259,34 @@ response body is printed by default.
|
|||||||
.IP "\fB\,--headers\/\fR, \fB\,-h\/\fR"
|
.IP "\fB\,--headers\/\fR, \fB\,-h\/\fR"
|
||||||
|
|
||||||
|
|
||||||
Print only the response headers. Shortcut for\fB\,--print\/\fR=h.
|
Print only the response headers. Shortcut for \fB\,--print\/\fR=h.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.IP "\fB\,--meta\/\fR, \fB\,-m\/\fR"
|
.IP "\fB\,--meta\/\fR, \fB\,-m\/\fR"
|
||||||
|
|
||||||
|
|
||||||
Print only the response metadata. Shortcut for\fB\,--print\/\fR=m.
|
Print only the response metadata. Shortcut for \fB\,--print\/\fR=m.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.IP "\fB\,--body\/\fR, \fB\,-b\/\fR"
|
.IP "\fB\,--body\/\fR, \fB\,-b\/\fR"
|
||||||
|
|
||||||
|
|
||||||
Print only the response body. Shortcut for\fB\,--print\/\fR=b.
|
Print only the response body. Shortcut for \fB\,--print\/\fR=b.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.IP "\fB\,--verbose\/\fR, \fB\,-v\/\fR"
|
.IP "\fB\,--verbose\/\fR, \fB\,-v\/\fR"
|
||||||
|
|
||||||
|
|
||||||
Verbose output. For the level one (with single \fB\,-v\/\fR`/\fB\,--verbose\/\fR`), print
|
Verbose output. For the level one (with single `\fB\,-v\/\fR`/`\fB\,--verbose\/\fR`), print
|
||||||
the whole request as well as the response. Also print any intermediary
|
the whole request as well as the response. Also print any intermediary
|
||||||
requests/responses (such as redirects). For the second level and higher,
|
requests/responses (such as redirects). For the second level and higher,
|
||||||
print these as well as the response metadata.
|
print these as well as the response metadata.
|
||||||
|
|
||||||
Level one is a shortcut for:\fB\,--all\/\fR\fB\,--print\/\fR=BHbh
|
Level one is a shortcut for: \fB\,--all\/\fR \fB\,--print\/\fR=BHbh
|
||||||
Level two is a shortcut for:\fB\,--all\/\fR\fB\,--print\/\fR=BHbhm
|
Level two is a shortcut for: \fB\,--all\/\fR \fB\,--print\/\fR=BHbhm
|
||||||
|
|
||||||
|
|
||||||
.IP "\fB\,--all\/\fR"
|
.IP "\fB\,--all\/\fR"
|
||||||
@ -293,23 +294,23 @@ Level two is a shortcut for:\fB\,--all\/\fR\fB\,--print\/\fR=BHbhm
|
|||||||
|
|
||||||
By default, only the final request/response is shown. Use this flag to show
|
By default, only the final request/response is shown. Use this flag to show
|
||||||
any intermediary requests/responses as well. Intermediary requests include
|
any intermediary requests/responses as well. Intermediary requests include
|
||||||
followed redirects (with\fB\,--follow\/\fR), the first unauthorized request when
|
followed redirects (with \fB\,--follow\/\fR), the first unauthorized request when
|
||||||
Digest auth is used \fB\,--auth\/\fR=digest), etc.
|
Digest auth is used (\fB\,--auth\/\fR=digest), etc.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.IP "\fB\,--stream\/\fR, \fB\,-S\/\fR"
|
.IP "\fB\,--stream\/\fR, \fB\,-S\/\fR"
|
||||||
|
|
||||||
|
|
||||||
Always stream the response body by line, i.e., behave like `tail\fB\,-f\/\fR\'.
|
Always stream the response body by line, i.e., behave like `tail \fB\,-f\/\fR\[aq].
|
||||||
|
|
||||||
Without\fB\,--stream\/\fR and with\fB\,--pretty\/\fR (either set or implied),
|
Without \fB\,--stream\/\fR and with \fB\,--pretty\/\fR (either set or implied),
|
||||||
HTTPie fetches the whole response before it outputs the processed data.
|
HTTPie fetches the whole response before it outputs the processed data.
|
||||||
|
|
||||||
Set this option when you want to continuously display a prettified
|
Set this option when you want to continuously display a prettified
|
||||||
long-lived response, such as one from the Twitter streaming API.
|
long-lived response, such as one from the Twitter streaming API.
|
||||||
|
|
||||||
It is useful also without\fB\,--pretty\/\fR: It ensures that the output is flushed
|
It is useful also without \fB\,--pretty\/\fR: It ensures that the output is flushed
|
||||||
more often and in smaller chunks.
|
more often and in smaller chunks.
|
||||||
|
|
||||||
|
|
||||||
@ -317,7 +318,7 @@ more often and in smaller chunks.
|
|||||||
.IP "\fB\,--output\/\fR, \fB\,-o\/\fR \fI\,FILE\/\fR"
|
.IP "\fB\,--output\/\fR, \fB\,-o\/\fR \fI\,FILE\/\fR"
|
||||||
|
|
||||||
|
|
||||||
Save output to FILE instead of stdout. If\fB\,--download\/\fR is also set, then only
|
Save output to FILE instead of stdout. If \fB\,--download\/\fR is also set, then only
|
||||||
the response body is saved to FILE. Other parts of the HTTP exchange are
|
the response body is saved to FILE. Other parts of the HTTP exchange are
|
||||||
printed to stderr.
|
printed to stderr.
|
||||||
|
|
||||||
@ -327,7 +328,7 @@ printed to stderr.
|
|||||||
|
|
||||||
|
|
||||||
Do not print the response body to stdout. Rather, download it and store it
|
Do not print the response body to stdout. Rather, download it and store it
|
||||||
in a file. The filename is guessed unless specified with\fB\,--output\/\fR
|
in a file. The filename is guessed unless specified with \fB\,--output\/\fR
|
||||||
[filename]. This action is similar to the default behaviour of wget.
|
[filename]. This action is similar to the default behaviour of wget.
|
||||||
|
|
||||||
|
|
||||||
@ -335,7 +336,7 @@ in a file. The filename is guessed unless specified with\fB\,--output\/\fR
|
|||||||
.IP "\fB\,--continue\/\fR, \fB\,-c\/\fR"
|
.IP "\fB\,--continue\/\fR, \fB\,-c\/\fR"
|
||||||
|
|
||||||
|
|
||||||
Resume an interrupted download. Note that the\fB\,--output\/\fR option needs to be
|
Resume an interrupted download. Note that the \fB\,--output\/\fR option needs to be
|
||||||
specified as well.
|
specified as well.
|
||||||
|
|
||||||
|
|
||||||
@ -345,8 +346,8 @@ specified as well.
|
|||||||
|
|
||||||
Do not print to stdout or stderr, except for errors and warnings when provided once.
|
Do not print to stdout or stderr, except for errors and warnings when provided once.
|
||||||
Provide twice to suppress warnings as well.
|
Provide twice to suppress warnings as well.
|
||||||
stdout is still redirected if\fB\,--output\/\fR is specified.
|
stdout is still redirected if \fB\,--output\/\fR is specified.
|
||||||
Flag doesn\'t affect behaviour of download beyond not printing to terminal.
|
Flag doesn\[aq]t affect behaviour of download beyond not printing to terminal.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -383,24 +384,24 @@ exchange.
|
|||||||
|
|
||||||
For username/password based authentication mechanisms (e.g
|
For username/password based authentication mechanisms (e.g
|
||||||
basic auth or digest auth) if only the username is provided
|
basic auth or digest auth) if only the username is provided
|
||||||
\fB\,-a\/\fR username), HTTPie will prompt for the password.
|
(\fB\,-a\/\fR username), HTTPie will prompt for the password.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.IP "\fB\,--auth-type\/\fR, \fB\,-A\/\fR"
|
.IP "\fB\,--auth-type\/\fR, \fB\,-A\/\fR"
|
||||||
|
|
||||||
|
|
||||||
The authentication mechanism to be used. Defaults to "basic".
|
The authentication mechanism to be used. Defaults to \[dq]basic\[dq].
|
||||||
|
|
||||||
"basic": Basic HTTP auth
|
\[dq]basic\[dq]: Basic HTTP auth
|
||||||
|
|
||||||
"digest": Digest HTTP auth
|
\[dq]digest\[dq]: Digest HTTP auth
|
||||||
|
|
||||||
"bearer": Bearer HTTP Auth
|
\[dq]bearer\[dq]: Bearer HTTP Auth
|
||||||
|
|
||||||
For finding out all available authentication types in your system, try:
|
For finding out all available authentication types in your system, try:
|
||||||
|
|
||||||
$ http\fB\,--auth-type\/\fR
|
$ http \fB\,--auth-type\/\fR
|
||||||
|
|
||||||
.IP "\fB\,--ignore-netrc\/\fR"
|
.IP "\fB\,--ignore-netrc\/\fR"
|
||||||
|
|
||||||
@ -413,7 +414,7 @@ Ignore credentials from .netrc.
|
|||||||
.IP "\fB\,--offline\/\fR"
|
.IP "\fB\,--offline\/\fR"
|
||||||
|
|
||||||
|
|
||||||
Build the request and print it but don\'t actually send it.
|
Build the request and print it but don\(gat actually send it.
|
||||||
|
|
||||||
|
|
||||||
.IP "\fB\,--proxy\/\fR \fI\,PROTOCOL:PROXY_URL\/\fR"
|
.IP "\fB\,--proxy\/\fR \fI\,PROTOCOL:PROXY_URL\/\fR"
|
||||||
@ -435,7 +436,7 @@ Follow 30x Location redirects.
|
|||||||
.IP "\fB\,--max-redirects\/\fR"
|
.IP "\fB\,--max-redirects\/\fR"
|
||||||
|
|
||||||
|
|
||||||
By default, requests have a limit of 30 redirects (works with\fB\,--follow\/\fR).
|
By default, requests have a limit of 30 redirects (works with \fB\,--follow\/\fR).
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -466,7 +467,7 @@ exit with an error if the status indicates one.
|
|||||||
|
|
||||||
When the server replies with a 4xx (Client Error) or 5xx (Server Error)
|
When the server replies with a 4xx (Client Error) or 5xx (Server Error)
|
||||||
status code, HTTPie exits with 4 or 5 respectively. If the response is a
|
status code, HTTPie exits with 4 or 5 respectively. If the response is a
|
||||||
3xx (Redirect) and\fB\,--follow\/\fR hasn\'t been set, then the exit status is 3.
|
3xx (Redirect) and \fB\,--follow\/\fR hasn\[aq]t been set, then the exit status is 3.
|
||||||
Also an error message is written to stderr if stdout is redirected.
|
Also an error message is written to stderr if stdout is redirected.
|
||||||
|
|
||||||
|
|
||||||
@ -488,8 +489,8 @@ Enable streaming via chunked transfer encoding. The Transfer-Encoding header is
|
|||||||
.IP "\fB\,--verify\/\fR"
|
.IP "\fB\,--verify\/\fR"
|
||||||
|
|
||||||
|
|
||||||
Set to "no" (or "false") to skip checking the host\'s SSL certificate.
|
Set to \[dq]no\[dq] (or \[dq]false\[dq]) to skip checking the host\[aq]s SSL certificate.
|
||||||
Defaults to "yes" ("true"). You can also pass the path to a CA_BUNDLE file
|
Defaults to \[dq]yes\[dq] (\[dq]true\[dq]). You can also pass the path to a CA_BUNDLE file
|
||||||
for private certs. (Or you can set the REQUESTS_CA_BUNDLE environment
|
for private certs. (Or you can set the REQUESTS_CA_BUNDLE environment
|
||||||
variable instead.)
|
variable instead.)
|
||||||
|
|
||||||
@ -521,14 +522,14 @@ ECDHE+AESGCM:ECDHE+CHACHA20:DHE+AESGCM:DHE+CHACHA20:ECDH+AESGCM:DH+AESGCM:ECDH+A
|
|||||||
|
|
||||||
You can specify a local cert to use as client side SSL certificate.
|
You can specify a local cert to use as client side SSL certificate.
|
||||||
This file may either contain both private key and certificate or you may
|
This file may either contain both private key and certificate or you may
|
||||||
specify\fB\,--cert-key\/\fR separately.
|
specify \fB\,--cert-key\/\fR separately.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.IP "\fB\,--cert-key\/\fR"
|
.IP "\fB\,--cert-key\/\fR"
|
||||||
|
|
||||||
|
|
||||||
The private key to use with SSL. Only needed if\fB\,--cert\/\fR is given and the
|
The private key to use with SSL. Only needed if \fB\,--cert\/\fR is given and the
|
||||||
certificate file does not contain the private key.
|
certificate file does not contain the private key.
|
||||||
|
|
||||||
|
|
||||||
@ -536,9 +537,9 @@ certificate file does not contain the private key.
|
|||||||
.IP "\fB\,--cert-key-pass\/\fR"
|
.IP "\fB\,--cert-key-pass\/\fR"
|
||||||
|
|
||||||
|
|
||||||
The passphrase to be used to with the given private key. Only needed if\fB\,--cert-key\/\fR
|
The passphrase to be used to with the given private key. Only needed if \fB\,--cert-key\/\fR
|
||||||
is given and the key file requires a passphrase.
|
is given and the key file requires a passphrase.
|
||||||
If not provided, you\'ll be prompted interactively.
|
If not provided, you\(gall be prompted interactively.
|
||||||
|
|
||||||
|
|
||||||
.PP
|
.PP
|
||||||
@ -587,4 +588,11 @@ information useful for debugging HTTPie itself and for reporting bugs.
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
.PP
|
.PP
|
||||||
|
.SH SEE ALSO
|
||||||
|
|
||||||
|
For every \fB\,--OPTION\/\fR there is also a \fB\,--no-OPTION\/\fR that reverts OPTION
|
||||||
|
to its default value.
|
||||||
|
|
||||||
|
Suggestions and bug reports are greatly appreciated:
|
||||||
|
https://github.com/httpie/httpie/issues
|
@ -6,6 +6,9 @@ from typing import Iterator, Tuple
|
|||||||
BUILD_DIR = Path(__file__).parent
|
BUILD_DIR = Path(__file__).parent
|
||||||
HTTPIE_DIR = BUILD_DIR.parent.parent.parent
|
HTTPIE_DIR = BUILD_DIR.parent.parent.parent
|
||||||
|
|
||||||
|
EXTRAS_DIR = HTTPIE_DIR / 'extras'
|
||||||
|
MAN_PAGES_DIR = EXTRAS_DIR / 'man'
|
||||||
|
|
||||||
SCRIPT_DIR = BUILD_DIR / Path('scripts')
|
SCRIPT_DIR = BUILD_DIR / Path('scripts')
|
||||||
HOOKS_DIR = SCRIPT_DIR / 'hooks'
|
HOOKS_DIR = SCRIPT_DIR / 'hooks'
|
||||||
|
|
||||||
@ -50,6 +53,11 @@ def build_packages(http_binary: Path, httpie_binary: Path) -> None:
|
|||||||
(http_binary, '/usr/bin/https'),
|
(http_binary, '/usr/bin/https'),
|
||||||
(httpie_binary, '/usr/bin/httpie'),
|
(httpie_binary, '/usr/bin/httpie'),
|
||||||
]
|
]
|
||||||
|
files.extend(
|
||||||
|
(man_page, f'/usr/share/man/man1/{man_page.name}')
|
||||||
|
for man_page in MAN_PAGES_DIR.glob('*.1')
|
||||||
|
)
|
||||||
|
|
||||||
# A list of additional dependencies
|
# A list of additional dependencies
|
||||||
deps = [
|
deps = [
|
||||||
'python3 >= 3.7',
|
'python3 >= 3.7',
|
||||||
|
@ -14,16 +14,19 @@ from httpie.utils import split
|
|||||||
|
|
||||||
# Escape certain characters so they are rendered properly on
|
# Escape certain characters so they are rendered properly on
|
||||||
# all terminals.
|
# all terminals.
|
||||||
|
# https://man7.org/linux/man-pages/man7/groff_char.7.html
|
||||||
ESCAPE_MAP = {
|
ESCAPE_MAP = {
|
||||||
"'": "\\'",
|
'"': '\[dq]',
|
||||||
'~': '\\~',
|
"'": '\[aq]',
|
||||||
'’': "\\'",
|
'~': '\(ti',
|
||||||
'\\': '\\\\',
|
'’': "\(ga",
|
||||||
|
'\\': '\e',
|
||||||
}
|
}
|
||||||
ESCAPE_MAP = {ord(key): value for key, value in ESCAPE_MAP.items()}
|
ESCAPE_MAP = {ord(key): value for key, value in ESCAPE_MAP.items()}
|
||||||
|
|
||||||
EXTRAS_DIR = Path(__file__).parent.parent
|
EXTRAS_DIR = Path(__file__).parent.parent
|
||||||
MAN_PAGE_PATH = EXTRAS_DIR / 'man'
|
MAN_PAGE_PATH = EXTRAS_DIR / 'man'
|
||||||
|
PROJECT_ROOT = EXTRAS_DIR.parent
|
||||||
|
|
||||||
OPTION_HIGHLIGHT_RE = re.compile(
|
OPTION_HIGHLIGHT_RE = re.compile(
|
||||||
OptionsHighlighter.highlights[0]
|
OptionsHighlighter.highlights[0]
|
||||||
@ -57,6 +60,18 @@ class ManPageBuilder:
|
|||||||
def separate(self) -> None:
|
def separate(self) -> None:
|
||||||
self.source.append('.PP')
|
self.source.append('.PP')
|
||||||
|
|
||||||
|
def format_desc(self, desc: str) -> str:
|
||||||
|
description = _escape_and_dedent(desc)
|
||||||
|
description = OPTION_HIGHLIGHT_RE.sub(
|
||||||
|
# Boldify the option part, but don't remove the prefix (start of the match).
|
||||||
|
lambda match: match[1] + self.boldify(match['option']),
|
||||||
|
description
|
||||||
|
)
|
||||||
|
return description
|
||||||
|
|
||||||
|
def add_comment(self, comment: str) -> None:
|
||||||
|
self.source.append(f'.\\" {comment}')
|
||||||
|
|
||||||
def add_options(self, options: Iterable[str], *, metavar: Optional[str] = None) -> None:
|
def add_options(self, options: Iterable[str], *, metavar: Optional[str] = None) -> None:
|
||||||
text = ", ".join(map(self.boldify, options))
|
text = ", ".join(map(self.boldify, options))
|
||||||
if metavar:
|
if metavar:
|
||||||
@ -92,8 +107,13 @@ def _escape_and_dedent(text: str) -> str:
|
|||||||
return '\n'.join(lines).translate(ESCAPE_MAP)
|
return '\n'.join(lines).translate(ESCAPE_MAP)
|
||||||
|
|
||||||
|
|
||||||
def to_man_page(program_name: str, spec: ParserSpec) -> str:
|
def to_man_page(program_name: str, spec: ParserSpec, *, is_top_level_cmd: bool = False) -> str:
|
||||||
builder = ManPageBuilder()
|
builder = ManPageBuilder()
|
||||||
|
builder.add_comment(
|
||||||
|
f"This file is auto-generated from the parser declaration "
|
||||||
|
+ (f"in {Path(spec.source_file).relative_to(PROJECT_ROOT)} " if spec.source_file else "")
|
||||||
|
+ f"by {Path(__file__).relative_to(PROJECT_ROOT)}."
|
||||||
|
)
|
||||||
|
|
||||||
builder.title_line(
|
builder.title_line(
|
||||||
full_name='HTTPie',
|
full_name='HTTPie',
|
||||||
@ -104,10 +124,19 @@ def to_man_page(program_name: str, spec: ParserSpec) -> str:
|
|||||||
builder.set_name(program_name)
|
builder.set_name(program_name)
|
||||||
|
|
||||||
with builder.section('SYNOPSIS'):
|
with builder.section('SYNOPSIS'):
|
||||||
builder.write(render_as_string(to_usage(spec, program_name=program_name)))
|
# `http` and `https` are commands that can be directly used, so they can have
|
||||||
|
# have a valid usage. But `httpie` is a top-level command with multiple sub commands,
|
||||||
|
# so for the synopsis we'll only reference the `httpie` name.
|
||||||
|
if is_top_level_cmd:
|
||||||
|
synopsis = program_name
|
||||||
|
else:
|
||||||
|
synopsis = render_as_string(to_usage(spec, program_name=program_name))
|
||||||
|
builder.write(synopsis)
|
||||||
|
|
||||||
with builder.section('DESCRIPTION'):
|
with builder.section('DESCRIPTION'):
|
||||||
builder.write(spec.description)
|
builder.write(spec.description)
|
||||||
|
if spec.man_page_hint:
|
||||||
|
builder.write(spec.man_page_hint)
|
||||||
|
|
||||||
for index, group in enumerate(spec.groups, 1):
|
for index, group in enumerate(spec.groups, 1):
|
||||||
with builder.section(group.name):
|
with builder.section(group.name):
|
||||||
@ -127,28 +156,26 @@ def to_man_page(program_name: str, spec: ParserSpec) -> str:
|
|||||||
metavar = None
|
metavar = None
|
||||||
builder.add_options(raw_arg['options'], metavar=metavar)
|
builder.add_options(raw_arg['options'], metavar=metavar)
|
||||||
|
|
||||||
description = _escape_and_dedent(raw_arg.get('description', ''))
|
desc = builder.format_desc(raw_arg.get('description', ''))
|
||||||
description = OPTION_HIGHLIGHT_RE.sub(
|
builder.write('\n' + desc + '\n')
|
||||||
lambda match: builder.boldify(match['option']),
|
|
||||||
description
|
|
||||||
)
|
|
||||||
builder.write('\n' + description + '\n')
|
|
||||||
|
|
||||||
builder.separate()
|
builder.separate()
|
||||||
|
|
||||||
|
if spec.epilog:
|
||||||
|
with builder.section('SEE ALSO'):
|
||||||
|
builder.write(builder.format_desc(spec.epilog))
|
||||||
|
|
||||||
|
|
||||||
return builder.build()
|
return builder.build()
|
||||||
|
|
||||||
|
|
||||||
def main() -> None:
|
def main() -> None:
|
||||||
for program_name, spec in [
|
for program_name, spec, config in [
|
||||||
('http', core_options),
|
('http', core_options, {}),
|
||||||
('https', core_options),
|
('https', core_options, {}),
|
||||||
('httpie', manager_options),
|
('httpie', manager_options, {'is_top_level_cmd': True}),
|
||||||
]:
|
]:
|
||||||
with open((MAN_PAGE_PATH / program_name).with_suffix('.1'), 'w') as stream:
|
with open((MAN_PAGE_PATH / program_name).with_suffix('.1'), 'w') as stream:
|
||||||
stream.write(to_man_page(program_name, spec))
|
stream.write(to_man_page(program_name, spec, **config))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@ HTTPie: modern, user-friendly command-line HTTP client for the API era.
|
|||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
__version__ = '3.1.1.dev0'
|
__version__ = '3.2.1'
|
||||||
__date__ = '2022-03-08'
|
__date__ = '2022-05-06'
|
||||||
__author__ = 'Jakub Roztocil'
|
__author__ = 'Jakub Roztocil'
|
||||||
__licence__ = 'BSD'
|
__licence__ = 'BSD'
|
||||||
|
@ -572,12 +572,6 @@ class HTTPieArgumentParser(BaseHTTPieArgumentParser):
|
|||||||
highlight=False
|
highlight=False
|
||||||
)
|
)
|
||||||
|
|
||||||
def print_help(self):
|
|
||||||
from httpie.output.ui import rich_help
|
|
||||||
|
|
||||||
for renderable in rich_help.to_help_message(self.spec):
|
|
||||||
self.env.rich_console.print(renderable)
|
|
||||||
|
|
||||||
def print_usage(self, file):
|
def print_usage(self, file):
|
||||||
from rich.text import Text
|
from rich.text import Text
|
||||||
from httpie.output.ui import rich_help
|
from httpie.output.ui import rich_help
|
||||||
|
@ -132,10 +132,3 @@ class RequestType(enum.Enum):
|
|||||||
FORM = enum.auto()
|
FORM = enum.auto()
|
||||||
MULTIPART = enum.auto()
|
MULTIPART = enum.auto()
|
||||||
JSON = enum.auto()
|
JSON = enum.auto()
|
||||||
|
|
||||||
|
|
||||||
EMPTY_STRING = ''
|
|
||||||
OPEN_BRACKET = '['
|
|
||||||
CLOSE_BRACKET = ']'
|
|
||||||
BACKSLASH = '\\'
|
|
||||||
HIGHLIGHTER = '^'
|
|
||||||
|
@ -26,16 +26,13 @@ options = ParserSpec(
|
|||||||
'http',
|
'http',
|
||||||
description=f'{__doc__.strip()} <https://httpie.io>',
|
description=f'{__doc__.strip()} <https://httpie.io>',
|
||||||
epilog="""
|
epilog="""
|
||||||
To learn more, you can try:
|
|
||||||
-> running 'http --manual'
|
|
||||||
-> visiting our full documentation at https://httpie.io/docs/cli
|
|
||||||
|
|
||||||
For every --OPTION there is also a --no-OPTION that reverts OPTION
|
For every --OPTION there is also a --no-OPTION that reverts OPTION
|
||||||
to its default value.
|
to its default value.
|
||||||
|
|
||||||
Suggestions and bug reports are greatly appreciated:
|
Suggestions and bug reports are greatly appreciated:
|
||||||
https://github.com/httpie/httpie/issues
|
https://github.com/httpie/httpie/issues
|
||||||
""",
|
""",
|
||||||
|
source_file=__file__
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -9,8 +9,14 @@ from typing import (
|
|||||||
Type,
|
Type,
|
||||||
Union,
|
Union,
|
||||||
)
|
)
|
||||||
from httpie.cli.dicts import NestedJSONArray
|
from .dicts import NestedJSONArray
|
||||||
from httpie.cli.constants import EMPTY_STRING, OPEN_BRACKET, CLOSE_BRACKET, BACKSLASH, HIGHLIGHTER
|
|
||||||
|
|
||||||
|
EMPTY_STRING = ''
|
||||||
|
HIGHLIGHTER = '^'
|
||||||
|
OPEN_BRACKET = '['
|
||||||
|
CLOSE_BRACKET = ']'
|
||||||
|
BACKSLASH = '\\'
|
||||||
|
|
||||||
|
|
||||||
class HTTPieSyntaxError(ValueError):
|
class HTTPieSyntaxError(ValueError):
|
||||||
@ -31,7 +37,7 @@ class HTTPieSyntaxError(ValueError):
|
|||||||
if self.token is not None:
|
if self.token is not None:
|
||||||
lines.append(self.source)
|
lines.append(self.source)
|
||||||
lines.append(
|
lines.append(
|
||||||
' ' * (self.token.start)
|
' ' * self.token.start
|
||||||
+ HIGHLIGHTER * (self.token.end - self.token.start)
|
+ HIGHLIGHTER * (self.token.end - self.token.start)
|
||||||
)
|
)
|
||||||
return '\n'.join(lines)
|
return '\n'.join(lines)
|
||||||
@ -51,9 +57,15 @@ class TokenKind(Enum):
|
|||||||
return 'a ' + self.name.lower()
|
return 'a ' + self.name.lower()
|
||||||
|
|
||||||
|
|
||||||
OPERATORS = {OPEN_BRACKET: TokenKind.LEFT_BRACKET, CLOSE_BRACKET: TokenKind.RIGHT_BRACKET}
|
OPERATORS = {
|
||||||
|
OPEN_BRACKET: TokenKind.LEFT_BRACKET,
|
||||||
|
CLOSE_BRACKET: TokenKind.RIGHT_BRACKET,
|
||||||
|
}
|
||||||
SPECIAL_CHARS = OPERATORS.keys() | {BACKSLASH}
|
SPECIAL_CHARS = OPERATORS.keys() | {BACKSLASH}
|
||||||
LITERAL_TOKENS = [TokenKind.TEXT, TokenKind.NUMBER]
|
LITERAL_TOKENS = [
|
||||||
|
TokenKind.TEXT,
|
||||||
|
TokenKind.NUMBER,
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
class Token(NamedTuple):
|
class Token(NamedTuple):
|
||||||
|
@ -35,17 +35,6 @@ def drop_keys(
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
def _get_first_line(source: str) -> str:
|
|
||||||
parts = []
|
|
||||||
for line in source.strip().splitlines():
|
|
||||||
line = line.strip()
|
|
||||||
parts.append(line)
|
|
||||||
if line.endswith("."):
|
|
||||||
break
|
|
||||||
|
|
||||||
return " ".join(parts)
|
|
||||||
|
|
||||||
|
|
||||||
PARSER_SPEC_VERSION = '0.0.1a0'
|
PARSER_SPEC_VERSION = '0.0.1a0'
|
||||||
|
|
||||||
|
|
||||||
@ -55,6 +44,8 @@ class ParserSpec:
|
|||||||
description: Optional[str] = None
|
description: Optional[str] = None
|
||||||
epilog: Optional[str] = None
|
epilog: Optional[str] = None
|
||||||
groups: List['Group'] = field(default_factory=list)
|
groups: List['Group'] = field(default_factory=list)
|
||||||
|
man_page_hint: Optional[str] = None
|
||||||
|
source_file: Optional[str] = None
|
||||||
|
|
||||||
def finalize(self) -> 'ParserSpec':
|
def finalize(self) -> 'ParserSpec':
|
||||||
if self.description:
|
if self.description:
|
||||||
@ -248,10 +239,11 @@ def to_data(abstract_options: ParserSpec) -> Dict[str, Any]:
|
|||||||
return {'version': PARSER_SPEC_VERSION, 'spec': abstract_options.serialize()}
|
return {'version': PARSER_SPEC_VERSION, 'spec': abstract_options.serialize()}
|
||||||
|
|
||||||
|
|
||||||
def parser_to_parser_spec(parser: argparse.ArgumentParser) -> ParserSpec:
|
def parser_to_parser_spec(parser: argparse.ArgumentParser, **kwargs) -> ParserSpec:
|
||||||
"""Take an existing argparse parser, and create a spec from it."""
|
"""Take an existing argparse parser, and create a spec from it."""
|
||||||
return ParserSpec(
|
return ParserSpec(
|
||||||
program=parser.prog,
|
program=parser.prog,
|
||||||
description=parser.description,
|
description=parser.description,
|
||||||
epilog=parser.epilog
|
epilog=parser.epilog,
|
||||||
|
**kwargs
|
||||||
)
|
)
|
||||||
|
@ -13,7 +13,8 @@ import urllib3
|
|||||||
from . import __version__
|
from . import __version__
|
||||||
from .adapters import HTTPieHTTPAdapter
|
from .adapters import HTTPieHTTPAdapter
|
||||||
from .context import Environment
|
from .context import Environment
|
||||||
from .cli.constants import EMPTY_STRING, HTTP_OPTIONS
|
from .cli.constants import HTTP_OPTIONS
|
||||||
|
from .cli.nested_json import EMPTY_STRING
|
||||||
from .cli.dicts import HTTPHeadersDict, NestedJSONArray
|
from .cli.dicts import HTTPHeadersDict, NestedJSONArray
|
||||||
from .encoding import UTF8
|
from .encoding import UTF8
|
||||||
from .models import RequestsMessage
|
from .models import RequestsMessage
|
||||||
|
@ -3,7 +3,7 @@ from contextlib import redirect_stderr, redirect_stdout
|
|||||||
from typing import List
|
from typing import List
|
||||||
|
|
||||||
from httpie.context import Environment
|
from httpie.context import Environment
|
||||||
from httpie.internal.update_warnings import _fetch_updates
|
from httpie.internal.update_warnings import _fetch_updates, _get_suppress_context
|
||||||
from httpie.status import ExitStatus
|
from httpie.status import ExitStatus
|
||||||
|
|
||||||
STATUS_FILE = '.httpie-test-daemon-status'
|
STATUS_FILE = '.httpie-test-daemon-status'
|
||||||
@ -44,6 +44,7 @@ def run_daemon_task(env: Environment, args: List[str]) -> ExitStatus:
|
|||||||
assert options.daemon
|
assert options.daemon
|
||||||
assert options.task_id in DAEMONIZED_TASKS
|
assert options.task_id in DAEMONIZED_TASKS
|
||||||
with redirect_stdout(env.devnull), redirect_stderr(env.devnull):
|
with redirect_stdout(env.devnull), redirect_stderr(env.devnull):
|
||||||
DAEMONIZED_TASKS[options.task_id](env)
|
with _get_suppress_context(env):
|
||||||
|
DAEMONIZED_TASKS[options.task_id](env)
|
||||||
|
|
||||||
return ExitStatus.SUCCESS
|
return ExitStatus.SUCCESS
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
"""
|
"""
|
||||||
This module provides an interface to spawn a detached task to be
|
This module provides an interface to spawn a detached task to be
|
||||||
runned with httpie.internal.daemon_runner on a separate process. It is
|
run with httpie.internal.daemon_runner on a separate process. It is
|
||||||
based on DVC's daemon system.
|
based on DVC's daemon system.
|
||||||
https://github.com/iterative/dvc/blob/main/dvc/daemon.py
|
https://github.com/iterative/dvc/blob/main/dvc/daemon.py
|
||||||
"""
|
"""
|
||||||
@ -11,7 +11,7 @@ import platform
|
|||||||
import sys
|
import sys
|
||||||
import httpie.__main__
|
import httpie.__main__
|
||||||
from contextlib import suppress
|
from contextlib import suppress
|
||||||
from subprocess import Popen
|
from subprocess import Popen, DEVNULL
|
||||||
from typing import Dict, List
|
from typing import Dict, List
|
||||||
from httpie.compat import is_frozen, is_windows
|
from httpie.compat import is_frozen, is_windows
|
||||||
|
|
||||||
@ -26,7 +26,7 @@ def _start_process(cmd: List[str], **kwargs) -> Popen:
|
|||||||
if not is_frozen:
|
if not is_frozen:
|
||||||
main_entrypoint = httpie.__main__.__file__
|
main_entrypoint = httpie.__main__.__file__
|
||||||
prefix += [main_entrypoint]
|
prefix += [main_entrypoint]
|
||||||
return Popen(prefix + cmd, close_fds=True, shell=False, **kwargs)
|
return Popen(prefix + cmd, close_fds=True, shell=False, stdout=DEVNULL, stderr=DEVNULL, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
def _spawn_windows(cmd: List[str], process_context: ProcessContext) -> None:
|
def _spawn_windows(cmd: List[str], process_context: ProcessContext) -> None:
|
||||||
|
@ -20,6 +20,7 @@ COMMANDS = {
|
|||||||
{
|
{
|
||||||
'flags': ['-f', '--format'],
|
'flags': ['-f', '--format'],
|
||||||
'choices': ['json'],
|
'choices': ['json'],
|
||||||
|
'help': 'Format to export in.',
|
||||||
'default': 'json'
|
'default': 'json'
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@ -169,5 +170,12 @@ parser.add_argument(
|
|||||||
'''
|
'''
|
||||||
)
|
)
|
||||||
|
|
||||||
options = parser_to_parser_spec(parser)
|
man_page_hint = '''
|
||||||
|
If you are looking for the man pages of http/https commands, try one of the following:
|
||||||
|
$ man http
|
||||||
|
$ man https
|
||||||
|
|
||||||
|
'''
|
||||||
|
|
||||||
|
options = parser_to_parser_spec(parser, man_page_hint=man_page_hint, source_file=__file__)
|
||||||
generate_subparsers(parser, parser, COMMANDS, options)
|
generate_subparsers(parser, parser, COMMANDS, options)
|
||||||
|
@ -7,6 +7,13 @@ from httpie.context import Environment
|
|||||||
MAN_COMMAND = 'man'
|
MAN_COMMAND = 'man'
|
||||||
NO_MAN_PAGES = os.getenv('HTTPIE_NO_MAN_PAGES', False)
|
NO_MAN_PAGES = os.getenv('HTTPIE_NO_MAN_PAGES', False)
|
||||||
|
|
||||||
|
# On some systems, HTTP(n) might exist but we are only
|
||||||
|
# interested in HTTP(1).
|
||||||
|
#
|
||||||
|
# For more information on man page sections: https://unix.stackexchange.com/a/138643
|
||||||
|
|
||||||
|
MAN_PAGE_SECTION = '1'
|
||||||
|
|
||||||
|
|
||||||
def is_available(program: str) -> bool:
|
def is_available(program: str) -> bool:
|
||||||
"""Check whether HTTPie's man pages are available in this system."""
|
"""Check whether HTTPie's man pages are available in this system."""
|
||||||
@ -14,18 +21,27 @@ def is_available(program: str) -> bool:
|
|||||||
if NO_MAN_PAGES or os.system == 'nt':
|
if NO_MAN_PAGES or os.system == 'nt':
|
||||||
return False
|
return False
|
||||||
|
|
||||||
process = subprocess.run(
|
try:
|
||||||
[MAN_COMMAND, program],
|
process = subprocess.run(
|
||||||
shell=False,
|
[MAN_COMMAND, MAN_PAGE_SECTION, program],
|
||||||
stdout=subprocess.DEVNULL,
|
shell=False,
|
||||||
stderr=subprocess.DEVNULL,
|
stdout=subprocess.DEVNULL,
|
||||||
)
|
stderr=subprocess.DEVNULL
|
||||||
return process.returncode == 0
|
)
|
||||||
|
except Exception:
|
||||||
|
# There might be some errors outside of the process, e.g
|
||||||
|
# a permission error to execute something that is not an
|
||||||
|
# executable.
|
||||||
|
return False
|
||||||
|
else:
|
||||||
|
return process.returncode == 0
|
||||||
|
|
||||||
|
|
||||||
def display_for(env: Environment, program: str) -> None:
|
def display_for(env: Environment, program: str) -> None:
|
||||||
"""Display the man page for the given command (http/https)."""
|
"""Display the man page for the given command (http/https)."""
|
||||||
|
|
||||||
subprocess.run(
|
subprocess.run(
|
||||||
[MAN_COMMAND, program], stdout=env.stdout, stderr=env.stderr
|
[MAN_COMMAND, MAN_PAGE_SECTION, program],
|
||||||
|
stdout=env.stdout,
|
||||||
|
stderr=env.stderr
|
||||||
)
|
)
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
|
from dataclasses import dataclass, field
|
||||||
from enum import Enum, auto
|
from enum import Enum, auto
|
||||||
from typing import Optional
|
from typing import Optional, List
|
||||||
|
|
||||||
|
|
||||||
PYGMENTS_BRIGHT_BLACK = 'ansibrightblack'
|
PYGMENTS_BRIGHT_BLACK = 'ansibrightblack'
|
||||||
@ -34,7 +35,21 @@ class ColorString(str):
|
|||||||
|
|
||||||
E.g: PieColor.BLUE | BOLD | ITALIC
|
E.g: PieColor.BLUE | BOLD | ITALIC
|
||||||
"""
|
"""
|
||||||
return ColorString(self + ' ' + other)
|
if isinstance(other, str):
|
||||||
|
# In case of PieColor.BLUE | SOMETHING
|
||||||
|
# we just create a new string.
|
||||||
|
return ColorString(self + ' ' + other)
|
||||||
|
elif isinstance(other, GenericColor):
|
||||||
|
# If we see a GenericColor, then we'll wrap it
|
||||||
|
# in with the desired property in a different class.
|
||||||
|
return _StyledGenericColor(other, styles=self.split())
|
||||||
|
elif isinstance(other, _StyledGenericColor):
|
||||||
|
# And if it is already wrapped, we'll just extend the
|
||||||
|
# list of properties.
|
||||||
|
other.styles.extend(self.split())
|
||||||
|
return other
|
||||||
|
else:
|
||||||
|
return NotImplemented
|
||||||
|
|
||||||
|
|
||||||
class PieColor(ColorString, Enum):
|
class PieColor(ColorString, Enum):
|
||||||
@ -86,6 +101,12 @@ class GenericColor(Enum):
|
|||||||
return exposed_color
|
return exposed_color
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class _StyledGenericColor:
|
||||||
|
color: 'GenericColor'
|
||||||
|
styles: List[str] = field(default_factory=list)
|
||||||
|
|
||||||
|
|
||||||
# noinspection PyDictCreation
|
# noinspection PyDictCreation
|
||||||
COLOR_PALETTE = {
|
COLOR_PALETTE = {
|
||||||
# Copy the brand palette
|
# Copy the brand palette
|
||||||
|
@ -26,6 +26,7 @@ STYLE_BOLD = 'bold'
|
|||||||
MAX_CHOICE_CHARS = 80
|
MAX_CHOICE_CHARS = 80
|
||||||
|
|
||||||
LEFT_PADDING_2 = (0, 0, 0, 2)
|
LEFT_PADDING_2 = (0, 0, 0, 2)
|
||||||
|
LEFT_PADDING_3 = (0, 0, 0, 3)
|
||||||
LEFT_PADDING_4 = (0, 0, 0, 4)
|
LEFT_PADDING_4 = (0, 0, 0, 4)
|
||||||
LEFT_PADDING_5 = (0, 0, 0, 4)
|
LEFT_PADDING_5 = (0, 0, 0, 4)
|
||||||
|
|
||||||
@ -33,6 +34,12 @@ LEFT_INDENT_2 = (1, 0, 0, 2)
|
|||||||
LEFT_INDENT_3 = (1, 0, 0, 3)
|
LEFT_INDENT_3 = (1, 0, 0, 3)
|
||||||
LEFT_INDENT_BOTTOM_3 = (0, 0, 1, 3)
|
LEFT_INDENT_BOTTOM_3 = (0, 0, 1, 3)
|
||||||
|
|
||||||
|
MORE_INFO_COMMANDS = """
|
||||||
|
To learn more, you can try:
|
||||||
|
-> running 'http --manual'
|
||||||
|
-> visiting our full documentation at https://httpie.io/docs/cli
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
class OptionsHighlighter(RegexHighlighter):
|
class OptionsHighlighter(RegexHighlighter):
|
||||||
highlights = [
|
highlights = [
|
||||||
@ -213,6 +220,10 @@ def to_help_message(
|
|||||||
Text('More Information', style=STYLE_SWITCH),
|
Text('More Information', style=STYLE_SWITCH),
|
||||||
LEFT_INDENT_2,
|
LEFT_INDENT_2,
|
||||||
)
|
)
|
||||||
|
yield Padding(
|
||||||
|
MORE_INFO_COMMANDS.rstrip('\n'),
|
||||||
|
LEFT_PADDING_3
|
||||||
|
)
|
||||||
yield Padding(
|
yield Padding(
|
||||||
spec.epilog.rstrip('\n'),
|
spec.epilog.rstrip('\n'),
|
||||||
LEFT_INDENT_BOTTOM_3,
|
LEFT_INDENT_BOTTOM_3,
|
||||||
|
@ -4,20 +4,22 @@ from typing import TYPE_CHECKING, Any, Optional
|
|||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from rich.theme import Theme
|
from rich.theme import Theme
|
||||||
|
|
||||||
from httpie.output.ui.palette import GenericColor, PieStyle, Styles # noqa
|
from httpie.output.ui.palette import GenericColor, PieStyle, Styles, ColorString, _StyledGenericColor # noqa
|
||||||
|
|
||||||
|
RICH_BOLD = ColorString('bold')
|
||||||
|
|
||||||
# Rich-specific color code declarations
|
# Rich-specific color code declarations
|
||||||
# <https://github.com/Textualize/rich/blob/fcd684dd3a482977cab620e71ccaebb94bf13ac9/rich/default_styles.py>
|
# <https://github.com/Textualize/rich/blob/fcd684dd3a482977cab620e71ccaebb94bf13ac9/rich/default_styles.py>
|
||||||
CUSTOM_STYLES = {
|
CUSTOM_STYLES = {
|
||||||
'progress.description': GenericColor.WHITE,
|
'progress.description': RICH_BOLD | GenericColor.WHITE,
|
||||||
'progress.data.speed': GenericColor.GREEN,
|
'progress.data.speed': RICH_BOLD | GenericColor.GREEN,
|
||||||
'progress.percentage': GenericColor.AQUA,
|
'progress.percentage': RICH_BOLD | GenericColor.AQUA,
|
||||||
'progress.download': GenericColor.AQUA,
|
'progress.download': RICH_BOLD | GenericColor.AQUA,
|
||||||
'progress.remaining': GenericColor.ORANGE,
|
'progress.remaining': RICH_BOLD | GenericColor.ORANGE,
|
||||||
'bar.complete': GenericColor.PURPLE,
|
'bar.complete': RICH_BOLD | GenericColor.PURPLE,
|
||||||
'bar.finished': GenericColor.GREEN,
|
'bar.finished': RICH_BOLD | GenericColor.GREEN,
|
||||||
'bar.pulse': GenericColor.PURPLE,
|
'bar.pulse': RICH_BOLD | GenericColor.PURPLE,
|
||||||
'option': GenericColor.PINK,
|
'option': RICH_BOLD | GenericColor.PINK,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -40,7 +42,7 @@ class _GenericColorCaster(dict):
|
|||||||
return super().get(self._translate(key))
|
return super().get(self._translate(key))
|
||||||
|
|
||||||
|
|
||||||
def _make_rich_color_theme(style_name: Optional[str]) -> 'Theme':
|
def _make_rich_color_theme(style_name: Optional[str] = None) -> 'Theme':
|
||||||
from rich.style import Style
|
from rich.style import Style
|
||||||
from rich.theme import Theme
|
from rich.theme import Theme
|
||||||
|
|
||||||
@ -55,8 +57,15 @@ def _make_rich_color_theme(style_name: Optional[str]) -> 'Theme':
|
|||||||
for color, color_set in ChainMap(
|
for color, color_set in ChainMap(
|
||||||
GenericColor.__members__, CUSTOM_STYLES
|
GenericColor.__members__, CUSTOM_STYLES
|
||||||
).items():
|
).items():
|
||||||
|
if isinstance(color_set, _StyledGenericColor):
|
||||||
|
properties = dict.fromkeys(color_set.styles, True)
|
||||||
|
color_set = color_set.color
|
||||||
|
else:
|
||||||
|
properties = {}
|
||||||
|
|
||||||
theme.styles[color.lower()] = Style(
|
theme.styles[color.lower()] = Style(
|
||||||
color=color_set.apply_style(style, style_name=style_name)
|
color=color_set.apply_style(style, style_name=style_name),
|
||||||
|
**properties,
|
||||||
)
|
)
|
||||||
|
|
||||||
# E.g translate GenericColor.BLUE into blue on key access
|
# E.g translate GenericColor.BLUE into blue on key access
|
||||||
|
@ -6,13 +6,15 @@ from contextlib import contextmanager
|
|||||||
from rich.console import Console, RenderableType
|
from rich.console import Console, RenderableType
|
||||||
from rich.highlighter import Highlighter
|
from rich.highlighter import Highlighter
|
||||||
|
|
||||||
|
from httpie.output.ui.rich_palette import _make_rich_color_theme
|
||||||
|
|
||||||
|
|
||||||
def render_as_string(renderable: RenderableType) -> str:
|
def render_as_string(renderable: RenderableType) -> str:
|
||||||
"""Render any `rich` object in a fake console and
|
"""Render any `rich` object in a fake console and
|
||||||
return a *style-less* version of it as a string."""
|
return a *style-less* version of it as a string."""
|
||||||
|
|
||||||
with open(os.devnull, 'w') as null_stream:
|
with open(os.devnull, 'w') as null_stream:
|
||||||
fake_console = Console(file=null_stream, record=True)
|
fake_console = Console(file=null_stream, record=True, theme=_make_rich_color_theme())
|
||||||
fake_console.print(renderable)
|
fake_console.print(renderable)
|
||||||
return fake_console.export_text()
|
return fake_console.export_text()
|
||||||
|
|
||||||
|
@ -17,6 +17,7 @@ from .processing import Conversion, Formatting
|
|||||||
from .streams import (
|
from .streams import (
|
||||||
BaseStream, BufferedPrettyStream, EncodedStream, PrettyStream, RawStream,
|
BaseStream, BufferedPrettyStream, EncodedStream, PrettyStream, RawStream,
|
||||||
)
|
)
|
||||||
|
from ..utils import parse_content_type_header
|
||||||
|
|
||||||
|
|
||||||
MESSAGE_SEPARATOR = '\n\n'
|
MESSAGE_SEPARATOR = '\n\n'
|
||||||
@ -163,7 +164,10 @@ def get_stream_type_and_kwargs(
|
|||||||
if not is_stream and message_type is HTTPResponse:
|
if not is_stream and message_type is HTTPResponse:
|
||||||
# If this is a response, then check the headers for determining
|
# If this is a response, then check the headers for determining
|
||||||
# auto-streaming.
|
# auto-streaming.
|
||||||
is_stream = headers.get('Content-Type') == 'text/event-stream'
|
raw_content_type_header = headers.get('Content-Type', None)
|
||||||
|
if raw_content_type_header:
|
||||||
|
content_type_header, _ = parse_content_type_header(raw_content_type_header)
|
||||||
|
is_stream = (content_type_header == 'text/event-stream')
|
||||||
|
|
||||||
if not env.stdout_isatty and not prettify_groups:
|
if not env.stdout_isatty and not prettify_groups:
|
||||||
stream_class = RawStream
|
stream_class = RawStream
|
||||||
|
@ -277,7 +277,7 @@ def open_with_lockfile(file: Path, *args, **kwargs) -> Generator[IO[Any], None,
|
|||||||
target_file = Path(tempfile.gettempdir()) / file_id
|
target_file = Path(tempfile.gettempdir()) / file_id
|
||||||
|
|
||||||
# Have an atomic-like touch here, so we'll tighten the possibility of
|
# Have an atomic-like touch here, so we'll tighten the possibility of
|
||||||
# a race occuring between multiple processes accessing the same file.
|
# a race occurring between multiple processes accessing the same file.
|
||||||
try:
|
try:
|
||||||
target_file.touch(exist_ok=False)
|
target_file.touch(exist_ok=False)
|
||||||
except FileExistsError as exc:
|
except FileExistsError as exc:
|
||||||
|
1
setup.py
1
setup.py
@ -117,5 +117,6 @@ setup(
|
|||||||
data_files=[
|
data_files=[
|
||||||
('share/man/man1', ['extras/man/http.1']),
|
('share/man/man1', ['extras/man/http.1']),
|
||||||
('share/man/man1', ['extras/man/https.1']),
|
('share/man/man1', ['extras/man/https.1']),
|
||||||
|
('share/man/man1', ['extras/man/httpie.1']),
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
|
@ -1,9 +1,12 @@
|
|||||||
"""Miscellaneous regression tests"""
|
"""Miscellaneous regression tests"""
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
|
from httpie.cli.argtypes import KeyValueArgType
|
||||||
|
from httpie.cli.constants import SEPARATOR_HEADER, SEPARATOR_QUERY_PARAM, SEPARATOR_DATA_STRING
|
||||||
|
from httpie.cli.requestitems import RequestItems
|
||||||
from httpie.compat import is_windows
|
from httpie.compat import is_windows
|
||||||
from .utils.matching import assert_output_matches, Expect
|
|
||||||
from .utils import HTTP_OK, MockEnvironment, http
|
from .utils import HTTP_OK, MockEnvironment, http
|
||||||
|
from .utils.matching import assert_output_matches, Expect
|
||||||
|
|
||||||
|
|
||||||
def test_Host_header_overwrite(httpbin):
|
def test_Host_header_overwrite(httpbin):
|
||||||
@ -47,3 +50,21 @@ def test_verbose_redirected_stdout_separator(httpbin):
|
|||||||
Expect.RESPONSE_HEADERS,
|
Expect.RESPONSE_HEADERS,
|
||||||
Expect.BODY,
|
Expect.BODY,
|
||||||
])
|
])
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize(['separator', 'target'], [
|
||||||
|
(SEPARATOR_HEADER, 'headers'),
|
||||||
|
(SEPARATOR_QUERY_PARAM, 'params'),
|
||||||
|
(SEPARATOR_DATA_STRING, 'data'),
|
||||||
|
])
|
||||||
|
def test_initial_backslash_number(separator, target):
|
||||||
|
"""
|
||||||
|
<https://github.com/httpie/httpie/issues/1408>
|
||||||
|
"""
|
||||||
|
back_digit = r'\0'
|
||||||
|
raw_arg = back_digit + separator + back_digit
|
||||||
|
expected_parsed_data = {back_digit: back_digit}
|
||||||
|
parsed_arg = KeyValueArgType(separator)(raw_arg)
|
||||||
|
items = RequestItems.from_args([parsed_arg])
|
||||||
|
parsed_data = getattr(items, target)
|
||||||
|
assert parsed_data == expected_parsed_data
|
||||||
|
@ -124,6 +124,10 @@ def test_redirected_stream(httpbin):
|
|||||||
['Accept:text/event-stream'],
|
['Accept:text/event-stream'],
|
||||||
3
|
3
|
||||||
),
|
),
|
||||||
|
(
|
||||||
|
['Accept:text/event-stream; charset=utf-8'],
|
||||||
|
3
|
||||||
|
),
|
||||||
(
|
(
|
||||||
['Accept:text/plain'],
|
['Accept:text/plain'],
|
||||||
1
|
1
|
||||||
|
Reference in New Issue
Block a user