289 Commits

Author SHA1 Message Date
zuisong
2a9a23e2e4
apply suggestion 2025-04-14 10:57:27 +08:00
zuisong
31c515e403
use sanitize-filename crate to make filenames safe
Sanitizes filenames by removing or replacing potentially problematic characters
Makes filenames safe for cross-platform use
Prevents directory traversal attacks (e.g., "../../../")
2025-04-10 14:47:07 +08:00
zuisong
a60a52453a
download file parse filename add RFC 5987 support
support percent-encoded filename

Signed-off-by: zuisong <com.me@foxmail.com>
2025-04-10 13:22:11 +08:00
Jan Verbeek
300203338f Improve rustls error messages for invalid certificates
After a recent release rustls provides better error messages for
invalid certificates. For example:

```
invalid peer certificate: certificate not valid for name "wrong.host.badssl.com"; certificate is only valid for DnsName("*.badssl.com") or DnsName("badssl.com")
```

The message for expired certificates still isn't too readable but the
error now contains timestamps so we enhance it ourselves:

```
xh: error: error sending request for url (https://expired.badssl.com/)

Caused by:
    0: client error (Connect)
    1: invalid peer certificate: certificate expired: verification time 1742381579 (UNIX), but certificate is not valid after 1428883199 (313498380 seconds ago)

Certificate not valid after 2015-04-12 23:59:59.0 +00:00:00 (9years 11months 6days 8h 43m 24s ago).
```
2025-03-19 12:29:17 +01:00
Jan Verbeek
7ad28aa483 Re-enable badssl.com tests
Hopefully the random timeouts have stopped by now?
2025-03-19 12:29:17 +01:00
Jan Verbeek
b4e3fb2012 Delay initialization of zstd decoder
Fixes a panic for `xh head https://httpbin.dev/zstd`.

`ZstdDecoder::new()` returns a `Result`. We used to panic on this, but
it needs to be a `Read` error instead, so we can suppress the error
for an empty input the way we do for other decoders.

Our existing approach couldn't handle this, so I ended up refactoring
the system. I think it's cleaner now, though still weird.

We now also preserve the original decoder error instead of
`.to_string()`ing it, or strip it completely if there was an I/O
error. That should improve the error reporting.
2025-03-05 20:52:18 +01:00
Jan Verbeek
eeff9c17d4 Set RUST_BACKTRACE=0 in feature tests
If RUST_BACKTRACE=1 was set outside the test runner,
e.g. `RUST_BACKTRACE=1 cargo test`, this propagated to the test binary
and changed error outputs.

Interestingly this only affected `nested_json_type_error`.

Resolves #406.
2025-02-26 11:08:50 +01:00
zuisong
e9a386f460
apply suggestion 2025-02-06 09:41:20 +08:00
zuisong
d9026f1850
can not combine compress with multipart 2025-02-04 22:47:39 +08:00
zuisong
abc8c03b10
move compress request body test cases to own file 2025-02-04 22:09:49 +08:00
zuisong
1ec0267a18
apply suggestion 2025-01-23 09:19:13 +08:00
zuisong
2a1fba66f7
add more test 2025-01-22 22:23:50 +08:00
zuisong
70ad491c81
compress request body online test 2025-01-22 22:04:04 +08:00
zuisong
9b26a31415
support compress stream data 2025-01-22 21:42:04 +08:00
zuisong
f85194ac1e
support compress request body 2025-01-22 18:21:17 +08:00
Stefan Zwanenburg
9ae2e3bfd4 Save cookie default-path if no explicit path attribute is present in Set-Cookie
Note that this commit does not alter the storage format of sessions.
Perhaps requiring a cookie path at all times would be a good idea, but
I haven't done that here, because I don't want to break existing
sessions for users.

Fixes: #400
2025-01-19 13:25:08 +01:00
Jan Verbeek
6b70b77c0a Warn on combination of --continue and Range: header 2024-12-30 14:45:22 +01:00
Jan Verbeek
6c2981c4c5 Move --download test cases to own file 2024-12-19 06:36:49 +01:00
Jan Verbeek
2b98447fac Enable logging in rustls and tracing-using dependencies
Enable `rustls`'s `logging` feature to start emitting logs.

Enable the `tracing` crate's `log` feature to hook up the dependencies
that log via that crate.

`hyper` can use `tracing` but it's currently unstable and locked
behind `RUSTFLAGS='--cfg hyper_unstable_tracing'` so we shouldn't use
it yet.

This partially addresses #389.

```console
$ RUST_LOG=trace/ALPN xh https://example.org
[0.495665s DEBUG rustls::client::hs] ALPN protocol is Some(b"h2")
[0.499526s TRACE hyper_util::client::legacy::client] ALPN negotiated h2, updating pool
HTTP/2.0 200 OK
[...]
$ RUST_LOG=rustls xh https://example.org
[0.288085s DEBUG rustls::client::hs] No cached session for DnsName("example.org")
[0.288657s DEBUG rustls::client::hs] Not resuming any session
[0.288767s TRACE rustls::client::hs] Sending ClientHello Message {
    version: TLSv1_0,
    payload: Handshake {
[...]
[0.698465s DEBUG rustls::client::hs] Using ciphersuite TLS13_AES_256_GCM_SHA384
[0.698508s DEBUG rustls::client::tls13] Not resuming
[0.698530s TRACE rustls::client::client_conn] EarlyData rejected
[0.699267s DEBUG rustls::client::tls13] TLS1.3 encrypted extensions: [Protocols([ProtocolName(6832)])]
[0.699342s DEBUG rustls::client::hs] ALPN protocol is Some(b"h2")
[0.699578s TRACE rustls::client::tls13] Server cert is
CertificateChain([CertificateDer(0x3082076e3082[...]
```

`native-tls` barely has any logging so we don't get much useful info
from there yet.
2024-11-30 17:51:01 +01:00
Jan Verbeek
65ca2f0848 Merge remote-tracking branch 'origin/master' into smart-header-decode 2024-09-30 21:46:49 +02:00
Mohamed Daahir
89e5428618 Merge branch 'hotfix/v0.22.0-re-fix-download-path-escape' 2024-07-08 23:30:41 +01:00
Jan Verbeek
841f9c2e21 Prevent directory traversal in server-supplied filenames
If the `Content-Disposition` header includes directory
separators (e.g. `/`) then we now only take the base
filename. Including the directories is a vulnerability.

Originally fixed in 028cbb0165af54123a4829162a6a00f46e8dce74 but then
broken again in 330d3f2ed4e1af82ef89fefce2e6e84a8ac66330. This time I
added a regression test.
2024-07-08 07:46:55 +02:00
Jan Verbeek
00bc6f2238 Decode headers as latin1/UTF-8, show real reason phrase
External changes:

- We now print the actual reason phrase sent by the server instead
  of guessing it from the status code. That is, if servers reply with
  "200 Wonderful" instead of "200 OK" then we show that. This is
  especially useful for status codes that xh doesn't recognize.

- Header values are now decoded as latin1, with the UTF-8 decoding
  also shown if applicable.

- A new FAQ file with an entry that explains header value encoding.
  Header output now hyperlinks to this entry when relevant and if
  supported by the terminal.

Under the hood we now color headers manually. It's still hooked up to
the `.tmTheme` files but not to the `.sublime-syntax` file. This lets
us highlight the latin1 header values differently. In the future we
could use the same approach to optimize JSON highlighting.

I'm unsure about the position of the hyperlink. Currently it's the
text "UTF-8" in `<latin1 value> (UTF-8: <utf-8 value>)`. But that
means it's only shown if the value can be decoded as UTF-8. An
alternative is to turn the latin1 value itself into a hyperlink, but
that's confusing if the value itself is already a URL (which is a
common case for the `Location` header).

I also don't feel that our text is quite distinct enough from the
header value in the default `ansi` theme. Though the hyperlink does
help to set it apart.
2024-07-04 21:34:52 +02:00
Jan Verbeek
f847104b36 Warn for invalid redirect 2024-06-22 18:38:07 +02:00
Jan Verbeek
33e40527b7 Merge remote-tracking branch 'origin/master' into logging 2024-06-22 18:07:58 +02:00
zuisong
6c80a49353
apply suggestion 2024-06-22 09:40:30 +08:00
zuisong
3f24597737
decode CONTENT_DISPOSITION header value with utf-8
download file support unicode file name
2024-06-22 00:14:27 +08:00
zuisong
cb44ff5e8a
add test case 2024-06-21 23:32:54 +08:00
Jan Verbeek
10c309f88f Add test for ignored ;filename= tag 2024-06-20 23:14:18 +02:00
Jan Verbeek
1f3aeb05bd Print HTTP status warnings in case of single --quiet
Resolves #179.
2024-06-20 22:54:59 +02:00
Jan Verbeek
d380228f87 Move logging-related tests to own file 2024-06-20 22:54:52 +02:00
Jan Verbeek
41ab47f32f Add --debug option for logging and backtraces
Add `env_logger` to be able to print the logs that our libraries
already generate.

Add some logging to the application code. We'll probably want more log
messages, and we might want to upgrade some of them from trace to
debug.

Add a `--debug` flag that automatically enables `env_logger` as well
as backtraces for `anyhow` and panics.

```console
$ xh --debug :
[2024-06-05T13:54:40Z DEBUG xh] xh 0.22.0 -native-tls +rustls
[2024-06-05T13:54:40Z DEBUG xh] Cli {
        httpie_compat_mode: false,
        [...]
    }
[2024-06-05T13:54:40Z DEBUG xh] Complete URL: http://localhost/
[2024-06-05T13:54:40Z DEBUG xh] HTTP method: GET
[2024-06-05T13:54:40Z DEBUG reqwest::connect] starting new connection: http://localhost/
[2024-06-05T13:54:40Z DEBUG hyper_util::client::legacy::connect::dns] resolving host="localhost"
[...]
xh: error: error sending request for url (http://localhost/)

Caused by:
    0: client error (Connect)
    1: tcp connect error: Connection refused (os error 111)
    2: Connection refused (os error 111)

Stack backtrace:
   0: anyhow::error::<impl core::convert::From<E> for anyhow::Error>::from
             at ~/.cargo/registry/src/index.crates.io-6f17d22bba15001f/anyhow-1.0.82/src/error.rs:565:25
[...]
```

We could ask users to post `--debug` output when reporting bugs.
2024-06-05 17:47:36 +02:00
zuisong
c94fea2013
decode responses in zstd format 2024-05-06 10:38:39 +08:00
Mohamed Daahir
adf4a2ea70 disable endpoints that randomly timeout 2024-04-28 23:33:58 +01:00
zuisong
0957fa36e8
use serde_json format full json 2024-04-11 20:50:24 +08:00
zuisong
3f658ed4ed
hyper v1 upgrade 2024-04-06 00:40:21 +08:00
zuisong
4a0ad40d4a
update http2-prior-knowledge test case
modify test cases so that it can be run offline
2024-03-25 14:25:13 +08:00
Mohamed Daahir
dc60a57fc3
Merge pull request #356 from zuisong/http2_prior_knowledge
support http2-prior-knowledge
2024-03-23 14:55:50 +00:00
Mohamed Daahir
13bb6c2082 Fix clippy warnings on Rust 1.77 2024-03-23 14:45:00 +00:00
zuisong
c60ced6708
support http2-prior-knowledge 2024-03-22 12:49:19 +08:00
zuisong
95da9bdf6f
display remote address in metadata 2024-01-17 20:45:21 +08:00
Mohamed Daahir
752af63284
Merge pull request #345 from jayvdb/fix-spelling
Fix typos
2024-01-16 07:47:39 +00:00
John Vandenberg
789178828e Fix typos 2024-01-15 18:54:58 +08:00
Mohamed Daahir
f6d2e56011 check host header when overriding dns resolution 2023-11-11 17:56:43 +00:00
Mohamed Daahir
9d9b44310f add test for --resolve flag 2023-10-08 17:06:16 +01:00
Mohamed Daahir
bc0062302a add e2e test for format options merging behaviour 2023-10-08 16:06:35 +01:00
Mohamed Daahir
f94af3abea Merge branch 'master' into format-options-part-2 2023-09-10 21:59:41 +01:00
Mohamed Daahir
24969862ea test session cookies from multiple domain 2023-08-05 10:11:46 +01:00
Mohamed Daahir
f6c6267f23 testing migration of old cookie format 2023-08-05 10:11:46 +01:00
Mohamed Daahir
89a4659e37 fix failing tests 2023-08-05 10:11:46 +01:00