Add option to set user-agent
authorDarkDrek <wackerei@gmail.com>
Fri, 11 May 2018 22:41:15 +0000 (00:41 +0200)
committerDarkDrek <wackerei@gmail.com>
Fri, 11 May 2018 23:19:00 +0000 (01:19 +0200)
Fixes #5494

src/cargo/ops/registry.rs
tests/testsuite/bad_config.rs

index 2e1f67142b8b3e69e1ef32c7658e594bac794b71..5ed9c7f25b3217bf4b6719c2c3e90cc913060b98 100644 (file)
@@ -358,8 +358,12 @@ pub fn needs_custom_http_transport(config: &Config) -> CargoResult<bool> {
     let timeout = http_timeout(config)?;
     let cainfo = config.get_path("http.cainfo")?;
     let check_revoke = config.get_bool("http.check-revoke")?;
+    let user_agent = config.get_string("http.user-agent")?;
 
-    Ok(proxy_exists || timeout.is_some() || cainfo.is_some() || check_revoke.is_some())
+    Ok(
+        proxy_exists || timeout.is_some() || cainfo.is_some() || check_revoke.is_some()
+            || user_agent.is_some(),
+    )
 }
 
 /// Configure a libcurl http handle with the defaults options for Cargo
@@ -371,7 +375,6 @@ pub fn configure_http_handle(config: &Config, handle: &mut Easy) -> CargoResult<
     handle.connect_timeout(Duration::new(30, 0))?;
     handle.low_speed_limit(10 /* bytes per second */)?;
     handle.low_speed_time(Duration::new(30, 0))?;
-    handle.useragent(&version().to_string())?;
     if let Some(proxy) = http_proxy(config)? {
         handle.proxy(&proxy)?;
     }
@@ -385,6 +388,11 @@ pub fn configure_http_handle(config: &Config, handle: &mut Easy) -> CargoResult<
         handle.connect_timeout(Duration::new(timeout as u64, 0))?;
         handle.low_speed_time(Duration::new(timeout as u64, 0))?;
     }
+    if let Some(user_agent) = config.get_string("http.user-agent")? {
+        handle.useragent(&user_agent.val)?;
+    } else {
+        handle.useragent(&version().to_string())?;
+    }
     Ok(())
 }
 
index 1bdf2f3078a08e0f5794826b7e70a246ae2b367f..0986fda731f6ec8087ca6ea3f22f57b1df887ac6 100644 (file)
@@ -181,6 +181,43 @@ Caused by:
     );
 }
 
+#[test]
+fn bad6() {
+    let p = project("foo")
+        .file(
+            "Cargo.toml",
+            r#"
+            [package]
+            name = "foo"
+            version = "0.0.0"
+            authors = []
+        "#,
+        )
+        .file("src/lib.rs", "")
+        .file(
+            ".cargo/config",
+            r#"
+            [http]
+              user-agent = true
+        "#,
+        )
+        .build();
+    Package::new("foo", "1.0.0").publish();
+
+    assert_that(
+        p.cargo("publish").arg("-v"),
+        execs().with_status(101).with_stderr(
+            "\
+error: failed to update registry [..]
+
+Caused by:
+  invalid configuration for key `http.user-agent`
+expected a string, but found a boolean for `http.user-agent` in [..]config
+",
+        ),
+    );
+}
+
 #[test]
 fn bad_cargo_config_jobs() {
     let p = project("foo")