-
-
Notifications
You must be signed in to change notification settings - Fork 1.7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
actix_web::client cannot use rust-tls for https #1045
Comments
I believe it works if the feature is turned on in the awc crate manually. It's missing here: Lines 65 to 69 in 61e492e
|
fixed in 1.0.6 |
Just got bitten by [1]: I am willing to open a PR to improve this. Where would you like this documented exactly? In your
In your use actix_web::client::Client;
#[actix_rt::main]
async fn main() {
let client = Client::default();
// Create request builder and send request
let response = client
.get("https://www.rust-lang.org") // <--- notice the "s" in "https://..."
.header("User-Agent", "Actix-web")
.send()
.await; // <- Send http request
println!("Response: {:?}", response);
} $ cargo run
Finished dev [unoptimized + debuginfo] target(s) in 0.12s
Running `target/debug/rust-http-playground`
Response: Ok(
ClientResponse HTTP/2.0 200 OK
headers:
"strict-transport-security": "max-age=63072000"
"x-amz-cf-id": "6gculLlBr5lYOjyFkFEErQpKKSY7w2xC70IvsL3ytGEk5HJoJMEMlQ=="
"x-cache": "Miss from cloudfront"
"x-xss-protection": "1; mode=block"
"x-content-type-options": "nosniff"
"via": "1.1 vegur, 1.1 77ffb7fa0ceed0e909a8f69baef40302.cloudfront.net (CloudFront)"
"x-amz-cf-pop": "NRT20-C4"
"content-security-policy": "default-src 'self'; frame-ancestors 'self'; img-src 'self' avatars.githubusercontent.com; frame-src 'self' player.vimeo.com"
"content-length": "19220"
"referrer-policy": "no-referrer, strict-origin-when-cross-origin"
"vary": "Accept-Encoding"
"server": "Rocket"
"content-type": "text/html; charset=utf-8"
"date": "Fri, 15 May 2020 07:32:08 GMT"
) |
Unfortunately doesn't work to me in actix-web 2.0:
Windows 10 x64 In actix-web 3.0.0-alpha2 I still get Same with "openssl" |
I had to use |
Sorry, I didn't get what do you mean. I need to configure something to make it work? |
@Pzixel I was able to configure https requests by following // src/main.rs
use actix_web::client::{Client, Connector};
use openssl::ssl::{SslConnector, SslMethod};
#[actix_rt::main]
async fn main() {
let builder = SslConnector::builder(SslMethod::tls()).unwrap();
let client = Client::build()
.connector(Connector::new().ssl(builder.build()).finish())
.finish();
// Create request builder and send request
let response = client
.get("https://www.rust-lang.org") // <--- notice the "s" in "https://..."
.header("User-Agent", "Actix-web")
.send()
.await; // <- Send http request
println!("Response: {:?}", response);
} Which returns
|
Cool, I will try removing |
My first issue is how do I share
Or I should keep |
It can't be shared between threads because it wraps an Rc so you'd need a mutex. I think creating one client per thread is acceptable. |
But I need some hacky way to use them like thread_local. Since Currently the only option is create a client per request (with entire config) or have thread_static values with client per thread, which doesn't look good either. I think I'd rather stick with |
What's wrong with: HttpServer::new(move || {
let client = actix_web::client::Client::default();
App::new().data(client)
}) Which makes one client per thread without thread-local hacks. |
I'm using it in middleware so it doesn't work like this. See: pub fn run_server(
application_url: &str,
auth_service: AuthService,
everlasting_settings_service: &'static CompanySettingsService,
pool: Pool<ConnectionManager<PgConnection>>,
) -> io::Result<impl Future<Output = io::Result<()>>> {
let server = HttpServer::new(move || {
let integrations_service = IntegrationService::new(pool.clone());
App::new()
.data(integrations_service)
.data(everlasting_settings_service)
.authorized_route(
API_PREFIX,
web::get().to(handlers::get_about),
auth_service.clone(),
)
.authorized_route(
API_PREFIX.trim_end_matches('/'),
web::get().to(handlers::get_about),
auth_service.clone(),
)
.authorized_route(
&[API_PREFIX, "v1/Integrations"].concat(),
web::get().to(handlers::get_integrations),
auth_service.clone(),
)
...
impl<T, B> AppExt<T, B> for App<T, B>
where
B: MessageBody,
T: ServiceFactory<
Config = (),
Request = ServiceRequest,
Response = ServiceResponse<B>,
Error = actix_web::Error,
InitError = (),
>,
{
fn authorized_route<P: IntoPattern>(
self,
path: P,
route: Route,
auth_service: AuthService,
) -> Self {
let auth = HttpAuthentication::bearer(move |req, c| auth_service.validator(req, &c));
self.service(resource(path).route(route).wrap(auth))
}
} |
Maybe somethink like this library could help: https://docs.rs/archery/0.3.0/archery/ Related to #1351 |
This is strange, but example never work on my machine, i always get something like:
The only way to make it work is to disable verification completely (which is not a case to work with) async fn index(_req: HttpRequest) -> HttpResponse {
let mut builder = SslConnector::builder(SslMethod::tls()).unwrap();
builder.set_verify(SslVerifyMode::NONE);
let client = Client::build()
.connector(Connector::new().ssl(builder.build()).finish())
.finish();
let now = std::time::Instant::now();
let payload =
client
.get("https://upload.wikimedia.org/wikipedia/commons/f/ff/Pizigani_1367_Chart_10MB.jpg")
.send()
.await
.unwrap()
.body()
.limit(20_000_000) // sets max allowable payload size
.await
.unwrap(); Can anybody verify this example works out of the box on his machine? (https://github.com/actix/examples/blob/22c8eaae87775d3da53ea3a73067c1a228a3a3a4/awc_https/src/main.rs#L8-L12) Also my "rustup show":
I using windows 10 x64 |
I can run that example without issues on macOS. Seems it's some bug with openssl on windows? |
actix/examples#330 created |
Is there a rustls example? I am getting connection timeout with rustls. Openssl is just impossible to compile in windows 10. Tried it for a day. |
Somebody please share example how to do it with actix_web 3 |
FWIW, I was able to use openssl client by following Pzixel's comment: #1045 (comment). I never got it working it actix-web 3 + rustls + macos though. |
I was able to successfully call with https in actix_web 4, awc 3. actix = "0.13.0"
actix-web = "4"
awc = { version = "3.0.0", features = ["openssl"] }
openssl = "0.10.40" |
This comment has been minimized.
This comment has been minimized.
@victormongi see the examples repo. |
I tried to use
actix_web::client::Client
to send a request to an https url. It works with the "ssl" feature, but not with the "rust-tls" feature.I condensed it to this sample code:
With "ssl" it works and prints the response headers. With "rust-tls" I get
Connect(SslIsNotSupported)
.The text was updated successfully, but these errors were encountered: