1use super::Body;
2use super::Multipart;
3use super::OrderedQs;
4
5use crate::HttpRequest;
6use crate::auth::Credentials;
7use crate::path::S3Path;
8use crate::post_policy::PostPolicy;
9use crate::protocol::TrailingHeaders;
10use crate::region::Region;
11use crate::stream::VecByteStream;
12
13use hyper::HeaderMap;
14use hyper::Method;
15use hyper::Uri;
16use hyper::http::Extensions;
17
18pub struct Request {
19 pub version: http::Version,
20 pub method: Method,
21 pub uri: Uri,
22 pub headers: HeaderMap,
23 pub extensions: Extensions,
24 pub body: Body,
25 pub(crate) s3ext: S3Extensions,
26}
27
28#[derive(Default)]
29pub(crate) struct S3Extensions {
30 pub s3_path: Option<S3Path>,
31 pub qs: Option<OrderedQs>,
32
33 pub multipart: Option<Multipart>,
34 pub vec_stream: Option<VecByteStream>,
35
36 pub credentials: Option<Credentials>,
37 pub region: Option<Region>,
38 pub service: Option<String>,
39 pub trailing_headers: Option<TrailingHeaders>,
40
41 pub post_policy: Option<PostPolicy>,
42}
43
44impl From<HttpRequest> for Request {
45 fn from(req: HttpRequest) -> Self {
46 let (parts, body) = req.into_parts();
47 Self {
48 version: parts.version,
49 method: parts.method,
50 uri: parts.uri,
51 headers: parts.headers,
52 extensions: parts.extensions,
53 body,
54 s3ext: S3Extensions::default(),
55 }
56 }
57}