Skip to content
This repository has been archived by the owner on Aug 3, 2023. It is now read-only.

[dev] Handle response headers #886

Merged
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 33 additions & 8 deletions src/commands/dev/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@ use chrono::prelude::*;
use hyper::client::{HttpConnector, ResponseFuture};
use hyper::header::{HeaderMap, HeaderName, HeaderValue};
use hyper::service::{make_service_fn, service_fn};
use hyper::{Body, Client, Request, Server, Uri};
use hyper::{Body, Client, Request, Response, Server, Uri};
use hyper::http::response::Parts;
use hyper::http::uri::InvalidUri;

use hyper_tls::HttpsConnector;
Expand All @@ -22,6 +23,7 @@ use crate::settings::toml::Target;
use crate::terminal::emoji;

const PREVIEW_HOST: &str = "rawhttp.cloudflareworkers.com";
const HEADER_PREFIX: &str = "cf-ew-raw-";
EverlastingBugstopper marked this conversation as resolved.
Show resolved Hide resolved

pub async fn dev(
target: Target,
Expand All @@ -47,12 +49,19 @@ pub async fn dev(
let server_config = server_config.clone();
async move {
Ok::<_, failure::Error>(service_fn(move |req| {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i think this closure deserves to either be a well named function in its own right, or to have a comment above.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i don't think i can do that since hyper doesn't re-export the type MakeServiceFn from what I can tell. i've simplified the closure as much as i can by pulling some if it out into a separate function though

preview_request(
req,
client.to_owned(),
preview_id.to_owned(),
server_config.clone(),
)
let client = client.to_owned();
let preview_id = preview_id.to_owned();
let server_config = server_config.clone();
async move {
let resp = preview_request(req, client, preview_id, server_config).await?;
EverlastingBugstopper marked this conversation as resolved.
Show resolved Hide resolved

let (mut parts, body) = resp.into_parts();

munge_response_headers(&mut parts)?;

let resp = Response::from_parts(parts, body);
Ok::<_, failure::Error>(resp)
}
}))
}
});
Expand All @@ -65,6 +74,22 @@ pub async fn dev(
Ok(())
}

fn munge_response_headers(parts: &mut Parts) -> Result<(), failure::Error> {
let mut headers = HeaderMap::new();

for header in &parts.headers {
let (name, value) = header;
let name = name.as_str();
if name.starts_with(HEADER_PREFIX) {
let header_name = &name[HEADER_PREFIX.len()..];
let header_name = HeaderName::from_bytes(header_name.as_bytes())?;
headers.insert(header_name, value.clone());
}
}
parts.headers = headers;
Ok(())
}

fn get_preview_url(path_string: &str) -> Result<Uri, InvalidUri> {
format!("https://{}{}", PREVIEW_HOST, path_string).parse()
}
Expand Down Expand Up @@ -93,7 +118,7 @@ fn preview_request(

for header in &parts.headers {
let (name, value) = header;
let forward_header = format!("cf-ew-raw-{}", name);
let forward_header = format!("{}{}", HEADER_PREFIX, name);
// TODO: remove unwrap
let header_name = HeaderName::from_bytes(forward_header.as_bytes()).unwrap();
headers.insert(header_name, value.clone());
Expand Down