mirror of
https://github.com/actix/examples
synced 2025-02-25 18:42:50 +01:00
Merge pull request #186 from actix/proxy-whole-body
Always send body whole and don't use transfer encoding
This commit is contained in:
commit
dc6e1cc762
@ -1,13 +1,14 @@
|
|||||||
use actix_web::client::Client;
|
use actix_web::client::Client;
|
||||||
use actix_web::{middleware, web, App, Error, HttpRequest, HttpResponse, HttpServer};
|
use actix_web::{middleware, web, App, Error, HttpRequest, HttpResponse, HttpServer};
|
||||||
use clap::{value_t, Arg};
|
use clap::{value_t, Arg};
|
||||||
|
use futures::stream::Stream;
|
||||||
use futures::Future;
|
use futures::Future;
|
||||||
use std::net::ToSocketAddrs;
|
use std::net::ToSocketAddrs;
|
||||||
use url::Url;
|
use url::Url;
|
||||||
|
|
||||||
fn forward(
|
fn forward(
|
||||||
req: HttpRequest,
|
req: HttpRequest,
|
||||||
payload: web::Payload,
|
body: web::Bytes,
|
||||||
url: web::Data<Url>,
|
url: web::Data<Url>,
|
||||||
client: web::Data<Client>,
|
client: web::Data<Client>,
|
||||||
) -> impl Future<Item = HttpResponse, Error = Error> {
|
) -> impl Future<Item = HttpResponse, Error = Error> {
|
||||||
@ -15,6 +16,8 @@ fn forward(
|
|||||||
new_url.set_path(req.uri().path());
|
new_url.set_path(req.uri().path());
|
||||||
new_url.set_query(req.uri().query());
|
new_url.set_query(req.uri().query());
|
||||||
|
|
||||||
|
// TODO: This forwarded implementation is incomplete as it only handles the inofficial
|
||||||
|
// X-Forwarded-For header but not the official Forwarded one.
|
||||||
let forwarded_req = client
|
let forwarded_req = client
|
||||||
.request_from(new_url.as_str(), req.head())
|
.request_from(new_url.as_str(), req.head())
|
||||||
.no_decompress();
|
.no_decompress();
|
||||||
@ -25,19 +28,24 @@ fn forward(
|
|||||||
};
|
};
|
||||||
|
|
||||||
forwarded_req
|
forwarded_req
|
||||||
.send_stream(payload)
|
.send_body(body)
|
||||||
.map_err(Error::from)
|
.map_err(Error::from)
|
||||||
.map(|res| {
|
.map(|mut res| {
|
||||||
let mut client_resp = HttpResponse::build(res.status());
|
let mut client_resp = HttpResponse::build(res.status());
|
||||||
for (header_name, header_value) in res
|
// Remove `Connection` as per
|
||||||
.headers()
|
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Connection#Directives
|
||||||
.iter()
|
for (header_name, header_value) in
|
||||||
.filter(|(h, _)| *h != "connection" && *h != "content-length")
|
res.headers().iter().filter(|(h, _)| *h != "connection")
|
||||||
{
|
{
|
||||||
client_resp.header(header_name.clone(), header_value.clone());
|
client_resp.header(header_name.clone(), header_value.clone());
|
||||||
}
|
}
|
||||||
client_resp.streaming(res)
|
res.body()
|
||||||
|
.into_stream()
|
||||||
|
.concat2()
|
||||||
|
.map(move |b| client_resp.body(b))
|
||||||
|
.map_err(|e| e.into())
|
||||||
})
|
})
|
||||||
|
.flatten()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() -> std::io::Result<()> {
|
fn main() -> std::io::Result<()> {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user