diff --git a/src/apiversion.rs b/src/apiversion.rs index d33d662..092610a 100644 --- a/src/apiversion.rs +++ b/src/apiversion.rs @@ -17,6 +17,7 @@ use std::fmt; use std::str::FromStr; +use reqwest::header::HeaderValue; use serde::de::{Error as DeserError, Visitor}; use serde::{Deserialize, Deserializer, Serialize, Serializer}; @@ -38,6 +39,12 @@ fn parse_component(component: &str, message: &str) -> Result { .map_err(|_| Error::new(ErrorKind::InvalidResponse, message)) } +impl From for HeaderValue { + fn from(value: ApiVersion) -> HeaderValue { + value.to_string().parse().unwrap() + } +} + impl FromStr for ApiVersion { type Err = Error; diff --git a/src/services.rs b/src/services.rs index dab94fb..c296fae 100644 --- a/src/services.rs +++ b/src/services.rs @@ -14,7 +14,7 @@ //! OpenStack service types. -use reqwest::r#async::RequestBuilder; +use reqwest::header::HeaderMap; use super::{ApiVersion, Error, ErrorKind}; @@ -28,14 +28,14 @@ pub trait ServiceType { true } - /// Update the request to include the API version headers. + /// Update the headers to include the API version headers. /// /// The default implementation fails with `IncompatibleApiVersion`. fn set_api_version_headers( &self, - _request: RequestBuilder, + _headers: &mut HeaderMap, _version: ApiVersion, - ) -> Result { + ) -> Result<(), Error> { Err(Error::new( ErrorKind::IncompatibleApiVersion, format!( @@ -124,11 +124,12 @@ impl ServiceType for ComputeService { fn set_api_version_headers( &self, - request: RequestBuilder, + headers: &mut HeaderMap, version: ApiVersion, - ) -> Result { + ) -> Result<(), Error> { // TODO: new-style header support - Ok(request.header("x-openstack-nova-api-version", version.to_string())) + let _ = headers.insert("x-openstack-nova-api-version", version.into()); + Ok(()) } } diff --git a/src/session.rs b/src/session.rs index 239b0d6..9a9c50a 100644 --- a/src/session.rs +++ b/src/session.rs @@ -19,6 +19,7 @@ use std::sync::Arc; use futures::future; use futures::prelude::*; use log::{debug, trace}; +use reqwest::header::HeaderMap; use reqwest::r#async::{RequestBuilder, Response}; use reqwest::{Method, Url}; use serde::de::DeserializeOwned; @@ -251,8 +252,9 @@ impl Session { }) .and_then(move |mut builder| { if let Some(version) = api_version { - builder = match service.set_api_version_headers(builder, version) { - Ok(builder) => builder, + let mut headers = HeaderMap::new(); + match service.set_api_version_headers(&mut headers, version) { + Ok(()) => builder = builder.headers(headers), Err(err) => return future::err(err), } }