From 79d11d7129f63d87e8d1cfa282a8b6a7b170462b Mon Sep 17 00:00:00 2001 From: Richard Whitehouse Date: Sun, 5 Jan 2020 14:46:09 +0000 Subject: [PATCH] [Rust Server] Fix panic handling headers (#4877) [Rust Server] Fix panic handling headers If we have an API which has multiple auth types, we may panic. This is because in Hyper 0.11, the following code will panic: ``` use hyper::header::{Authorization, Basic, Bearer, Headers}; fn main() { let mut headers = Headers::default(); let basic = Basic { username: "richard".to_string(), password: None }; headers.set::>(Authorization(basic)); println!("Auth: {:?}", headers.get::>()); } ``` as it mixes up an `Authorization` and `Authorization` as both have `Authorization:` as the header name. This is fixed by using `swagger::SafeHeaders` added in https://github.com/Metaswitch/swagger-rs/pull/90 --- .../main/resources/rust-server/Cargo.mustache | 2 +- .../resources/rust-server/client-mod.mustache | 4 +++- .../rust-server/server-context.mustache | 7 ++++--- .../resources/rust-server/server-mod.mustache | 13 +++++++------ .../rust-server/output/multipart-v3/Cargo.toml | 2 +- .../output/multipart-v3/src/client/mod.rs | 2 ++ .../output/multipart-v3/src/server/context.rs | 1 + .../output/multipart-v3/src/server/mod.rs | 11 ++++++----- .../rust-server/output/openapi-v3/Cargo.toml | 2 +- .../output/openapi-v3/src/client/mod.rs | 8 +++++--- .../output/openapi-v3/src/server/context.rs | 3 ++- .../output/openapi-v3/src/server/mod.rs | 1 + .../rust-server/output/ops-v3/Cargo.toml | 2 +- .../rust-server/output/ops-v3/src/client/mod.rs | 2 ++ .../output/ops-v3/src/server/context.rs | 1 + .../rust-server/output/ops-v3/src/server/mod.rs | 1 + .../Cargo.toml | 2 +- .../src/client/mod.rs | 6 ++++-- .../src/server/context.rs | 7 ++++--- .../src/server/mod.rs | 17 +++++++++-------- .../output/rust-server-test/Cargo.toml | 2 +- .../output/rust-server-test/src/client/mod.rs | 2 ++ .../rust-server-test/src/server/context.rs | 1 + .../output/rust-server-test/src/server/mod.rs | 1 + 24 files changed, 62 insertions(+), 38 deletions(-) diff --git a/modules/openapi-generator/src/main/resources/rust-server/Cargo.mustache b/modules/openapi-generator/src/main/resources/rust-server/Cargo.mustache index cd5ba4fab6e..5b03cf9d69d 100644 --- a/modules/openapi-generator/src/main/resources/rust-server/Cargo.mustache +++ b/modules/openapi-generator/src/main/resources/rust-server/Cargo.mustache @@ -17,7 +17,7 @@ conversion = ["frunk", "frunk_derives", "frunk_core", "frunk-enum-core", "frunk- # Common chrono = { version = "0.4", features = ["serde"] } futures = "0.1" -swagger = "2" +swagger = "2.2" lazy_static = "1.4" log = "0.3.0" mime = "0.2.6" diff --git a/modules/openapi-generator/src/main/resources/rust-server/client-mod.mustache b/modules/openapi-generator/src/main/resources/rust-server/client-mod.mustache index bd0f3af3e01..f6176fc5bd4 100644 --- a/modules/openapi-generator/src/main/resources/rust-server/client-mod.mustache +++ b/modules/openapi-generator/src/main/resources/rust-server/client-mod.mustache @@ -33,6 +33,8 @@ use std::sync::Arc; use std::str; use std::str::FromStr; use std::string::ToString; +use swagger::headers::SafeHeaders; + {{#apiUsesMultipart}} use hyper::mime::Mime; use std::io::Cursor; @@ -478,7 +480,7 @@ impl Api for Client where {{#responses}} {{{code}}} => { {{#headers}} header! { (Response{{{nameInCamelCase}}}, "{{{baseName}}}") => [{{{datatype}}}] } - let response_{{{name}}} = match response.headers().get::() { + let response_{{{name}}} = match response.headers().safe_get::() { Some(response_{{{name}}}) => response_{{{name}}}.0.clone(), None => return Box::new(future::err(ApiError(String::from("Required response header {{{baseName}}} for response {{{code}}} was not found.")))) as Box>, }; diff --git a/modules/openapi-generator/src/main/resources/rust-server/server-context.mustache b/modules/openapi-generator/src/main/resources/rust-server/server-context.mustache index 75b37a63089..103442c5eab 100644 --- a/modules/openapi-generator/src/main/resources/rust-server/server-context.mustache +++ b/modules/openapi-generator/src/main/resources/rust-server/server-context.mustache @@ -6,6 +6,7 @@ use hyper::{Request, Response, Error, StatusCode}; use server::url::form_urlencoded; use swagger::auth::{Authorization, AuthData, Scopes}; use swagger::{Has, Pop, Push, XSpanIdString}; +use swagger::headers::SafeHeaders; use Api; pub struct NewAddContext @@ -88,7 +89,7 @@ impl hyper::server::Service for AddContext { use hyper::header::{Authorization as HyperAuth, Basic, Bearer}; use std::ops::Deref; - if let Some(basic) = req.headers().get::>().cloned() { + if let Some(basic) = req.headers().safe_get::>() { let auth_data = AuthData::Basic(basic.deref().clone()); let context = context.push(Some(auth_data)); let context = context.push(None::); @@ -100,7 +101,7 @@ impl hyper::server::Service for AddContext { use hyper::header::{Authorization as HyperAuth, Basic, Bearer}; use std::ops::Deref; - if let Some(bearer) = req.headers().get::>().cloned() { + if let Some(bearer) = req.headers().safe_get::>() { let auth_data = AuthData::Bearer(bearer.deref().clone()); let context = context.push(Some(auth_data)); let context = context.push(None::); @@ -112,7 +113,7 @@ impl hyper::server::Service for AddContext {{#isKeyInHeader}} { header! { (ApiKey{{-index}}, "{{{keyParamName}}}") => [String] } - if let Some(header) = req.headers().get::().cloned() { + if let Some(header) = req.headers().safe_get::() { let auth_data = AuthData::ApiKey(header.0); let context = context.push(Some(auth_data)); let context = context.push(None::); diff --git a/modules/openapi-generator/src/main/resources/rust-server/server-mod.mustache b/modules/openapi-generator/src/main/resources/rust-server/server-mod.mustache index 060b64422b7..591609bbbe0 100644 --- a/modules/openapi-generator/src/main/resources/rust-server/server-mod.mustache +++ b/modules/openapi-generator/src/main/resources/rust-server/server-mod.mustache @@ -45,6 +45,7 @@ use std::collections::BTreeSet; pub use swagger::auth::Authorization; use swagger::{ApiError, XSpanId, XSpanIdString, Has, RequestParser}; use swagger::auth::Scopes; +use swagger::headers::SafeHeaders; use {Api{{#apiInfo}}{{#apis}}{{#operations}}{{#operation}}, {{{operationId}}}Response{{/operation}}{{/operations}}{{/apis}}{{/apiInfo}} @@ -178,7 +179,7 @@ where {{#vendorExtensions}} {{#consumesMultipart}} let boundary = match multipart_boundary(&headers) { - Some(boundary) => boundary.to_string(), + Some(boundary) => boundary, None => return Box::new(future::ok(Response::new().with_status(StatusCode::BadRequest).with_body("Couldn't find valid multipart body"))), }; {{/consumesMultipart}} @@ -214,7 +215,7 @@ where }; {{/required}} {{^required}} - let param_{{{paramName}}} = headers.get::().map(|header| header.0.clone()); + let param_{{{paramName}}} = headers.safe_get::().map(|header| header.0.clone()); {{/required}} {{/headerParams}} {{#queryParams}} @@ -530,11 +531,11 @@ impl Clone for Service {{#apiUsesMultipart}} /// Utility function to get the multipart boundary marker (if any) from the Headers. -fn multipart_boundary<'a>(headers: &'a Headers) -> Option<&'a str> { - headers.get::().and_then(|content_type| { - let ContentType(ref mime) = *content_type; +fn multipart_boundary(headers: &Headers) -> Option { + headers.safe_get::().and_then(|content_type| { + let ContentType(mime) = content_type; if mime.type_() == hyper::mime::MULTIPART && mime.subtype() == hyper::mime::FORM_DATA { - mime.get_param(hyper::mime::BOUNDARY).map(|x| x.as_str()) + mime.get_param(hyper::mime::BOUNDARY).map(|x| x.as_str().to_string()) } else { None } diff --git a/samples/server/petstore/rust-server/output/multipart-v3/Cargo.toml b/samples/server/petstore/rust-server/output/multipart-v3/Cargo.toml index 7243310bec2..90110b3f1c9 100644 --- a/samples/server/petstore/rust-server/output/multipart-v3/Cargo.toml +++ b/samples/server/petstore/rust-server/output/multipart-v3/Cargo.toml @@ -15,7 +15,7 @@ conversion = ["frunk", "frunk_derives", "frunk_core", "frunk-enum-core", "frunk- # Common chrono = { version = "0.4", features = ["serde"] } futures = "0.1" -swagger = "2" +swagger = "2.2" lazy_static = "1.4" log = "0.3.0" mime = "0.2.6" diff --git a/samples/server/petstore/rust-server/output/multipart-v3/src/client/mod.rs b/samples/server/petstore/rust-server/output/multipart-v3/src/client/mod.rs index 22d89d8542b..45b69c85343 100644 --- a/samples/server/petstore/rust-server/output/multipart-v3/src/client/mod.rs +++ b/samples/server/petstore/rust-server/output/multipart-v3/src/client/mod.rs @@ -25,6 +25,8 @@ use std::sync::Arc; use std::str; use std::str::FromStr; use std::string::ToString; +use swagger::headers::SafeHeaders; + use hyper::mime::Mime; use std::io::Cursor; use client::multipart::client::lazy::Multipart; diff --git a/samples/server/petstore/rust-server/output/multipart-v3/src/server/context.rs b/samples/server/petstore/rust-server/output/multipart-v3/src/server/context.rs index 6f2900b3d70..e8fc8922e9a 100644 --- a/samples/server/petstore/rust-server/output/multipart-v3/src/server/context.rs +++ b/samples/server/petstore/rust-server/output/multipart-v3/src/server/context.rs @@ -6,6 +6,7 @@ use hyper::{Request, Response, Error, StatusCode}; use server::url::form_urlencoded; use swagger::auth::{Authorization, AuthData, Scopes}; use swagger::{Has, Pop, Push, XSpanIdString}; +use swagger::headers::SafeHeaders; use Api; pub struct NewAddContext diff --git a/samples/server/petstore/rust-server/output/multipart-v3/src/server/mod.rs b/samples/server/petstore/rust-server/output/multipart-v3/src/server/mod.rs index 4bd030b24d2..5748e1aa9bb 100644 --- a/samples/server/petstore/rust-server/output/multipart-v3/src/server/mod.rs +++ b/samples/server/petstore/rust-server/output/multipart-v3/src/server/mod.rs @@ -35,6 +35,7 @@ use std::collections::BTreeSet; pub use swagger::auth::Authorization; use swagger::{ApiError, XSpanId, XSpanIdString, Has, RequestParser}; use swagger::auth::Scopes; +use swagger::headers::SafeHeaders; use {Api, MultipartRequestPostResponse @@ -123,7 +124,7 @@ where // MultipartRequestPost - POST /multipart_request &hyper::Method::Post if path.matched(paths::ID_MULTIPART_REQUEST) => { let boundary = match multipart_boundary(&headers) { - Some(boundary) => boundary.to_string(), + Some(boundary) => boundary, None => return Box::new(future::ok(Response::new().with_status(StatusCode::BadRequest).with_body("Couldn't find valid multipart body"))), }; // Form Body parameters (note that non-required body parameters will ignore garbage @@ -250,11 +251,11 @@ impl Clone for Service } /// Utility function to get the multipart boundary marker (if any) from the Headers. -fn multipart_boundary<'a>(headers: &'a Headers) -> Option<&'a str> { - headers.get::().and_then(|content_type| { - let ContentType(ref mime) = *content_type; +fn multipart_boundary(headers: &Headers) -> Option { + headers.safe_get::().and_then(|content_type| { + let ContentType(mime) = content_type; if mime.type_() == hyper::mime::MULTIPART && mime.subtype() == hyper::mime::FORM_DATA { - mime.get_param(hyper::mime::BOUNDARY).map(|x| x.as_str()) + mime.get_param(hyper::mime::BOUNDARY).map(|x| x.as_str().to_string()) } else { None } diff --git a/samples/server/petstore/rust-server/output/openapi-v3/Cargo.toml b/samples/server/petstore/rust-server/output/openapi-v3/Cargo.toml index 846d7d087e1..38c09122130 100644 --- a/samples/server/petstore/rust-server/output/openapi-v3/Cargo.toml +++ b/samples/server/petstore/rust-server/output/openapi-v3/Cargo.toml @@ -15,7 +15,7 @@ conversion = ["frunk", "frunk_derives", "frunk_core", "frunk-enum-core", "frunk- # Common chrono = { version = "0.4", features = ["serde"] } futures = "0.1" -swagger = "2" +swagger = "2.2" lazy_static = "1.4" log = "0.3.0" mime = "0.2.6" diff --git a/samples/server/petstore/rust-server/output/openapi-v3/src/client/mod.rs b/samples/server/petstore/rust-server/output/openapi-v3/src/client/mod.rs index 1fce126e4ba..0301284ab1a 100644 --- a/samples/server/petstore/rust-server/output/openapi-v3/src/client/mod.rs +++ b/samples/server/petstore/rust-server/output/openapi-v3/src/client/mod.rs @@ -25,6 +25,8 @@ use std::sync::Arc; use std::str; use std::str::FromStr; use std::string::ToString; +use swagger::headers::SafeHeaders; + use mimetypes; use serde_json; use serde_xml_rs; @@ -675,7 +677,7 @@ impl Api for Client where match response.status().as_u16() { 200 => { header! { (ResponseSuccessInfo, "Success-Info") => [String] } - let response_success_info = match response.headers().get::() { + let response_success_info = match response.headers().safe_get::() { Some(response_success_info) => response_success_info.0.clone(), None => return Box::new(future::err(ApiError(String::from("Required response header Success-Info for response 200 was not found.")))) as Box>, }; @@ -699,12 +701,12 @@ impl Api for Client where }, 412 => { header! { (ResponseFurtherInfo, "Further-Info") => [String] } - let response_further_info = match response.headers().get::() { + let response_further_info = match response.headers().safe_get::() { Some(response_further_info) => response_further_info.0.clone(), None => return Box::new(future::err(ApiError(String::from("Required response header Further-Info for response 412 was not found.")))) as Box>, }; header! { (ResponseFailureInfo, "Failure-Info") => [String] } - let response_failure_info = match response.headers().get::() { + let response_failure_info = match response.headers().safe_get::() { Some(response_failure_info) => response_failure_info.0.clone(), None => return Box::new(future::err(ApiError(String::from("Required response header Failure-Info for response 412 was not found.")))) as Box>, }; diff --git a/samples/server/petstore/rust-server/output/openapi-v3/src/server/context.rs b/samples/server/petstore/rust-server/output/openapi-v3/src/server/context.rs index a377b535b62..3ec7a408253 100644 --- a/samples/server/petstore/rust-server/output/openapi-v3/src/server/context.rs +++ b/samples/server/petstore/rust-server/output/openapi-v3/src/server/context.rs @@ -6,6 +6,7 @@ use hyper::{Request, Response, Error, StatusCode}; use server::url::form_urlencoded; use swagger::auth::{Authorization, AuthData, Scopes}; use swagger::{Has, Pop, Push, XSpanIdString}; +use swagger::headers::SafeHeaders; use Api; pub struct NewAddContext @@ -86,7 +87,7 @@ impl hyper::server::Service for AddContext { use hyper::header::{Authorization as HyperAuth, Basic, Bearer}; use std::ops::Deref; - if let Some(bearer) = req.headers().get::>().cloned() { + if let Some(bearer) = req.headers().safe_get::>() { let auth_data = AuthData::Bearer(bearer.deref().clone()); let context = context.push(Some(auth_data)); let context = context.push(None::); diff --git a/samples/server/petstore/rust-server/output/openapi-v3/src/server/mod.rs b/samples/server/petstore/rust-server/output/openapi-v3/src/server/mod.rs index 4800083b061..9d667a26574 100644 --- a/samples/server/petstore/rust-server/output/openapi-v3/src/server/mod.rs +++ b/samples/server/petstore/rust-server/output/openapi-v3/src/server/mod.rs @@ -33,6 +33,7 @@ use std::collections::BTreeSet; pub use swagger::auth::Authorization; use swagger::{ApiError, XSpanId, XSpanIdString, Has, RequestParser}; use swagger::auth::Scopes; +use swagger::headers::SafeHeaders; use {Api, MultigetGetResponse, diff --git a/samples/server/petstore/rust-server/output/ops-v3/Cargo.toml b/samples/server/petstore/rust-server/output/ops-v3/Cargo.toml index 088555ff7ea..574d4eae560 100644 --- a/samples/server/petstore/rust-server/output/ops-v3/Cargo.toml +++ b/samples/server/petstore/rust-server/output/ops-v3/Cargo.toml @@ -15,7 +15,7 @@ conversion = ["frunk", "frunk_derives", "frunk_core", "frunk-enum-core", "frunk- # Common chrono = { version = "0.4", features = ["serde"] } futures = "0.1" -swagger = "2" +swagger = "2.2" lazy_static = "1.4" log = "0.3.0" mime = "0.2.6" diff --git a/samples/server/petstore/rust-server/output/ops-v3/src/client/mod.rs b/samples/server/petstore/rust-server/output/ops-v3/src/client/mod.rs index ecb62ede32f..f0e1bbe1bf7 100644 --- a/samples/server/petstore/rust-server/output/ops-v3/src/client/mod.rs +++ b/samples/server/petstore/rust-server/output/ops-v3/src/client/mod.rs @@ -24,6 +24,8 @@ use std::sync::Arc; use std::str; use std::str::FromStr; use std::string::ToString; +use swagger::headers::SafeHeaders; + use mimetypes; use serde_json; diff --git a/samples/server/petstore/rust-server/output/ops-v3/src/server/context.rs b/samples/server/petstore/rust-server/output/ops-v3/src/server/context.rs index 6f2900b3d70..e8fc8922e9a 100644 --- a/samples/server/petstore/rust-server/output/ops-v3/src/server/context.rs +++ b/samples/server/petstore/rust-server/output/ops-v3/src/server/context.rs @@ -6,6 +6,7 @@ use hyper::{Request, Response, Error, StatusCode}; use server::url::form_urlencoded; use swagger::auth::{Authorization, AuthData, Scopes}; use swagger::{Has, Pop, Push, XSpanIdString}; +use swagger::headers::SafeHeaders; use Api; pub struct NewAddContext diff --git a/samples/server/petstore/rust-server/output/ops-v3/src/server/mod.rs b/samples/server/petstore/rust-server/output/ops-v3/src/server/mod.rs index 7714591e7ca..5d8ed9eb4ea 100644 --- a/samples/server/petstore/rust-server/output/ops-v3/src/server/mod.rs +++ b/samples/server/petstore/rust-server/output/ops-v3/src/server/mod.rs @@ -31,6 +31,7 @@ use std::collections::BTreeSet; pub use swagger::auth::Authorization; use swagger::{ApiError, XSpanId, XSpanIdString, Has, RequestParser}; use swagger::auth::Scopes; +use swagger::headers::SafeHeaders; use {Api, Op10GetResponse, diff --git a/samples/server/petstore/rust-server/output/petstore-with-fake-endpoints-models-for-testing/Cargo.toml b/samples/server/petstore/rust-server/output/petstore-with-fake-endpoints-models-for-testing/Cargo.toml index 45332e7a07f..0a11b55054b 100644 --- a/samples/server/petstore/rust-server/output/petstore-with-fake-endpoints-models-for-testing/Cargo.toml +++ b/samples/server/petstore/rust-server/output/petstore-with-fake-endpoints-models-for-testing/Cargo.toml @@ -15,7 +15,7 @@ conversion = ["frunk", "frunk_derives", "frunk_core", "frunk-enum-core", "frunk- # Common chrono = { version = "0.4", features = ["serde"] } futures = "0.1" -swagger = "2" +swagger = "2.2" lazy_static = "1.4" log = "0.3.0" mime = "0.2.6" diff --git a/samples/server/petstore/rust-server/output/petstore-with-fake-endpoints-models-for-testing/src/client/mod.rs b/samples/server/petstore/rust-server/output/petstore-with-fake-endpoints-models-for-testing/src/client/mod.rs index 0684eae45e4..9976c76758b 100644 --- a/samples/server/petstore/rust-server/output/petstore-with-fake-endpoints-models-for-testing/src/client/mod.rs +++ b/samples/server/petstore/rust-server/output/petstore-with-fake-endpoints-models-for-testing/src/client/mod.rs @@ -27,6 +27,8 @@ use std::sync::Arc; use std::str; use std::str::FromStr; use std::string::ToString; +use swagger::headers::SafeHeaders; + use hyper::mime::Mime; use std::io::Cursor; use client::multipart::client::lazy::Multipart; @@ -2705,12 +2707,12 @@ impl Api for Client where match response.status().as_u16() { 200 => { header! { (ResponseXRateLimit, "X-Rate-Limit") => [i32] } - let response_x_rate_limit = match response.headers().get::() { + let response_x_rate_limit = match response.headers().safe_get::() { Some(response_x_rate_limit) => response_x_rate_limit.0.clone(), None => return Box::new(future::err(ApiError(String::from("Required response header X-Rate-Limit for response 200 was not found.")))) as Box>, }; header! { (ResponseXExpiresAfter, "X-Expires-After") => [chrono::DateTime] } - let response_x_expires_after = match response.headers().get::() { + let response_x_expires_after = match response.headers().safe_get::() { Some(response_x_expires_after) => response_x_expires_after.0.clone(), None => return Box::new(future::err(ApiError(String::from("Required response header X-Expires-After for response 200 was not found.")))) as Box>, }; diff --git a/samples/server/petstore/rust-server/output/petstore-with-fake-endpoints-models-for-testing/src/server/context.rs b/samples/server/petstore/rust-server/output/petstore-with-fake-endpoints-models-for-testing/src/server/context.rs index 010f21f45b0..a826bb5ca01 100644 --- a/samples/server/petstore/rust-server/output/petstore-with-fake-endpoints-models-for-testing/src/server/context.rs +++ b/samples/server/petstore/rust-server/output/petstore-with-fake-endpoints-models-for-testing/src/server/context.rs @@ -6,6 +6,7 @@ use hyper::{Request, Response, Error, StatusCode}; use server::url::form_urlencoded; use swagger::auth::{Authorization, AuthData, Scopes}; use swagger::{Has, Pop, Push, XSpanIdString}; +use swagger::headers::SafeHeaders; use Api; pub struct NewAddContext @@ -85,7 +86,7 @@ impl hyper::server::Service for AddContext { header! { (ApiKey1, "api_key") => [String] } - if let Some(header) = req.headers().get::().cloned() { + if let Some(header) = req.headers().safe_get::() { let auth_data = AuthData::ApiKey(header.0); let context = context.push(Some(auth_data)); let context = context.push(None::); @@ -107,7 +108,7 @@ impl hyper::server::Service for AddContext { use hyper::header::{Authorization as HyperAuth, Basic, Bearer}; use std::ops::Deref; - if let Some(basic) = req.headers().get::>().cloned() { + if let Some(basic) = req.headers().safe_get::>() { let auth_data = AuthData::Basic(basic.deref().clone()); let context = context.push(Some(auth_data)); let context = context.push(None::); @@ -117,7 +118,7 @@ impl hyper::server::Service for AddContext { use hyper::header::{Authorization as HyperAuth, Basic, Bearer}; use std::ops::Deref; - if let Some(bearer) = req.headers().get::>().cloned() { + if let Some(bearer) = req.headers().safe_get::>() { let auth_data = AuthData::Bearer(bearer.deref().clone()); let context = context.push(Some(auth_data)); let context = context.push(None::); diff --git a/samples/server/petstore/rust-server/output/petstore-with-fake-endpoints-models-for-testing/src/server/mod.rs b/samples/server/petstore/rust-server/output/petstore-with-fake-endpoints-models-for-testing/src/server/mod.rs index 3f3c511493e..79556f3ae9d 100644 --- a/samples/server/petstore/rust-server/output/petstore-with-fake-endpoints-models-for-testing/src/server/mod.rs +++ b/samples/server/petstore/rust-server/output/petstore-with-fake-endpoints-models-for-testing/src/server/mod.rs @@ -37,6 +37,7 @@ use std::collections::BTreeSet; pub use swagger::auth::Authorization; use swagger::{ApiError, XSpanId, XSpanIdString, Has, RequestParser}; use swagger::auth::Scopes; +use swagger::headers::SafeHeaders; use {Api, TestSpecialTagsResponse, @@ -752,9 +753,9 @@ where &hyper::Method::Get if path.matched(paths::ID_FAKE) => { // Header parameters header! { (RequestEnumHeaderStringArray, "enum_header_string_array") => (String)* } - let param_enum_header_string_array = headers.get::().map(|header| header.0.clone()); + let param_enum_header_string_array = headers.safe_get::().map(|header| header.0.clone()); header! { (RequestEnumHeaderString, "enum_header_string") => [String] } - let param_enum_header_string = headers.get::().map(|header| header.0.clone()); + let param_enum_header_string = headers.safe_get::().map(|header| header.0.clone()); // Query parameters (note that non-required or collection query parameters will ignore garbage values, rather than causing a 400 response) let query_params = form_urlencoded::parse(uri.query().unwrap_or_default().as_bytes()).collect::>(); let param_enum_query_string_array = query_params.iter().filter(|e| e.0 == "enum_query_string_array").map(|e| e.1.to_owned()) @@ -1132,7 +1133,7 @@ where }; // Header parameters header! { (RequestApiKey, "api_key") => [String] } - let param_api_key = headers.get::().map(|header| header.0.clone()); + let param_api_key = headers.safe_get::().map(|header| header.0.clone()); Box::new({ {{ Box::new(api_impl.delete_pet(param_pet_id, param_api_key, &context) @@ -1614,7 +1615,7 @@ where } } let boundary = match multipart_boundary(&headers) { - Some(boundary) => boundary.to_string(), + Some(boundary) => boundary, None => return Box::new(future::ok(Response::new().with_status(StatusCode::BadRequest).with_body("Couldn't find valid multipart body"))), }; // Path parameters @@ -2489,11 +2490,11 @@ impl Clone for Service } /// Utility function to get the multipart boundary marker (if any) from the Headers. -fn multipart_boundary<'a>(headers: &'a Headers) -> Option<&'a str> { - headers.get::().and_then(|content_type| { - let ContentType(ref mime) = *content_type; +fn multipart_boundary(headers: &Headers) -> Option { + headers.safe_get::().and_then(|content_type| { + let ContentType(mime) = content_type; if mime.type_() == hyper::mime::MULTIPART && mime.subtype() == hyper::mime::FORM_DATA { - mime.get_param(hyper::mime::BOUNDARY).map(|x| x.as_str()) + mime.get_param(hyper::mime::BOUNDARY).map(|x| x.as_str().to_string()) } else { None } diff --git a/samples/server/petstore/rust-server/output/rust-server-test/Cargo.toml b/samples/server/petstore/rust-server/output/rust-server-test/Cargo.toml index 789fbdc0e16..c239a281ba1 100644 --- a/samples/server/petstore/rust-server/output/rust-server-test/Cargo.toml +++ b/samples/server/petstore/rust-server/output/rust-server-test/Cargo.toml @@ -15,7 +15,7 @@ conversion = ["frunk", "frunk_derives", "frunk_core", "frunk-enum-core", "frunk- # Common chrono = { version = "0.4", features = ["serde"] } futures = "0.1" -swagger = "2" +swagger = "2.2" lazy_static = "1.4" log = "0.3.0" mime = "0.2.6" diff --git a/samples/server/petstore/rust-server/output/rust-server-test/src/client/mod.rs b/samples/server/petstore/rust-server/output/rust-server-test/src/client/mod.rs index 762cd4e4911..8df289aa972 100644 --- a/samples/server/petstore/rust-server/output/rust-server-test/src/client/mod.rs +++ b/samples/server/petstore/rust-server/output/rust-server-test/src/client/mod.rs @@ -24,6 +24,8 @@ use std::sync::Arc; use std::str; use std::str::FromStr; use std::string::ToString; +use swagger::headers::SafeHeaders; + use mimetypes; use serde_json; diff --git a/samples/server/petstore/rust-server/output/rust-server-test/src/server/context.rs b/samples/server/petstore/rust-server/output/rust-server-test/src/server/context.rs index 6f2900b3d70..e8fc8922e9a 100644 --- a/samples/server/petstore/rust-server/output/rust-server-test/src/server/context.rs +++ b/samples/server/petstore/rust-server/output/rust-server-test/src/server/context.rs @@ -6,6 +6,7 @@ use hyper::{Request, Response, Error, StatusCode}; use server::url::form_urlencoded; use swagger::auth::{Authorization, AuthData, Scopes}; use swagger::{Has, Pop, Push, XSpanIdString}; +use swagger::headers::SafeHeaders; use Api; pub struct NewAddContext diff --git a/samples/server/petstore/rust-server/output/rust-server-test/src/server/mod.rs b/samples/server/petstore/rust-server/output/rust-server-test/src/server/mod.rs index 93d21281284..0c173a4309e 100644 --- a/samples/server/petstore/rust-server/output/rust-server-test/src/server/mod.rs +++ b/samples/server/petstore/rust-server/output/rust-server-test/src/server/mod.rs @@ -31,6 +31,7 @@ use std::collections::BTreeSet; pub use swagger::auth::Authorization; use swagger::{ApiError, XSpanId, XSpanIdString, Has, RequestParser}; use swagger::auth::Scopes; +use swagger::headers::SafeHeaders; use {Api, DummyGetResponse,