Skip to content

Commit be09f8a

Browse files
authored
[Rust Server] Use swagger/multipart_related support (#19354)
* [Rust Server] Use swagger/multipart_related support * Update samples
1 parent 38ebf0b commit be09f8a

7 files changed

Lines changed: 24 additions & 81 deletions

File tree

modules/openapi-generator/src/main/resources/rust-server/Cargo.mustache

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ client = [
4141
"multipart", "multipart/client", "swagger/multipart_form",
4242
{{/apiUsesMultipartFormData}}
4343
{{#apiUsesMultipartRelated}}
44-
"hyper_0_10", "mime_multipart",
44+
"hyper_0_10", "mime_multipart", "swagger/multipart_related",
4545
{{/apiUsesMultipartRelated}}
4646
{{#usesUrlEncodedForm}}
4747
"serde_urlencoded",
@@ -60,7 +60,7 @@ server = [
6060
"multipart", "multipart/server", "swagger/multipart_form",
6161
{{/apiUsesMultipartFormData}}
6262
{{#apiUsesMultipartRelated}}
63-
"hyper_0_10", "mime_multipart",
63+
"hyper_0_10", "mime_multipart", "swagger/multipart_related",
6464
{{/apiUsesMultipartRelated}}
6565
{{#hasCallbacks}}
6666
"native-tls", "hyper-openssl", "hyper-tls", "openssl",

modules/openapi-generator/src/main/resources/rust-server/client-imports.mustache

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ use multipart::client::lazy::Multipart;
2626
{{/apiUsesMultipartFormData}}
2727
{{#apiUsesMultipartRelated}}
2828
use hyper_0_10::header::{Headers, ContentType};
29-
use mime_multipart::{Node, Part, generate_boundary, write_multipart};
29+
use mime_multipart::{Node, Part, write_multipart};
3030
{{/apiUsesMultipartRelated}}
3131

3232
use crate::models;

modules/openapi-generator/src/main/resources/rust-server/generate-multipart-related.mustache

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,5 @@
11
{{#-first}}
2-
// Construct the Body for a multipart/related request. The mime 0.2.6 library
3-
// does not parse quoted-string parameters correctly. The boundary doesn't
4-
// need to be a quoted string if it does not contain a '/', hence ensure
5-
// no such boundary is used.
6-
let mut boundary = generate_boundary();
7-
for b in boundary.iter_mut() {
8-
if b == &(b'/') {
9-
*b = b'=';
10-
}
11-
}
2+
let boundary = swagger::multipart::related::generate_boundary();
123
let mut body_parts = vec![];
134

145
{{/-first}}

modules/openapi-generator/src/main/resources/rust-server/server-request-body-multipart-related.mustache

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,19 @@
11
// Get multipart chunks.
22

3-
// Extract the top-level content type header.
4-
let content_type_mime = headers
5-
.get(CONTENT_TYPE)
6-
.ok_or_else(|| "Missing content-type header".to_string())
7-
.and_then(|v| v.to_str().map_err(|e| format!("Couldn't read content-type header value for {{operationId}}: {}", e)))
8-
.and_then(|v| v.parse::<Mime2>().map_err(|_e| "Couldn't parse content-type header value for {{operationId}}".to_string()));
9-
10-
// Insert top-level content type header into a Headers object.
11-
let mut multi_part_headers = Headers::new();
12-
match content_type_mime {
13-
Ok(content_type_mime) => {
14-
multi_part_headers.set(ContentType(content_type_mime));
15-
},
3+
// Create headers from top-level content type header.
4+
let multipart_headers = match swagger::multipart::related::create_multipart_headers(headers.get(CONTENT_TYPE)) {
5+
Ok(headers) => headers,
166
Err(e) => {
177
return Ok(Response::builder()
188
.status(StatusCode::BAD_REQUEST)
199
.body(Body::from(e))
2010
.expect("Unable to create Bad Request response due to unable to read content-type header for {{operationId}}"));
2111
}
22-
}
12+
};
2313

2414
// &*body expresses the body as a byteslice, &mut provides a
2515
// mutable reference to that byteslice.
26-
let nodes = match read_multipart_body(&mut&*body, &multi_part_headers, false) {
16+
let nodes = match read_multipart_body(&mut&*body, &multipart_headers, false) {
2717
Ok(nodes) => nodes,
2818
Err(e) => {
2919
return Ok(Response::builder()

samples/server/petstore/rust-server/output/multipart-v3/Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,13 @@ default = ["client", "server"]
1212
client = [
1313
"mime_0_2",
1414
"multipart", "multipart/client", "swagger/multipart_form",
15-
"hyper_0_10", "mime_multipart",
15+
"hyper_0_10", "mime_multipart", "swagger/multipart_related",
1616
"hyper", "hyper-openssl", "hyper-tls", "native-tls", "openssl", "url"
1717
]
1818
server = [
1919
"mime_0_2",
2020
"multipart", "multipart/server", "swagger/multipart_form",
21-
"hyper_0_10", "mime_multipart",
21+
"hyper_0_10", "mime_multipart", "swagger/multipart_related",
2222
"serde_ignored", "hyper", "regex", "percent-encoding", "url", "lazy_static"
2323
]
2424
conversion = ["frunk", "frunk_derives", "frunk_core", "frunk-enum-core", "frunk-enum-derive"]

samples/server/petstore/rust-server/output/multipart-v3/src/client/mod.rs

Lines changed: 3 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ use mime::Mime;
2323
use std::io::Cursor;
2424
use multipart::client::lazy::Multipart;
2525
use hyper_0_10::header::{Headers, ContentType};
26-
use mime_multipart::{Node, Part, generate_boundary, write_multipart};
26+
use mime_multipart::{Node, Part, write_multipart};
2727

2828
use crate::models;
2929
use crate::header;
@@ -424,16 +424,7 @@ impl<S, C> Api<C> for Client<S, C> where
424424
};
425425

426426
// Consumes multipart/related body
427-
// Construct the Body for a multipart/related request. The mime 0.2.6 library
428-
// does not parse quoted-string parameters correctly. The boundary doesn't
429-
// need to be a quoted string if it does not contain a '/', hence ensure
430-
// no such boundary is used.
431-
let mut boundary = generate_boundary();
432-
for b in boundary.iter_mut() {
433-
if b == &(b'/') {
434-
*b = b'=';
435-
}
436-
}
427+
let boundary = swagger::multipart::related::generate_boundary();
437428
let mut body_parts = vec![];
438429

439430
if let Some(object_field) = param_object_field {
@@ -720,16 +711,7 @@ impl<S, C> Api<C> for Client<S, C> where
720711
};
721712

722713
// Consumes multipart/related body
723-
// Construct the Body for a multipart/related request. The mime 0.2.6 library
724-
// does not parse quoted-string parameters correctly. The boundary doesn't
725-
// need to be a quoted string if it does not contain a '/', hence ensure
726-
// no such boundary is used.
727-
let mut boundary = generate_boundary();
728-
for b in boundary.iter_mut() {
729-
if b == &(b'/') {
730-
*b = b'=';
731-
}
732-
}
714+
let boundary = swagger::multipart::related::generate_boundary();
733715
let mut body_parts = vec![];
734716

735717
if let Some(binary1) = param_binary1 {

samples/server/petstore/rust-server/output/multipart-v3/src/server/mod.rs

Lines changed: 10 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -164,30 +164,20 @@ impl<T, C> hyper::service::Service<(Request<Body>, C)> for Service<T, C> where
164164
let mut unused_elements : Vec<String> = vec![];
165165
// Get multipart chunks.
166166

167-
// Extract the top-level content type header.
168-
let content_type_mime = headers
169-
.get(CONTENT_TYPE)
170-
.ok_or_else(|| "Missing content-type header".to_string())
171-
.and_then(|v| v.to_str().map_err(|e| format!("Couldn't read content-type header value for MultipartRelatedRequestPost: {}", e)))
172-
.and_then(|v| v.parse::<Mime2>().map_err(|_e| "Couldn't parse content-type header value for MultipartRelatedRequestPost".to_string()));
173-
174-
// Insert top-level content type header into a Headers object.
175-
let mut multi_part_headers = Headers::new();
176-
match content_type_mime {
177-
Ok(content_type_mime) => {
178-
multi_part_headers.set(ContentType(content_type_mime));
179-
},
167+
// Create headers from top-level content type header.
168+
let multipart_headers = match swagger::multipart::related::create_multipart_headers(headers.get(CONTENT_TYPE)) {
169+
Ok(headers) => headers,
180170
Err(e) => {
181171
return Ok(Response::builder()
182172
.status(StatusCode::BAD_REQUEST)
183173
.body(Body::from(e))
184174
.expect("Unable to create Bad Request response due to unable to read content-type header for MultipartRelatedRequestPost"));
185175
}
186-
}
176+
};
187177

188178
// &*body expresses the body as a byteslice, &mut provides a
189179
// mutable reference to that byteslice.
190-
let nodes = match read_multipart_body(&mut&*body, &multi_part_headers, false) {
180+
let nodes = match read_multipart_body(&mut&*body, &multipart_headers, false) {
191181
Ok(nodes) => nodes,
192182
Err(e) => {
193183
return Ok(Response::builder()
@@ -465,30 +455,20 @@ impl<T, C> hyper::service::Service<(Request<Body>, C)> for Service<T, C> where
465455
let mut unused_elements : Vec<String> = vec![];
466456
// Get multipart chunks.
467457

468-
// Extract the top-level content type header.
469-
let content_type_mime = headers
470-
.get(CONTENT_TYPE)
471-
.ok_or_else(|| "Missing content-type header".to_string())
472-
.and_then(|v| v.to_str().map_err(|e| format!("Couldn't read content-type header value for MultipleIdenticalMimeTypesPost: {}", e)))
473-
.and_then(|v| v.parse::<Mime2>().map_err(|_e| "Couldn't parse content-type header value for MultipleIdenticalMimeTypesPost".to_string()));
474-
475-
// Insert top-level content type header into a Headers object.
476-
let mut multi_part_headers = Headers::new();
477-
match content_type_mime {
478-
Ok(content_type_mime) => {
479-
multi_part_headers.set(ContentType(content_type_mime));
480-
},
458+
// Create headers from top-level content type header.
459+
let multipart_headers = match swagger::multipart::related::create_multipart_headers(headers.get(CONTENT_TYPE)) {
460+
Ok(headers) => headers,
481461
Err(e) => {
482462
return Ok(Response::builder()
483463
.status(StatusCode::BAD_REQUEST)
484464
.body(Body::from(e))
485465
.expect("Unable to create Bad Request response due to unable to read content-type header for MultipleIdenticalMimeTypesPost"));
486466
}
487-
}
467+
};
488468

489469
// &*body expresses the body as a byteslice, &mut provides a
490470
// mutable reference to that byteslice.
491-
let nodes = match read_multipart_body(&mut&*body, &multi_part_headers, false) {
471+
let nodes = match read_multipart_body(&mut&*body, &multipart_headers, false) {
492472
Ok(nodes) => nodes,
493473
Err(e) => {
494474
return Ok(Response::builder()

0 commit comments

Comments
 (0)