[http-client] Deny unused results

Change-Id: Ia1f382b134f88dc1c22354ed01fc21ed6cd50a7e
Reviewed-on: https://fuchsia-review.googlesource.com/c/fuchsia/+/514900
Commit-Queue: Peter Johnston <peterjohnston@google.com>
Reviewed-by: Tamir Duberstein <tamird@google.com>
Reviewed-by: Jay Zhuang <jayzhuang@google.com>
Reviewed-by: Nick Brown <nickbrow@google.com>
diff --git a/build/config/rust/BUILD.gn b/build/config/rust/BUILD.gn
index 0645992..4635a9f 100644
--- a/build/config/rust/BUILD.gn
+++ b/build/config/rust/BUILD.gn
@@ -142,7 +142,6 @@
     "//src/connectivity/location/*",
     "//src/connectivity/lowpan/*",
     "//src/connectivity/management/*",
-    "//src/connectivity/network/http-client/*",
     "//src/connectivity/network/lib/*",
     "//src/connectivity/network/netstack/*",
     "//src/connectivity/network/netstack3/*",
diff --git a/src/connectivity/network/http-client/BUILD.gn b/src/connectivity/network/http-client/BUILD.gn
index 1fb4727..ba800f0 100644
--- a/src/connectivity/network/http-client/BUILD.gn
+++ b/src/connectivity/network/http-client/BUILD.gn
@@ -31,6 +31,8 @@
   ]
 
   sources = [ "src/main.rs" ]
+
+  configs -= [ "//build/config/rust:allow_unused_results" ]
 }
 
 # TODO(fxbug.dev/72870): Remove v1 component once integration tests are no
diff --git a/src/connectivity/network/http-client/integration/BUILD.gn b/src/connectivity/network/http-client/integration/BUILD.gn
index 7613c49..809246d 100644
--- a/src/connectivity/network/http-client/integration/BUILD.gn
+++ b/src/connectivity/network/http-client/integration/BUILD.gn
@@ -19,6 +19,8 @@
   ]
 
   sources = [ "src/lib.rs" ]
+
+  configs -= [ "//build/config/rust:allow_unused_results" ]
 }
 
 # TODO(fxbug.dev/71088): Combine `test-driver` and the test root once
diff --git a/src/connectivity/network/http-client/src/main.rs b/src/connectivity/network/http-client/src/main.rs
index 5a47e34..8932e47 100644
--- a/src/connectivity/network/http-client/src/main.rs
+++ b/src/connectivity/network/http-client/src/main.rs
@@ -6,13 +6,14 @@
     anyhow::{Context as _, Error},
     fidl_fuchsia_net_http as net_http,
     fuchsia_async::{self as fasync, TimeoutExt as _},
-    fuchsia_component::server::ServiceFs,
+    fuchsia_component::server::{ServiceFs, ServiceFsDir},
     fuchsia_hyper as fhyper,
     fuchsia_zircon::{self as zx, AsHandleRef},
     futures::{future::BoxFuture, prelude::*, StreamExt},
     hyper,
     log::{debug, error, info, trace},
     std::convert::TryFrom,
+    std::str::FromStr as _,
 };
 
 static MAX_REDIRECTS: u8 = 10;
@@ -194,21 +195,22 @@
 
 impl Loader {
     async fn new(req: net_http::Request) -> Result<Self, Error> {
-        let method =
-            hyper::Method::from_bytes(req.method.unwrap_or_else(|| "GET".to_string()).as_bytes())?;
-        if let Some(url) = req.url {
+        let net_http::Request { method, url, headers, body, deadline, .. } = req;
+        let method = method.as_ref().map(|method| hyper::Method::from_str(method)).transpose()?;
+        let method = method.unwrap_or(hyper::Method::GET);
+        if let Some(url) = url {
             let url = hyper::Uri::try_from(url)?;
-            let mut headers = hyper::HeaderMap::new();
-            if let Some(h) = req.headers {
-                for header in &h {
-                    headers.insert(
-                        hyper::header::HeaderName::from_bytes(&header.name)?,
-                        hyper::header::HeaderValue::from_bytes(&header.value)?,
-                    );
-                }
-            }
+            let headers = headers
+                .unwrap_or_else(|| vec![])
+                .into_iter()
+                .map(|net_http::Header { name, value }| {
+                    let name = hyper::header::HeaderName::from_bytes(&name)?;
+                    let value = hyper::header::HeaderValue::from_bytes(&value)?;
+                    Ok((name, value))
+                })
+                .collect::<Result<hyper::HeaderMap, Error>>()?;
 
-            let body = match req.body {
+            let body = match body {
                 Some(net_http::Body::Buffer(buffer)) => {
                     let mut bytes = vec![0; buffer.size as usize];
                     buffer.vmo.read(&mut bytes, 0)?;
@@ -227,8 +229,7 @@
                 None => Vec::new(),
             };
 
-            let deadline = req
-                .deadline
+            let deadline = deadline
                 .map(|deadline| fasync::Time::from_nanos(deadline))
                 .unwrap_or_else(|| fasync::Time::after(DEFAULT_DEADLINE_DURATION));
 
@@ -410,8 +411,8 @@
 async fn main() -> Result<(), Error> {
     fuchsia_syslog::init()?;
     let mut fs = ServiceFs::new();
-    fs.dir("svc").add_fidl_service(spawn_server);
-    fs.take_and_serve_directory_handle()?;
+    let _: &mut ServiceFsDir<'_, _> = fs.dir("svc").add_fidl_service(spawn_server);
+    let _: &mut ServiceFs<_> = fs.take_and_serve_directory_handle()?;
     let () = fs.collect().await;
     Ok(())
 }