diff options
author | Anton Ageev <antage@gmail.com> | 2019-03-31 03:20:21 +0300 |
---|---|---|
committer | Doug Tangren <d.tangren@gmail.com> | 2019-03-30 20:20:21 -0400 |
commit | ac8789e257f5e4a477192bbbd8ecc2676bb485e5 (patch) | |
tree | 792377890e4d0293be366233acf510e2610bd4fd /src/transport.rs | |
parent | eb98b1916c0220e44e2d0f3c869c01a2dd037f60 (diff) |
Add a registry authentication. (#157)
Diffstat (limited to 'src/transport.rs')
-rw-r--r-- | src/transport.rs | 22 |
1 files changed, 16 insertions, 6 deletions
diff --git a/src/transport.rs b/src/transport.rs index da506b3..ce089fc 100644 --- a/src/transport.rs +++ b/src/transport.rs @@ -19,7 +19,7 @@ use log::debug; use mime::Mime; use serde::{Deserialize, Serialize}; use serde_json; -use std::fmt; +use std::{fmt, iter}; use tokio_io::{AsyncRead, AsyncWrite}; pub fn tar() -> Mime { @@ -76,7 +76,7 @@ impl Transport { B: Into<Body>, { let endpoint = endpoint.to_string(); - self.stream_chunks(method, &endpoint, body) + self.stream_chunks(method, &endpoint, body, None::<iter::Empty<_>>) .concat2() .and_then(|v| { String::from_utf8(v.to_vec()) @@ -87,17 +87,19 @@ impl Transport { } /// Make a request and return a `Stream` of `Chunks` as they are returned. - pub fn stream_chunks<B>( + pub fn stream_chunks<B, H>( &self, method: Method, endpoint: &str, body: Option<(B, Mime)>, + headers: Option<H>, ) -> impl Stream<Item = Chunk, Error = Error> where B: Into<Body>, + H: IntoIterator<Item = (&'static str, String)>, { let req = self - .build_request(method, endpoint, body, |_| ()) + .build_request(method, endpoint, body, headers, |_| ()) .expect("Failed to build request!"); self.send_request(req) @@ -140,15 +142,17 @@ impl Transport { } /// Builds an HTTP request. - fn build_request<B>( + fn build_request<B, H>( &self, method: Method, endpoint: &str, body: Option<(B, Mime)>, + headers: Option<H>, f: impl FnOnce(&mut ::http::request::Builder), ) -> Result<Request<Body>> where B: Into<Body>, + H: IntoIterator<Item = (&'static str, String)>, { let mut builder = Request::builder(); f(&mut builder); @@ -169,6 +173,12 @@ impl Transport { }; let req = req.header(header::HOST, ""); + if let Some(h) = headers { + for (k, v) in h.into_iter() { + req.header(k, v); + } + } + match body { Some((b, c)) => Ok(req .header(header::CONTENT_TYPE, &c.to_string()[..]) @@ -215,7 +225,7 @@ impl Transport { }; let req = self - .build_request(method, endpoint, body, |builder| { + .build_request(method, endpoint, body, None::<iter::Empty<_>>, |builder| { builder .header(header::CONNECTION, "Upgrade") .header(header::UPGRADE, "tcp"); |