From cd4e21e1b437a93a43672dffdb2288ea0303fcbb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Drwi=C4=99ga?= Date: Thu, 20 Oct 2016 12:57:48 +0200 Subject: [PATCH] Fixing small files fetching (#2742) * Fixing small files fetching * Fixing a case where tranfer encoding is not chunked --- util/https-fetch/src/client.rs | 8 ++++++-- util/https-fetch/src/http.rs | 15 +++++++++++---- util/https-fetch/src/tlsclient.rs | 5 ++++- 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/util/https-fetch/src/client.rs b/util/https-fetch/src/client.rs index ad75f2ca4..19f2f3e16 100644 --- a/util/https-fetch/src/client.rs +++ b/util/https-fetch/src/client.rs @@ -31,6 +31,7 @@ use url::Url; pub enum FetchError { InvalidAddress, ReadingCaCertificates, + UnexpectedStatus(String), CaCertificates(io::Error), Io(io::Error), Notify(mio::NotifyError), @@ -162,10 +163,13 @@ impl mio::Handler for ClientLoop { if let Ok(mut tlsclient) = TlsClient::new(mio::Token(token), &url, writer, abort, callback, self.size_limit.clone()) { let httpreq = format!( - "GET {} HTTP/1.1\r\nHost: {}\r\nConnection: close\r\nAccept-Encoding: identity\r\n\r\n", + "GET {} HTTP/1.1\r\nHost: {}\r\nConnection: close\r\nUser-Agent: {}/{}\r\nAccept-Encoding: identity\r\n\r\n", url.path(), - url.hostname() + url.hostname(), + env!("CARGO_PKG_NAME"), + env!("CARGO_PKG_VERSION") ); + debug!("Requesting content: {}", httpreq); let _ = tlsclient.write(httpreq.as_bytes()); tlsclient.register(event_loop); diff --git a/util/https-fetch/src/http.rs b/util/https-fetch/src/http.rs index 5f40ca4cb..f21e2d406 100644 --- a/util/https-fetch/src/http.rs +++ b/util/https-fetch/src/http.rs @@ -52,11 +52,14 @@ impl HttpProcessor { } } - #[cfg(test)] pub fn status(&self) -> Option<&String> { self.status.as_ref() } + pub fn status_is_ok(&self) -> bool { + self.status == Some("HTTP/1.1 200 OK".into()) + } + #[cfg(test)] pub fn headers(&self) -> &[String] { &self.headers @@ -153,7 +156,7 @@ impl HttpProcessor { } try!(self.body_writer.write_all(self.buffer.get_ref())); self.buffer_consume(len); - return Ok(()); + return self.body_writer.flush(); }, State::WaitingForChunk => { match self.find_break_index() { @@ -189,7 +192,11 @@ impl HttpProcessor { continue; } } - try!(self.body_writer.write_all(&self.buffer.get_ref()[0..left])); + { + let chunk = &self.buffer.get_ref()[0..left]; + trace!("Writing chunk: {:?}", String::from_utf8_lossy(chunk)); + try!(self.body_writer.write_all(chunk)); + } self.buffer_consume(left + BREAK_LEN); self.set_state(State::WaitingForChunk); @@ -200,7 +207,7 @@ impl HttpProcessor { State::Finished => { let len = self.buffer.get_ref().len(); self.buffer_consume(len); - return Ok(()); + return self.body_writer.flush(); }, } } diff --git a/util/https-fetch/src/tlsclient.rs b/util/https-fetch/src/tlsclient.rs index 62af2b06c..dd6f50bba 100644 --- a/util/https-fetch/src/tlsclient.rs +++ b/util/https-fetch/src/tlsclient.rs @@ -137,8 +137,11 @@ impl TlsClient { trace!("Connection closed"); let callback = &mut self.callback; callback(match self.error.take() { + None if self.writer.status_is_ok() => Ok(()), Some(err) => Err(err.into()), - None => Ok(()), + None => { + Err(FetchError::UnexpectedStatus(format!("{:?}", self.writer.status()))) + }, }); return true;