fn from()

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
            }
        }
    }