Commit Graph
53 Commits
Author SHA1 Message Date
Jacob Hoffman-Andrews d4dfe4096f Feature-gate AgentState 2020-10-01 14:27:59 -07:00
Jacob Hoffman-Andrews 06d6435374 Merge branch 'master' of https://github.com/algesten/ureq into cookie_store 2020-09-29 01:45:52 -07:00
Jacob Hoffman-Andrews 9300c50461 Make cookie_store optional 2020-09-29 01:45:26 -07:00
Jacob Hoffman-Andrews 065b560dfb Add log dependency. (#170)
Also add log statements to unit. Each request gets one info line;
retries, redirects, and responses get logged at debug level.
2020-09-29 01:37:39 -07:00
Jacob Hoffman-Andrews 9b39e55d1c Use cookie_store 2020-09-29 00:34:29 -07:00
Jacob Hoffman-Andrews 4b95d4d29e Cookie refactor 2020-09-28 22:41:29 -07:00
Jacob Hoffman-Andrews 995f6e44a9 Pass through io::Errors when reading headers. (#166)
Previously any io::Error on reading a status line or response headers
would be unconditionally mapping into BadStatus or BadHeader. I think
it's better to pass through the actual io::Error.

BadStatusRead is still kept, since it has special status when dealing
with timed out connections, and BadStatus is still used when the status
line is malformed.
2020-09-28 09:14:26 -07:00
Jacob Hoffman-Andrews e4d2ce8494 Add changelog for 1.5.0. (#164) 2020-09-27 19:50:51 -07:00
Jacob Hoffman-Andrews 264abdf452 Add PRs to changelog. 2020-09-27 11:36:55 -07:00
Jacob Hoffman-Andrews e4e9455fa8 Add changelog for 1.5.0. 2020-09-27 11:33:11 -07:00
Jacob Hoffman-Andrews 5801f87c56 Remove Sync 2020-09-27 20:24:24 +02:00
Jacob Hoffman-Andrews 5e00b5c5e3 Add Send + Sync marker traits to into_reader.
This allows the resulting Read to be shared among threads.
2020-09-27 20:24:24 +02:00
Jacob Hoffman-Andrews 7046b07518 Replace IoResult and IoError with io:: versions. (#161) 2020-09-27 10:20:24 -07:00
Jacob Hoffman-Andrews e8c3403f7b Remove DEFAULT_HOST (#153)
In a few places we relied on "localhost" as a default if a URL's host
was not set, but I think it's better to error out in these cases.

In general, there are a few places in Unit that assumed there is a
host as part of the URL. I've made that explicit by doing a check
at the beginning of `connect()`. I've also tried to plumb through
the semantics of "host is always present" by changing the parameter
types of some of the functions that use the hostname.

I considered a more thorough way to express this with types - for
instance implementing an `HttpUrl` struct that embeds a `Url`, and
exports most of the same methods, but guarantees that host is always
present. However, that was more invasive than this so I did a smaller
change to start.
2020-09-27 10:07:13 -07:00
Jacob Hoffman-Andrews db0c6fb1b0 Print better errors 2020-09-27 10:42:05 +02:00
Jacob Hoffman-Andrews 786047629a bugfix: Don't re-pool streams on drop.
We only want streams in the pool that are ready for the next request,
and don't have any remaining bytes of the previous request. That's the
case when we return a stream due to EOF on the underlying `Read`.

However, there was also an `impl Drop` that returned the stream to the
pool on drop of a PoolReturnRead. That resulted in a bug: If a user
called `response.into_reader()`, but did not read the entire body,
a dirty stream would be returned to the pool. The next time a request
was made to the same host, that stream would be reused, and instead of
reading off "HTTP/1.1 200 OK", ureq would read a remnant of the previous
request, resulting in a BadStatus error.
2020-09-27 10:42:05 +02:00
Jacob Hoffman-Andrews b01be808c5 Fix set_max_idle_connections(0).
This broke during some recent refactorings. The special case branch for
max_connections == 0 wasn't actually setting the max_idle_connections
field.

This change simply deletes that branch, since the existing code that
whittles down the pool size one element at a time suffices. In the
common case this will be set on an empty pool anyhow.
2020-09-27 10:20:30 +02:00
Jacob Hoffman-Andrews be9e3ca936 Update comment about retries.
This comment previously assumed we would have at most one pooled
connection per host. That's no longer true, so update the comment.
2020-09-21 08:14:28 +02:00
Jacob Hoffman-Andrews b87299e988 Document and tidy up new Pool invariants. (#142)
Now that we allow multiple connections for the same PoolKey, update our
invariants accordingly. Also provide a couple of helper functions for
removing the first or last match of an entry in a VecDeque.

This also changes which entry from `lru` gets removed when a stream is
removed from the pool. Previously it was the oldest matching one. Now it's
the newest matching one, which matches the semantics we are applying to
`recycle[K]`.

Followup to #133 

/cc @cfal
2020-09-18 19:35:22 -07:00
Jacob Hoffman-Andrews c343587afb Use #[cfg(feature = "cookie")] for some functions.
Some helper functions introduced as part of the cookies_on_redirect
test are only used by that test, which means they are only used when the
cookie feature is enabled. This causes clippy warnings for some of the
other feature combinations in CI.
2020-09-14 08:58:02 +02:00
Jacob Hoffman-Andrews f38c203215 Fix cookies_on_redirect unittest.
Previously this test relied on a specific ordering of cookies, which was
not guaranteed. This makes the test robust to random ordering.

Also, fix the check for the `second` cookie to actually check the right
cookie.
2020-09-13 21:14:40 +02:00
Jacob Hoffman-AndrewsandMartin Algesten 5cb212f7b7 Put the crate version in the User-Agent header. (#138)
* Put the crate version in the User-Agent header.

https://tools.ietf.org/html/rfc7231#section-5.5.3
Each product identifier consists of a name and optional version.

     product         = token ["/" product-version]
     product-version = token

* User-Agent of rust-ureq

* Update src/unit.rs

Co-authored-by: Martin Algesten <martin@algesten.se>
2020-09-13 14:13:54 +02:00
Jacob Hoffman-Andrews 99cdff7519 Add unittest for cookie handling on redirects. 2020-09-13 14:12:17 +02:00
Jacob Hoffman-Andrews 6a88c2c8bf Clean up unused code and long imports. (#137)
This removes some commented out methods, and also changes instances of
::std::foo to use a more idiomatic import path.
2020-09-12 18:42:15 -07:00
Jacob Hoffman-Andrews 87b8a381bc Remove default base URL of http://localhost/ (#108)
This doesn't change the API at all, since it delays any errors until do_call.
Since there was already an `Into<Response> for Error`, and do_call already
had a `.unwrap_or_else(|e| e.into())`, nothing in do_call needed to change.
The only visible effect of this is that code that was previously relying on
`get("/path")` to fetch something from localhost will now get an error. I think
most of those cases would probably actually be accidents, possibly caused
by typos, e.g. `get("example.com/path")` (forgetting the https: prefix).

Fixes #105
2020-07-05 14:25:59 -07:00
Jacob Hoffman-Andrews f16f1a5e47 Error when LimitedRead gets too few bytes. (#106) 2020-07-05 14:25:11 -07:00
Jacob Hoffman-Andrews 7fce93d1c8 Fix tests. 2020-07-02 23:07:53 -07:00
Jacob Hoffman-Andrews b53de7a7ed Remove default URL_BASE of localhost. 2020-07-02 23:01:51 -07:00
Jacob Hoffman-Andrews ea7ed88399 Request: rename path field to URL. (#104)
* Request: rename path field to URL.

This more accurately reflects its use.
2020-07-01 09:53:10 +02:00
Jacob Hoffman-Andrews e4ad3a5e5f Remove unnecessary lifetime annotations. (#103) 2020-07-01 09:40:47 +02:00
Jacob Hoffman-Andrews bbde617719 Add --no-deps to doc build. (#102) 2020-07-01 09:36:57 +02:00
Jacob Hoffman-Andrews 4d7bf5dcda Validate header field names. (#99)
This rejects spaces after field names as well as various other invalid
characters.

Fixes #96
2020-06-30 19:32:17 -07:00
Jacob Hoffman-Andrews b47f90e773 Factor out TestServer. (#98)
This creates a struct that encapsulates the test server setup, and adds
a shutdown method to clean up the thread when done.
2020-06-30 19:16:34 -07:00
Jacob Hoffman-Andrews dafdf6a718 Tweak README. (#92)
The layout of crates.io means that code blocks overflow after 60
characters, so wrap before 60 to avoid needing a scrollbar.

Remove the warning about the Agent code. I think after our recent
testing, I believe it's good enough that it doesn't need a separate
warning.

Remove the old-style macro-use directive and the extern crate directive.
2020-06-26 19:09:24 +02:00
Jacob Hoffman-Andrews 3f78953874 Add a GitHub action for building docs. (#89)
This helps ensure we don't break that doc build.
2020-06-24 21:20:07 +02:00
Jacob Hoffman-Andrews 3cb178ed7c 1.3.0 (#83)
1.3.0
2020-06-24 09:14:00 +02:00
Jacob Hoffman-Andrews 1a40bed7dd Fix reference to Instant in socks feature. (#88)
The reference to time::Instant under feature = socks-proxy was
incorrectly scoped, and should have been just Instant. This breaks the
doc build and any builds that use feature = socks-proxy.
2020-06-24 09:13:12 +02:00
Jacob Hoffman-Andrews a85f4c037e Remove some panics in deadline checking. (#87)
time_until_deadline had a time of check to time of use problem - the
deadline could pass between a call to checked_duration_since and the
evaluation of `deadline - now` (which panics if the result would be
negative). Resolve that by flipping the order of
checked_duration_since's arguments and using the result rather than
ignoring it.

Also there were three places that called deadline - now(), which could
panic. Replace those with time_until_deadline().
2020-06-23 23:45:18 -07:00
Jacob Hoffman-Andrews 2d6747717d Limit max idle connections. (#81)
Adds limit of 100 connections to ConnectionPool. This is implemented
with a VecDeque acting as an LRU. When the pool becomes full, the oldest
stream is popped off the back from the VecDeque and also removed from
the map of PoolKeys to Streams.

Fixes #77
2020-06-23 23:44:47 -07:00
Jacob Hoffman-Andrews a6e99c8b36 Add smoke test in examples. (#85)
This loads a list of top domain names (e.g. from
https://tranco-list.eu/) and tries to fetch them all, in parallel. This
can be used to exercise ureq and find panics.
2020-06-23 21:09:09 -07:00
Jacob Hoffman-Andrews 3014f58a28 Add scheme to PoolKey and let port be None. (#84)
PoolKey calls unwrap() on an option that can be None. Specifically, the
local variable `port` can be None when PoolKey is constructed with a Url
whose scheme is unrecognized in url.port_or_known_default().

To fix that, make port an Option. Also, make scheme part of the PoolKey.
This prevents, for instance, a stream opened for `https://example.com:9999`
being reused on a request for `http://example.com:9999`.

Remove the test-only pool.get() accessor. This was used in only one test,
agent_pool in range.rs. This seemed like it was testing the agent more
than it was testing ranges, so I moved it to agent.rs and edited to
remove the range-testing parts.

Also, reject unrecognized URLs earlier in connect_socket so they don't
reach try_get_connection.
2020-06-22 23:23:39 -07:00
Jacob Hoffman-Andrews 00461fb5bd Only retry idempotent requests. (#80)
This also reverts a change to send_body that was originally added to
return the number of bytes written. It's no longer needed now that we
check the size of the reader in advance.

Fixes #76.
2020-06-22 09:40:55 -07:00
Jacob Hoffman-Andrews 15be014e05 Un-deprecate read/write timeouts. (#78)
In https://github.com/algesten/ureq/pull/67#issuecomment-647112883,
Shnatsel points out that there are uses for read_timeout vs timeout. For
instance, when downloading a large file it's useful to have a read
timouet in case the download stalls, but it would be hard to pick a good
overall timeout without knowing the size of the file and the bandwidth
of the connection.
2020-06-21 14:13:22 -07:00
Jacob Hoffman-Andrews fdc1f37662 Update documentation. (#73)
* Update documentation.

Synchronize goals section between README and rustdoc, and add two goals
(blocking API; no unsafe) that were mentioned elsewhere in the README.

Add error handling to examples for the module and for the Response
object.

And a section on synthetic errors to the top-level module documentation.

* Add back missing close brace.

* Add main function that returns Result.

* Add links to send_bytes and send_form.

* Document chunked encoding for send.

* Use a larger vec of bytes for send.
2020-06-21 09:55:50 +02:00
Jacob Hoffman-AndrewsandMartin Algesten 7adbd57308 Fix up cargo test --no-default-features. (#75)
Adds some feature guards, and removes an unnecessary feature guard
around a call to connect_https (there's an implementation available for
non-TLS that returns UnknownScheme).

Also, remove unnecessary agent.state() method that was only available in
TLS builds. The state field is directly accessible within the crate, and
can be used in both TLS and non-TLS builds.

Co-authored-by: Martin Algesten <martin@algesten.se>
2020-06-21 09:54:03 +02:00
Jacob Hoffman-Andrews e366c8fcd0 Remove compile error on native-tls / tls conflict. (#74)
The docs.rs build uses the --all-features flag, which causes its
documentation builds to fail when this macro is present.

Fixes #71.
2020-06-21 09:51:46 +02:00
Jacob Hoffman-Andrews 57be414d97 Add overall timeout for requests. (#67)
This deprecates timeout_read() and timeout_write() in favor of
timeout(). The new timeout method on Request takes a Duration instead
of a number of milliseconds, and is measured against overall request
time, not per-read time.

Once a request is started, the timeout is turned into a deadline
specific to that call. The deadline is used in conjunction with the
new DeadlineStream class, which sets a timeout on each read according
to the remaining time for the request. Once the request is done,
the DeadlineStream is unwrapped via .into::<Stream>() to become
an undecorated Stream again for return to the pool. Timeouts on the
stream are unset at this point.

Still to be done:

Add a setting on Agent for default timeout.
Change header-writing code to apply overall deadline rather than
per-write timeout.
Fixes #28.
2020-06-21 09:47:35 +02:00
Jacob Hoffman-Andrews bc2cb57e64 Increase chunked_transfer dependency 2020-06-16 10:04:52 +02:00
Jacob Hoffman-Andrews 8a05241eac Move test server into its own function 2020-06-15 09:15:36 +02:00
Jacob Hoffman-Andrews c1d7dbcfe9 Remove no-longer needed feature=tls 2020-06-15 09:15:36 +02:00
Jacob Hoffman-Andrews 64ef337c0b Fix connection_reuse test.
This test was making requests to a server on the Internet. That has the
potential to make the test flaky. Also, the test was relying on a
specific behavior from that server (timing out after 2s), which it no
longer exhibits.

This sets up a local test server that exhibits the specific properties
needed for this test.
2020-06-15 09:15:36 +02:00
Jacob Hoffman-Andrews 378ef57636 Fix findings from cargo clippy. 2020-06-15 09:11:43 +02:00
Jacob Hoffman-Andrews b4c15eef2c Check for server closed connections.
This builds on 753d61b. Before we send a request, we can do a 1-byte
nonblocking peek on the connection. If the server has closed the
connection, this will give us an EOF, and we can take the connection out
of the pool before sending any request on it. This will reduce the
likelihood that we send a non-retryable POST on an already-closed
connection.

The server could still potentially close the connection between when we
make this check and when we finish sending the request, but this should
handle the majority of cases.
2020-06-15 09:11:25 +02:00