Struct solicit::client::SimpleClient
[−]
[src]
pub struct SimpleClient<S> where S: TransportStream {
// some fields omitted
}
A struct implementing a simple HTTP/2 client.
This client works as an HTTP/1.1 client with a Keep-Alive connection and pipelining might work.
Multiple requests can be queued up (and sent to the server) by calling
request
multiple times, before any get_response
.
Once a get_response
is issued, the client blocks until it receives the
response for the particular request that was referenced in the get_response
call.
Therefore, by doing request
-> get_response
we can use the HTTP/2
connection as a Keep-Alive
HTTP/1.1 connection and a pipelined flow by
queuing up a sequence of requests and then "joining" over them by calling
get_response
for each of them.
The responses that are returned by the client are very raw representations of the response.
Examples
Issue a simple GET request using the helper get
method. Premade connection
passed to the client.
use std::net::TcpStream; use solicit::http::HttpScheme; use solicit::http::connection::HttpConnection; use solicit::http::client::write_preface; use solicit::client::SimpleClient; use std::str; // Prepare a stream manually... We must write the preface ourselves in this case. // This is a more advanced way to use the client and the `HttpConnect` implementations // should usually be preferred for their convenience. let mut stream = TcpStream::connect(&("http2bin.org", 80)).unwrap(); write_preface(&mut stream); // Connect to an HTTP/2 aware server let conn = HttpConnection::<TcpStream, TcpStream>::with_stream( stream, HttpScheme::Http); let mut client = SimpleClient::with_connection(conn, "http2bin.org".into()).unwrap(); let response = client.get(b"/", &[]).unwrap(); assert_eq!(response.stream_id, 1); assert_eq!(response.status_code().unwrap(), 200); // Dump the headers and the response body to stdout. // They are returned as raw bytes for the user to do as they please. // (Note: in general directly decoding assuming a utf8 encoding might not // always work -- this is meant as a simple example that shows that the // response is well formed.) for header in response.headers.iter() { println!("{}: {}", str::from_utf8(&header.0).unwrap(), str::from_utf8(&header.1).unwrap()); } println!("{}", str::from_utf8(&response.body).unwrap());
Issue a simple GET request using the helper get
method. Pass a connector
to establish a new connection.
use solicit::http::client::CleartextConnector; use solicit::client::SimpleClient; use std::str; // Connect to an HTTP/2 aware server let connector = CleartextConnector::new("http2bin.org"); let mut client = SimpleClient::with_connector(connector).unwrap(); let response = client.get(b"/", &[]).unwrap(); assert_eq!(response.stream_id, 1); assert_eq!(response.status_code().unwrap(), 200); // Dump the headers and the response body to stdout. // They are returned as raw bytes for the user to do as they please. // (Note: in general directly decoding assuming a utf8 encoding might not // always work -- this is meant as a simple example that shows that the // response is well formed.) for header in response.headers.iter() { println!("{}: {}", str::from_utf8(&header.0).unwrap(), str::from_utf8(&header.1).unwrap()); } println!("{}", str::from_utf8(&response.body).unwrap());
Methods
impl<S> SimpleClient<S> where S: TransportStream
fn with_connection(conn: HttpConnection<S, S>, host: String) -> HttpResult<SimpleClient<S>>
Create a new SimpleClient
instance that will use the given HttpConnection
to communicate to the server.
It assumes that the connection stream is initialized and will not automatically write the client preface.
fn with_connector<C>(connector: C) -> HttpResult<SimpleClient<S>> where C: HttpConnect<Stream=S>
A convenience constructor that first tries to establish an HTTP/2
connection by using the given connector instance (an implementation of
the HttpConnect
trait).
Panics
Currently, it panics if the connector returns an error.
fn request(&mut self, method: &[u8], path: &[u8], extras: &[Header], body: Option<Vec<u8>>) -> HttpResult<StreamId>
Send a request to the server. Blocks until the entire request has been sent.
The request is described by the method, the path on which it should be
invoked and the "real" headers that should be included. Clients should
never put pseudo-headers in the headers
parameter, as those are
automatically included based on metadata.
Returns
If the full request is successfully sent, returns the ID of the stream on which the request was sent. Clients can use this ID to refer to the response.
Any IO errors are propagated.
fn get_response(&mut self, stream_id: StreamId) -> HttpResult<Response>
Gets the response for the stream with the given ID. If a valid stream ID is given, it blocks until a response is received.
Returns
A Response
if the response can be successfully read.
Any underlying IO errors are propagated. Errors in the HTTP/2 protocol also stop processing and are returned to the client.
fn get(&mut self, path: &[u8], extra_headers: &[Header]) -> HttpResult<Response>
Performs a GET request on the given path. This is a shortcut method for
calling request
followed by get_response
for the returned stream ID.
fn post(&mut self, path: &[u8], extra_headers: &[Header], body: Vec<u8>) -> HttpResult<Response>
Performs a POST request on the given path.