# Unreleased * Retry socket reads interrupted by a signal (EINTR) when a timeout applies (technically breaking) #1205 * Fix native-tls-no-default enabling dependencies without enabling the TLS connector * Add timeout_per_read and timeout_per_write independently of total phase budgets # 3.4.2 * Bump ureq-proto to 0.6.3 (fixes network-path references in redirects) * Bypass pooling for request connection settings incompatible with the Agent #1201 * Try the next resolved address on unreachable/unavailable connect errors #1195 # 3.4.1 * Bump ureq-proto to 0.6.2 (fixes to parsing and headers) #1199 * Do not pool connections with unconsumed buffered input #1198 * Fix timeout budgets restarting and applying to later phases #1194 * Complete TLS handshake during connect so timeout_connect covers it #1193 * Speed up read_json for responses with a known, small body size #1191 # 3.4.0 * Seal RequestExt (technically breaking) #1189 * Send canonical Basic authentication scheme to CONNECT proxies #1185 * Establish target TLS through HTTPS CONNECT proxies #1183 * Update rustls-platform-verifier to 0.7.0 #1174 * Fix pooled connections never aging out according to max_idle_age #1172 * Strip brackets from IPv6-literal hosts before TLS SNI/ServerName #1171 * RequestExt::middleware_config for conf inside middleware #1169 # 3.3.0 * Bump MSRV 1.71 -> 1.85, edition 2024 #1167 # 3.2.1 * Switch archived utf-8 crate for utf8-zero #1163 # 3.2.0 * Strip Content-Encoding/Content-Length headers after decompression #1156 * Timeout per resolved ip for try_connect #1152 * Fix body header bug on redirect #1140 * ureq-proto 0.5.3 to fix unsolicited 100-continue #1139 * Make socks5:// locally resolve before calling proxy #1138 * Add socks5h:// which DOESN'T locally resolve before calling proxy #1138 # 3.1.4 * Set content-type with new Multipart form #1133 # 3.1.3 * Fix short read with multi-byte charset #1131 * Replace rustls-pemfile usage with rustls-pki-types #1122 * Support for env NO_PROXY and proxy config #1118 * Experimental multi-part form support #1102 # 3.1.2 * Fix bug when query is after host "example.com?query" #1115 # 3.1.1 * Fix regression in MSRV (hold back native-tls) #1113 * Fix edge case regression when setting request header Content-Length: 0 #1109 # 3.1.0 DECISION: webpki-roots and webpki-root-certs goes from pre-release (0.26) to stable release (1.0.0). This is potentially a big change for ureq users. We release this as semver minor. * Bump all deps to latest #1104 * Fixes to CONNECT to follow spec #1103 * Send Content-Length for File #1100 * native-tls transport capture and surface underlying errors #1093 * Bump webpki-roots/webpki-root-certs to 1.0.0 #1089 * Bump rustls-platform-verifier to 0.6.0 #1089 * Allow the license CDLA-Permissive-2.0 #1089 # 3.0.12 * Chunked transfer handle abrupt close after 0\r\n #1074 * Fix incorrect DNS resolving when using proxies #1081 * Use + instead of %20 for url encoded form bodies #1071 * Fix problem with double-quotes in cookie values #1068 * Reduce Body size #1065 * Fix featue flag `public_suffix` for CookieStore #1063 * Improve doc for 10MB limit #1061 # 3.0.11 * Fix CONNECT proxy bug #1057 * Fix bug setting cookies in redirects #1055 * Annotated example for making a Transport #1054 * Feature for adding unencoded query parameters #1039 * Fix bug in not encoding ' in query parameters #1039 * Fix bug making timeout settings not working #1051 * Big refactor of ureq-proto #1042 * Extension trait for http::Request allowing agent config #1011 # 3.0.10 * Bump rustls-platform-verifier to 0.5.0 # 3.0.9 * Bump deps #1031 * Allow body for all methods when using http-crate API #1035 * Improved errors and doc for bespoke transports #1032 # 3.0.8 * Fix incorrect parsing bug "missing http version" #1026 # 3.0.7 * Allow non-standard HTTP methods #1018 * Fix not appending port to host header #1017 # 3.0.6 * Avoid percent encoding some query parameter chars #1004 * Fix incorrect LargeResponseHeader #1003 * Stop passing internal state in Config #996 * Support request level TlsConfig #996 # 3.0.5 * Fix incorrect reading of valid utf8 #992 * Fix panic when parsing malformed proxy URI #990 * ureq::Error wrapped as io::Error should pass through body chain #984 * send_json should set content-length header #983 # 3.0.4 * Manually unroll some macros to regular code #978 * Fix bug in `rustls-no-provider` when disabling ring #973 # 3.0.3 * Use the same data in CONNECT and Host header for proxied requests #967 * Set default scheme in proxy uri #966 * Redact URI and Location header on debug level #964 * Downgrade all logging to debug and below #964 # 3.0.2 * Remove dependency on once_cell #959 * Fix bug parsing partial redirects #958 * Expose typestate variables #956 # 3.0.1 * Fix excessive stack sizes #950 * Do not enable **json** (by default breaking, but it was a mistake) #948 # 3.0.0 * Replace RequestBuilder Deref with explicit wrappers #944 * Remove dependency on `url` crate #943 * Feature `Config::save_redirect_history` #939 # 3.0.0-rc5 * `TlsConfig::unversioned_rustls_crypto_provider()` #931 * Feature `rustls-no-provider` to compile without ring #931 * Fix CONNECT proxy Host header #936 * Re-enable CONNECT proxy support #932 * Body::content_length #927 * Handle Authorization: Basic from URI #923 * Remove many uses of Box::new() from Connector chain #919 # 3.0.0-rc4 * Default to `TooManyRedirects` error #916 * Add `ConfigBuilder::max_redirects_will_error()` #916 * Add new `SendBody::into_reader()` #914 * Fix completely broken PEM parsing #912 * Improve ergonomics for `AutoHeaderValue` #896 # 3.0.0-rc3 * Re-export ureq_proto::ArrayVec #891 * Expose typestate variables, but #[doc(hidden)] #889 * Clarify versioning and MSRV policy #887 * Get last used uri via `ResponseExt::get_uri()` #884 * Expose more things for 3rd party Transport impls #886 * Make accessor fn for `Config` and `TlsConfig` #886 * Move `Transport` and `Resolver` traits to `unversioned` #881 * Upgrade deps #885 * MSRV 1.71.1 to follow rustls #885 * Fix bug in chunked overhead calculation #880 * Make it possible to disable all automatic headers #876 * Rename `hoot` -> `ureq_proto`#872 * Fix `disable_verification` for TLS #871 * `vendored` feature flag to get vendored native-tls #866 * Fix incorrect handling of expect-100 #867 # 3.0.0-rc2 * Remove pub-field config structs in favor of builders #848 * BodyBuilder to create a response Body for test/middleware #847 * RequestBuilder::send_empty() convenience fn #846 * Rename BodyWithConfig::into_reader -> reader #845 * Escape hatch to send body for any method #857 * Reintrodice RequestBuilder::query #843 * Reintroduce RequestBuilder::query_pairs #856 * Reintroduce ResponseBuilder::send_form helper #859 * (internal) Use HeaderName for non-sensitive headers #855 * Fix broken build with rustls #832 * Reduce dependency count, platform-verifier feature #833 #818 # 3.0.0-rc1 * Ground up rewrite based on the http crate API. # 2.12.1 * Do not use multi-version deps (>=x.x.x) #907 # 2.12.0 * Bump MSRV 1.67 -> 1.71 because rustls will soon adopt it #905 * Unpin rustls dep (>=0.23.19) #905 # 2.11.0 * Fixes for changes to cargo-deny #882 * Pin rustls dep on 0.23.19 to keep MSRV 1.67 #878 * Bump MSRV 1.63 -> 1.67 due to time crate #878 * Re-export rustls #813 # 2.10.1 * default `ureq` Rustls tls config updated to avoid panic for applications that activate the default Rustls `aws-lc-rs` feature without setting a process-wide crypto provider. `ureq` will now use `*ring*` in this circumstance instead of panicking. # 2.10.0 * Bump MSRV 1.61 -> 1.63 due to rustls #764 * Update deps only patch versions (in Cargo.lock) #763 * Refork frewsxcv/rust-chunked-transfer to fix MIT/Apache2.0 license #761 * Enable http-crate feature for docs #755 * Update Rustls from 0.22 to 0.23 - this may be a breaking change if your application depends on Rustls 0.22 (e.g. to provide a custom `rustls::ClientConfig` to `ureq`). See the [Rustls 0.23.0][rustls-0.23.0] changelog for a list of breaking API changes #753 * Rustls dep to default to ring backend. If your project uses the default `ureq` TLS config, or constructs its own `rustls::ClientConfig` with `rustls::ClientConfig::builder()` you must ensure the Rustls `aws-lc-rs` feature is not activated, or set the process default cryptography provider before constructing any configs. See the Rustls [CryptoProvider][CryptoProvider] docs for more information #753 * Remove direct dep rustls-webpki #752 * Fix doc Rustls does now support IP address certificates #759 #753 [rustls-0.23.0]: https://github.com/rustls/rustls/releases/tag/v%2F0.23.0 [CryptoProvider]: https://docs.rs/rustls/latest/rustls/crypto/struct.CryptoProvider.html#using-the-per-process-default-cryptoprovider # 2.9.7 * Update deps `base64` 0.22, `rustls` to 0.22.4 #747 #748 * Parse URL after middleware to enable changing it #745 * Tidy up code and fix compilation #742, 743 # 2.9.6 ## Fixed * `hootbin` is optional dep. Tests must be run with feature `testdeps` #729 * Exclude script files from cargo package #728 # 2.9.5 ## Fixed * Update deps (`cookie` 0.18, `cookie_store` 0.21, unpin `url`). #722 # 2.9.4 ## Fixed * MSRV 1.61 with CI tests # 2.9.3 ## Fixed * docs.rs docs # 2.9.2 ## Added * Replace dependency on httpbin.org for tests/doc-tests. #703 ## Fixed * Remove Header struct that never should have been exported. #696 * Update deps (rustls 0.22) #690 # 2.9.1 ## Fixed * Unbreak feature `http-interop`. This feature is version locked to http crate 0.2 * New feature `http-crate`. This feature is for http crate 1.0 * New feature `proxy-from-env` to detect proxy settings for global Agent (ureq::get) # 2.9.0 ## Fixed * Broken rustls dep (introduced new function in patch version) #677 * Doc and test fixes #670 #673 #674 ## Added * Upgraded http dep to 1.0 * http_interop to not require utf-8 headers #672 * http_interop implement conversion for `http::request::Parts` #669 # 2.8.0 ## Fixed * Fix regression in IPv6 handling #635 * Read proxy response to \r\n\r\n #620 ## Added * Auto-detect proxy from env vars (turned off by default) #649 * Conversion ureq::Response -> http::Response> #638 * cargo-deny CI action to disallow copy-left and duplicate deps #661 # 2.7.1 ## Fixed * Updated serde_json dependency constraint to be >=1.0.97 #630 # 2.7.0 ## Fixed * Pass User-Agent when connecting to proxy #597 * Proxy: Use CONNECT for HTTPS requests, but not HTTP requests #587 * Cookie headers are now cleared on redirect #608 * HTTP/1.0 responses with Content-Length no longer block until server closes the socket. #625 ## Added * Conversions to and from http::Response and http::request::Builder #591 * Updated to rustls 0.21 and rustls-webpki, which add support for IP address certificates #601 * Response::local_addr #605 # 2.6.2 ## Fixed * Non-empty connection pools were never dropped #583 # 2.6.1 ## Fixed * gzip: examine Content-Length header before removing #578 # 2.6.0 ## Added * Response::remote_addr() #489 * Request::query_pairs() - make query params from an Iterator of pairs #519 ## Fixed * Gzip responses with chunked encoding now work with connection pooling #560 * Don't panic when rustls-native-certs errors #564 * Responses with zero-length body now work with connection pooling #565 # 2.5.0 * Add tcp no_delay option #465 * Rework public TLS traits * Warn if requests aren't sent #490 * Fixes for returning stream to pool #509 * Avoid extra syscalls when content is buffered #508 * Remove dep on sync_wrapper #514 #528 * Error instead of panic on large deadlines #517 * Make ReadWrite trait simpler (used in bespoke TLS impls) #530 * Buffer short response bodies #531 * Update cookie/cookie_store dep # 2.4.0 * Enable `gzip` feature by default #455 * `gzip` and `brotli` feature flags to enable decompression #453 #421 * Middleware function on agent #448 * Agent option to preserve `Authorization` header on redirects #445 * Deprecate re-exported serde types #446 * Widen type of `send_json` to `impl Serializable` #446 * `native-tls` feature provides an alternative TLS backend #449 #391 # 2.3.2 * Re-introduce the `ureq::patch` and `agent::patch` calls. * Fix regression in 2.3.x for feature native-certs #441 # 2.3.1 * Don't panic when given an invalid DNS name #436 * Update to rustls-native-certs v0.6 #432 # 2.3.0 * Upgrade to rustls 0.20 #427 * Make test mocks of Response more accurate by removing newline #423 * Redact sensitive headers when logging prelude #414 # 2.2.0 * Update to latest dependencies * Add SOCKS4 support #410 * Downgrade logging on info level to debug #409 * Bugfix: Clear content-length header on redirect #394 #395 # 2.1.1 * Bugfix: don't reuse conns with bytes pending from server #372. This reduces Transport errors when using an Agent for connection pooling. # 2.1.0 * Bugfix: allow status lines without a reason phrase #316 * Example: "cureq" to easier make ad-hoc command line tests #330 * Override timeout per Request #335 * Bugfix: handle non-utf8 status and headers #347 and better errors #329 * Request inspection (method, url, etc) #310 #350 * Bugfix: stop percent encoding cookies #353 * Enforce cookie RFC naming/value rules #353 * Bugfix: reduce error struct size #356 # 2.0.2 * Bugfix: Apply deadline across redirects. #313 * OrAnyStatus::or_any_status ergonomic helper * Allow header lines to end with only LF #321 # 2.0.1 * Fix handling of 308 redirects (port from 1.5.4 branch) * Return UnexpectedEof instead of InvalidData on short responses. #293 * Implement std::error::Error for error::Transport. #299 # 2.0.0 * Methods that formerly returned Response now return Result. You'll need to change all instances of `.call()` to `.call()?` or handle errors using a `match` statement. * Non-2xx responses are considered Error by default. See [Error documentation] for details on how to get Response bodies for non-2xx. * Rewrite Error type. It's now an enum of two types of error: Status and Transport. Status errors (i.e. non-2xx) can be readily turned into a Response using match statements. * Errors now include the source error (e.g. errors from DNS or I/O) when appropriate, as well as the URL that caused an error. * The "synthetic error" concept is removed. * Move more configuration to Agent. Timeouts, TLS config, and proxy config now require building an Agent. * Create AgentBuilder to separate the process of building an agent from using the resulting agent. Headers can be set on an AgentBuilder, not the resulting Agent. * Agent is cheaply cloneable with an internal Arc. This makes it easy to share a single agent throughout your program. * There is now a default timeout_connect of 30 seconds. Read and write timeouts continue to be unset by default. * Add ureq::request_url and Agent::request_url, to send requests with already-parsed URLs. * Remove native_tls support. * Remove convenience methods `options(url)`, `trace(url)`, and `patch(url)`. To send requests with those verbs use `request(method, url)`. * Remove Request::build. This was a workaround because some of Request's methods took `&mut self` instead of `mut self`, and is no longer needed. You can simply delete any calls to `Request::build`. * Remove Agent::set_cookie. * Remove Header from the public API. The type wasn't used by any public methods. * Remove basic auth support. The API was incomplete. We may add back something better in the future. * Remove into_json_deserialize. Now into_json handles both serde_json::Value and other types that implement serde::Deserialize. If you were using serde_json before, you will probably have to explicitly annotate a type, like: `let v: serde_json::Value = response.into_json();`. * Rewrite README and top-level documentation. [Error documentation]: https://docs.rs/ureq/2.0.0-rc4/ureq/enum.Error.html # 2.0.0-rc4 * Remove error_on_non_2xx. #272 * Do more validation on status line. #266 * (internal) Add history to response objects #275 # 2.0.0-rc3 * Refactor Error to use an enum for easier extraction of status code errors. * (Internal) Use BufRead::read_line when reading headers. # 2.0.0-rc2 * These changes are mostly already listed under 2.0.0. * Remove the "synthetic error" concept. Methods that formerly returned Response now return Result. * Rewrite Error type. Instead of an enum, it's now a struct with an ErrorKind. This allows us to store the source error when appropriate, as well as the URL that caused an error. * Move more configuration to Agent. Timeouts, TLS config, and proxy config now require building an Agent. * Create AgentBuilder to separate the process of building an agent from using the resulting agent. Headers can be set on an AgentBuilder, not the resulting Agent. * Agent is cheaply cloneable with an internal Arc. This makes it easy to share a single agent throughout your program. * There is now a default timeout_connect of 30 seconds. Read and write timeouts continue to be unset by default. * Add ureq::request_url and Agent::request_url, to send requests with already-parsed URLs. * Remove native_tls support. * Remove convenience methods `options(url)`, `trace(url)`, and `patch(url)`. To send requests with those verbs use `request(method, url)`. * Remove Request::build. This was a workaround because some of Request's methods took `&mut self` instead of `mut self`, and is no longer needed. You can simply delete any calls to `Request::build`. * Remove Agent::set_cookie. * Remove Header from the public API. The type wasn't used by any public methods. * Remove basic auth support. The API was incomplete. We may add back something better in the future. * Remove into_json_deserialize. Now into_json handles both serde_json::Value and other types that implement serde::Deserialize. If you were using serde_json before, you will probably have to explicitly annotate a type, like: `let v: serde_json::Value = response.into_json();`. * Rewrite README and top-level documentation. # 1.5.2 * Remove 'static constraint on Request.send(), allowing a wider variety of types to be passed. Also eliminate some copying. #205 * Allow turning a Response into an Error #214 * Update env_logger to 0.8.1 #195 * Remove convenience method for CONNECT verb #177 * Fix bugs in handling of timeout_read #197 and #198 # 1.5.1 * Use cookie_store crate for correct cookie handling #169 * Fix bug in picking wrong host for redirects introduced in 1.5.0 #180 * Allow proxy settings on Agent #178 # 1.5.0 * Add pluggable name resolution. Users can now override the IP addresses for hostnames of their choice #148 * bugfix: Don't re-pool streams on drop. This would occur if the user called `response.into_reader()` and dropped the resulting `Read` before reading all the way to EOF. The result would be a BadStatus error on the next request to the same hostname. This only affected users using an explicit Agent #160 * Automatically set Transfer-Encoding: chunked when using `send` #86 * `into_reader()` now returns `impl Read + Send` instead of `impl Read` #156 * Add support for log crate #170 * Retry broken connections in more cases (should reduce BadStatus errors) #168 # 1.4.1 * Use buffer to avoid byte-by-byte parsing result in multiple syscalls. * Allow pooling multiple connections per host. * Put version in user agent "ureq/1.4.1". # 1.4.0 * Propagate WouldBlock in io:Error for Response::to_json. * Merge multiple cookies into one header to be spec compliant. * Allow setting TLSConnector for native-tls. * Remove brackets against TLS lib when IPv6 addr is used as hostname. * Include proxy in connection pool keys. * Stop assuming localhost for URLs without host part. * Error if body length is less than content-length. * Validate header names. # 1.3.0 * Changelog start