in lambda-http/src/request.rs [386:595]
fn from(value: LambdaRequest<'_>) -> Self {
match value {
LambdaRequest::ApiGatewayV2 {
raw_path,
raw_query_string,
mut headers,
query_string_parameters,
path_parameters,
stage_variables,
body,
is_base64_encoded,
request_context,
cookies,
..
} => {
if let Some(cookies) = cookies {
if let Ok(header_value) = http::header::HeaderValue::from_str(&cookies.join(";")) {
headers.append(http::header::COOKIE, header_value);
}
}
let builder = http::Request::builder()
.method(request_context.http.method.as_ref())
.uri({
let mut url = format!(
"{}://{}{}",
headers
.get("X-Forwarded-Proto")
.and_then(|val| val.to_str().ok())
.unwrap_or("https"),
headers
.get(http::header::HOST)
.and_then(|val| val.to_str().ok())
.unwrap_or_else(|| request_context.domain_name.as_ref()),
raw_path
);
if !raw_query_string.is_empty() {
url.push('?');
url.push_str(raw_query_string.as_ref());
}
url
})
.extension(QueryStringParameters(query_string_parameters))
.extension(PathParameters(path_parameters))
.extension(StageVariables(stage_variables))
.extension(RequestContext::ApiGatewayV2(request_context));
let mut req = builder
.body(body.map_or_else(Body::default, |b| Body::from_maybe_encoded(is_base64_encoded, b)))
.expect("failed to build request");
// no builder method that sets headers in batch
let _ = mem::replace(req.headers_mut(), headers);
req
}
LambdaRequest::ApiGateway {
path,
http_method,
headers,
mut multi_value_headers,
query_string_parameters,
multi_value_query_string_parameters,
path_parameters,
stage_variables,
body,
is_base64_encoded,
request_context,
resource: _,
} => {
let builder = http::Request::builder()
.method(http_method)
.uri({
let host = headers.get(http::header::HOST).and_then(|val| val.to_str().ok());
let mut uri = match host {
Some(host) => {
format!(
"{}://{}{}",
headers
.get("X-Forwarded-Proto")
.and_then(|val| val.to_str().ok())
.unwrap_or("https"),
host,
path
)
}
None => path.to_string(),
};
if !multi_value_query_string_parameters.is_empty() {
uri.push('?');
uri.push_str(multi_value_query_string_parameters.to_query_string().as_str());
} else if !query_string_parameters.is_empty() {
uri.push('?');
uri.push_str(query_string_parameters.to_query_string().as_str());
}
uri
})
// multi-valued query string parameters are always a super
// set of singly valued query string parameters,
// when present, multi-valued query string parameters are preferred
.extension(QueryStringParameters(
if multi_value_query_string_parameters.is_empty() {
query_string_parameters
} else {
multi_value_query_string_parameters
},
))
.extension(PathParameters(path_parameters))
.extension(StageVariables(stage_variables))
.extension(RequestContext::ApiGateway(request_context));
let mut req = builder
.body(body.map_or_else(Body::default, |b| Body::from_maybe_encoded(is_base64_encoded, b)))
.expect("failed to build request");
// merge headers into multi_value_headers and make
// multi-value_headers our cannoncial source of request headers
for (key, value) in headers {
// see HeaderMap#into_iter() docs for cases when key element may be None
if let Some(first_key) = key {
// if it contains the key, avoid appending a duplicate value
if !multi_value_headers.contains_key(&first_key) {
multi_value_headers.append(first_key, value);
}
}
}
// no builder method that sets headers in batch
let _ = mem::replace(req.headers_mut(), multi_value_headers);
req
}
LambdaRequest::Alb {
path,
http_method,
headers,
mut multi_value_headers,
query_string_parameters,
multi_value_query_string_parameters,
body,
is_base64_encoded,
request_context,
} => {
// build an http::Request<lambda_http::Body> from a lambda_http::LambdaRequest
let builder = http::Request::builder()
.method(http_method)
.uri({
let host = headers.get(http::header::HOST).and_then(|val| val.to_str().ok());
let mut uri = match host {
Some(host) => {
format!(
"{}://{}{}",
headers
.get("X-Forwarded-Proto")
.and_then(|val| val.to_str().ok())
.unwrap_or("https"),
host,
path
)
}
None => path.to_string(),
};
if !multi_value_query_string_parameters.is_empty() {
uri.push('?');
uri.push_str(multi_value_query_string_parameters.to_query_string().as_str());
} else if !query_string_parameters.is_empty() {
uri.push('?');
uri.push_str(query_string_parameters.to_query_string().as_str());
}
uri
})
// multi valued query string parameters are always a super
// set of singly valued query string parameters,
// when present, multi-valued query string parameters are preferred
.extension(QueryStringParameters(
if multi_value_query_string_parameters.is_empty() {
query_string_parameters
} else {
multi_value_query_string_parameters
},
))
.extension(RequestContext::Alb(request_context));
let mut req = builder
.body(body.map_or_else(Body::default, |b| Body::from_maybe_encoded(is_base64_encoded, b)))
.expect("failed to build request");
// merge headers into multi_value_headers and make
// multi-value_headers our cannoncial source of request headers
for (key, value) in headers {
// see HeaderMap#into_iter() docs for cases when key element may be None
if let Some(first_key) = key {
// if it contains the key, avoid appending a duplicate value
if !multi_value_headers.contains_key(&first_key) {
multi_value_headers.append(first_key, value);
}
}
}
// no builder method that sets headers in batch
let _ = mem::replace(req.headers_mut(), multi_value_headers);
req
}
}
}