Skip to content

Commit

Permalink
feat(services): change set_api_version_headers to accept HeaderMap
Browse files Browse the repository at this point in the history
  • Loading branch information
dtantsur committed Apr 6, 2019
1 parent bfae8c6 commit b6edf6b
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 9 deletions.
7 changes: 7 additions & 0 deletions src/apiversion.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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};

Expand All @@ -38,6 +39,12 @@ fn parse_component(component: &str, message: &str) -> Result<u16, Error> {
.map_err(|_| Error::new(ErrorKind::InvalidResponse, message))
}

impl From<ApiVersion> for HeaderValue {
fn from(value: ApiVersion) -> HeaderValue {
value.to_string().parse().unwrap()
}
}

impl FromStr for ApiVersion {
type Err = Error;

Expand Down
15 changes: 8 additions & 7 deletions src/services.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@

//! OpenStack service types.

use reqwest::r#async::RequestBuilder;
use reqwest::header::HeaderMap;

use super::{ApiVersion, Error, ErrorKind};

Expand All @@ -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<RequestBuilder, Error> {
) -> Result<(), Error> {
Err(Error::new(
ErrorKind::IncompatibleApiVersion,
format!(
Expand Down Expand Up @@ -124,11 +124,12 @@ impl ServiceType for ComputeService {

fn set_api_version_headers(
&self,
request: RequestBuilder,
headers: &mut HeaderMap,
version: ApiVersion,
) -> Result<RequestBuilder, Error> {
) -> 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(())
}
}

Expand Down
6 changes: 4 additions & 2 deletions src/session.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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),
}
}
Expand Down

0 comments on commit b6edf6b

Please sign in to comment.