Struct Agent

pub struct Agent { /* private fields */ }
Available on crate feature dep_ureq only.
Expand description

Agents keep state between requests.

By default, no state, such as cookies, is kept between requests. But by creating an agent as entry point for the request, we can keep a state.

§Example

let mut agent = ureq::agent();

agent
    .post("http://example.com/post/login")
    .send(b"my password")?;

let secret = agent
    .get("http://example.com/get/my-protected-page")
    .call()?
    .body_mut()
    .read_to_string()?;

  println!("Secret is: {}", secret);

§About threads and cloning

Agent uses inner Arc. Cloning an Agent results in an instance that shares the same underlying connection pool and other state.

The connection pool contains an inner Mutex which is (briefly) held when borrowing a pooled connection, or returning a connection to the pool.

All request functions in ureq have a signature similar to this:

fn run(request: http::Request<impl AsSendBody>) -> Result<http::Response<Body>, Error> {
    // <something>
}

It follows that:

  • An Agent is borrowed for the duration of:
    1. Sending the request header (http::Request)
    2. Sending the request body (SendBody)
    3. Receiving the response header (http::Response)
  • The Body of the response is not bound to the lifetime of the Agent.

A response Body can be streamed (for instance via Body::into_reader()). The Body implements Send, which means it’s possible to read the response body on another thread than the one that run the request. Behind the scenes, the Body retains the connection to the remote server and it is returned to the agent’s pool, once the Body instance (or reader) is dropped.

There is an asymmetry in that sending a request body will borrow the Agent instance, while receiving the response body does not. This inconvencience is somewhat mitigated by that Agent::run() (or going via the methods such as Agent::get()), borrows &self, i.e. not exclusive mut borrows.

That cloning the agent shares the connection pool is considered a feature. It is often useful to retain a single pool for the entire process, while dispatching requests from different threads. And if we want separate pools, we can create multiple agents via one of the constructors (such as Agent::new_with_config()).

Note that both Config::clone() and Agent::clone() are “cheap” meaning they should not incur any heap allocation.

Implementations§

§

impl Agent

pub fn new_with_defaults() -> Agent

Creates an agent with defaults.

pub fn new_with_config(config: Config) -> Agent

Creates an agent with config.

pub fn config_builder() -> ConfigBuilder<AgentScope>

Shortcut to reach a ConfigBuilder

This is the same as doing Config::builder().

pub fn with_parts( config: Config, connector: impl Connector, resolver: impl Resolver, ) -> Agent

Creates an agent with a bespoke transport and resolver.

This is low level API that isn’t for regular use of ureq.

pub fn run( &self, request: Request<impl AsSendBody>, ) -> Result<Response<Body>, Error>

Run a http::Request<impl AsSendBody>.

Used to execute http crate http::Request directly on this agent.

§Example
use ureq::{http, Agent};

let agent: Agent = Agent::new_with_defaults();

let mut request =
    http::Request::get("http://httpbin.org/get")
    .body(())?;

let body = agent.run(request)?
    .body_mut()
    .read_to_string()?;

pub fn config(&self) -> &Config

Get the config for this agent.

pub fn configure_request<S>( &self, request: Request<S>, ) -> ConfigBuilder<HttpCrateScope<S>>
where S: AsSendBody,

Alter the configuration for an http crate request.

Notice: It’s an error to configure a http::Request using one instance of Agent and run using another instance. The library does not currently detect this situation, but it is not considered a breaking change if this is enforced in the future.

pub fn get<T>(&self, uri: T) -> RequestBuilder<WithoutBody>
where Uri: TryFrom<T>, <Uri as TryFrom<T>>::Error: Into<Error>,

Make a GET request using this agent.

pub fn post<T>(&self, uri: T) -> RequestBuilder<WithBody>
where Uri: TryFrom<T>, <Uri as TryFrom<T>>::Error: Into<Error>,

Make a POST request using this agent.

pub fn put<T>(&self, uri: T) -> RequestBuilder<WithBody>
where Uri: TryFrom<T>, <Uri as TryFrom<T>>::Error: Into<Error>,

Make a PUT request using this agent.

pub fn delete<T>(&self, uri: T) -> RequestBuilder<WithoutBody>
where Uri: TryFrom<T>, <Uri as TryFrom<T>>::Error: Into<Error>,

Make a DELETE request using this agent.

pub fn head<T>(&self, uri: T) -> RequestBuilder<WithoutBody>
where Uri: TryFrom<T>, <Uri as TryFrom<T>>::Error: Into<Error>,

Make a HEAD request using this agent.

pub fn options<T>(&self, uri: T) -> RequestBuilder<WithoutBody>
where Uri: TryFrom<T>, <Uri as TryFrom<T>>::Error: Into<Error>,

Make an OPTIONS request using this agent.

pub fn connect<T>(&self, uri: T) -> RequestBuilder<WithoutBody>
where Uri: TryFrom<T>, <Uri as TryFrom<T>>::Error: Into<Error>,

Make a CONNECT request using this agent.

pub fn patch<T>(&self, uri: T) -> RequestBuilder<WithBody>
where Uri: TryFrom<T>, <Uri as TryFrom<T>>::Error: Into<Error>,

Make a PATCH request using this agent.

pub fn trace<T>(&self, uri: T) -> RequestBuilder<WithoutBody>
where Uri: TryFrom<T>, <Uri as TryFrom<T>>::Error: Into<Error>,

Make a TRACE request using this agent.

Trait Implementations§

§

impl Clone for Agent

§

fn clone(&self) -> Agent

Returns a copy of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
§

impl Debug for Agent

§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
§

impl From<Config> for Agent

§

fn from(value: Config) -> Agent

Converts to this type from the input type.

Auto Trait Implementations§

§

impl Freeze for Agent

§

impl !RefUnwindSafe for Agent

§

impl Send for Agent

§

impl Sync for Agent

§

impl Unpin for Agent

§

impl !UnwindSafe for Agent

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> ByteSized for T

Source§

const BYTE_ALIGN: usize = _

The alignment of this type in bytes.
Source§

const BYTE_SIZE: usize = _

The size of this type in bytes.
Source§

fn byte_align(&self) -> usize

Returns the alignment of this type in bytes.
Source§

fn byte_size(&self) -> usize

Returns the size of this type in bytes. Read more
Source§

fn ptr_size_ratio(&self) -> [usize; 2]

Returns the size ratio between Ptr::BYTES and BYTE_SIZE. Read more
Source§

impl<T, R> Chain<R> for T
where T: ?Sized,

Source§

fn chain<F>(self, f: F) -> R
where F: FnOnce(Self) -> R, Self: Sized,

Chain a function which takes the parameter by value.
Source§

fn chain_ref<F>(&self, f: F) -> R
where F: FnOnce(&Self) -> R,

Chain a function which takes the parameter by shared reference.
Source§

fn chain_mut<F>(&mut self, f: F) -> R
where F: FnOnce(&mut Self) -> R,

Chain a function which takes the parameter by exclusive reference.
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dst: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
Source§

impl<T> ExtAny for T
where T: Any + ?Sized,

Source§

fn type_id() -> TypeId

Returns the TypeId of Self. Read more
Source§

fn type_of(&self) -> TypeId

Returns the TypeId of self. Read more
Source§

fn type_name(&self) -> &'static str

Returns the type name of self. Read more
Source§

fn type_is<T: 'static>(&self) -> bool

Returns true if Self is of type T. Read more
Source§

fn type_hash(&self) -> u64

Returns a deterministic hash of the TypeId of Self.
Source§

fn type_hash_with<H: Hasher>(&self, hasher: H) -> u64

Returns a deterministic hash of the TypeId of Self using a custom hasher.
Source§

fn as_any_ref(&self) -> &dyn Any
where Self: Sized,

Upcasts &self as &dyn Any. Read more
Source§

fn as_any_mut(&mut self) -> &mut dyn Any
where Self: Sized,

Upcasts &mut self as &mut dyn Any. Read more
Source§

fn as_any_box(self: Box<Self>) -> Box<dyn Any>
where Self: Sized,

Upcasts Box<self> as Box<dyn Any>. Read more
Source§

fn downcast_ref<T: 'static>(&self) -> Option<&T>

Available on crate feature unsafe_layout only.
Returns some shared reference to the inner value if it is of type T. Read more
Source§

fn downcast_mut<T: 'static>(&mut self) -> Option<&mut T>

Available on crate feature unsafe_layout only.
Returns some exclusive reference to the inner value if it is of type T. Read more
Source§

impl<T> ExtMem for T
where T: ?Sized,

Source§

const NEEDS_DROP: bool = _

Know whether dropping values of this type matters, in compile-time.
Source§

fn mem_align_of<T>() -> usize

Returns the minimum alignment of the type in bytes. Read more
Source§

fn mem_align_of_val(&self) -> usize

Returns the alignment of the pointed-to value in bytes. Read more
Source§

fn mem_size_of<T>() -> usize

Returns the size of a type in bytes. Read more
Source§

fn mem_size_of_val(&self) -> usize

Returns the size of the pointed-to value in bytes. Read more
Source§

fn mem_copy(&self) -> Self
where Self: Copy,

Bitwise-copies a value. Read more
Source§

fn mem_needs_drop(&self) -> bool

Returns true if dropping values of this type matters. Read more
Source§

fn mem_drop(self)
where Self: Sized,

Drops self by running its destructor. Read more
Source§

fn mem_forget(self)
where Self: Sized,

Forgets about self without running its destructor. Read more
Source§

fn mem_replace(&mut self, other: Self) -> Self
where Self: Sized,

Replaces self with other, returning the previous value of self. Read more
Source§

fn mem_take(&mut self) -> Self
where Self: Default,

Replaces self with its default value, returning the previous value of self. Read more
Source§

fn mem_swap(&mut self, other: &mut Self)
where Self: Sized,

Swaps the value of self and other without deinitializing either one. Read more
Source§

unsafe fn mem_zeroed<T>() -> T

Available on crate feature unsafe_layout only.
Returns the value of type T represented by the all-zero byte-pattern. Read more
Source§

unsafe fn mem_transmute_copy<Src, Dst>(src: &Src) -> Dst

Available on crate feature unsafe_layout only.
Returns the value of type T represented by the all-zero byte-pattern. Read more
Source§

fn mem_as_bytes(&self) -> &[u8]
where Self: Sync + Unpin,

Available on crate feature unsafe_slice only.
View a Sync + Unpin self as &[u8]. Read more
Source§

fn mem_as_bytes_mut(&mut self) -> &mut [u8]
where Self: Sync + Unpin,

Available on crate feature unsafe_slice only.
View a Sync + Unpin self as &mut [u8]. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<S> FromSample<S> for S

§

fn from_sample_(s: S) -> S

Source§

impl<T> Hook for T

Source§

fn hook_ref<F>(self, f: F) -> Self
where F: FnOnce(&Self),

Applies a function which takes the parameter by shared reference, and then returns the (possibly) modified owned value. Read more
Source§

fn hook_mut<F>(self, f: F) -> Self
where F: FnOnce(&mut Self),

Applies a function which takes the parameter by exclusive reference, and then returns the (possibly) modified owned value. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
§

impl<F, T> IntoSample<T> for F
where T: FromSample<F>,

§

fn into_sample(self) -> T

§

impl<T> Pointable for T

§

const ALIGN: usize

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
§

impl<T, U> ToSample<U> for T
where U: FromSample<T>,

§

fn to_sample_(self) -> U

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more
§

impl<S, T> Duplex<S> for T
where T: FromSample<S> + ToSample<S>,

§

impl<T> Ungil for T
where T: Send,