Skip to content
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

Panic while formatting headers #1269

Closed
3Hren opened this issue Jul 18, 2017 · 8 comments
Closed

Panic while formatting headers #1269

3Hren opened this issue Jul 18, 2017 · 8 comments
Labels
A-headers Area: headers. C-bug Category: bug. Something is wrong. This is bad!

Comments

@3Hren
Copy link

3Hren commented Jul 18, 2017

My hyper use case is a reverse proxy between HTTP and binary protocol. Unfortunately sometimes while converting headers into a vector of strings, it panics:

thread 'worker 02' panicked at 'a Display implementation return an error unexpectedly: Error', /checkout/src/libcore/result.rs:859
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.
stack backtrace:
   0: std::sys::imp::backtrace::tracing::imp::unwind_backtrace
             at /checkout/src/libstd/sys/unix/backtrace/tracing/gcc_s.rs:49
   1: std::sys_common::backtrace::_print
             at /checkout/src/libstd/sys_common/backtrace.rs:71
   2: std::panicking::default_hook::{{closure}}
             at /checkout/src/libstd/sys_common/backtrace.rs:60
             at /checkout/src/libstd/panicking.rs:355
   3: std::panicking::default_hook
             at /checkout/src/libstd/panicking.rs:371
   4: std::panicking::rust_panic_with_hook
             at /checkout/src/libstd/panicking.rs:549
   5: std::panicking::begin_panic
             at /checkout/src/libstd/panicking.rs:511
   6: std::panicking::begin_panic_fmt
             at /checkout/src/libstd/panicking.rs:495
   7: rust_begin_unwind
             at /checkout/src/libstd/panicking.rs:471
   8: core::panicking::panic_fmt
             at /checkout/src/libcore/panicking.rs:69
   9: core::result::unwrap_failed
             at /checkout/src/libcore/macros.rs:29

10: <core::iter::Map<I, F> as core::iter::iterator::Iterator>::next
             at /checkout/src/libcore/result.rs:761
             at /checkout/src/libcollections/string.rs:2027
             at /home/esafronov/.cargo/git/checkouts/hyper-817b53a166fc1c58/fc5b9cc/src/header/mod.rs:609
             at src/route/app.rs:278
             at /checkout/src/libcore/ops.rs:2711
             at /checkout/src/libcore/option.rs:392
             at /checkout/src/libcore/iter/mod.rs:1046
  11: cocaine_http_proxy::route::app::AppRequest::new
             at /checkout/src/libcollections/vec.rs:1899
             at /checkout/src/libcollections/vec.rs:1796
             at /checkout/src/libcollections/vec.rs:1791
             at /checkout/src/libcollections/vec.rs:1692
             at /checkout/src/libcore/iter/iterator.rs:1255
             at src/route/app.rs:276
  12: <cocaine_http_proxy::route::app::AppRoute<L> as cocaine_http_proxy::route::Route>::process
             at src/route/app.rs:173
             at src/route/app.rs:197
  13: cocaine_http_proxy::route::Router::process
             at src/route/mod.rs:90
  14: <cocaine_http_proxy::service::cocaine::ProxyService as tokio_service::Service>::call
             at src/service/cocaine.rs:41
  15: <tokio_proto::streaming::pipeline::server::Dispatch<S, T, P> as tokio_proto::streaming::pipeline::advanced::Dispatch>::dispatch
             at src/service/cocaine.rs:110
             at src/server/mod.rs:90
             at /home/esafronov/.cargo/git/checkouts/hyper-817b53a166fc1c58/fc5b9cc/src/server/mod.rs:335
             at /home/esafronov/.cargo/registry/src/github.com-1ecc6299db9ec823/tokio-proto-0.1.1/src/streaming/pipeline/server.rs:124
  16: <tokio_proto::streaming::pipeline::advanced::Pipeline<T> as futures::future::Future>::poll
             at /home/esafronov/.cargo/registry/src/github.com-1ecc6299db9ec823/tokio-proto-0.1.1/src/streaming/pipeline/advanced.rs:171
             at /home/esafronov/.cargo/registry/src/github.com-1ecc6299db9ec823/tokio-proto-0.1.1/src/streaming/pipeline/advanced.rs:121
             at /home/esafronov/.cargo/registry/src/github.com-1ecc6299db9ec823/tokio-proto-0.1.1/src/streaming/pipeline/advanced.rs:376
  17: <futures::future::map_err::MapErr<A, F> as futures::future::Future>::poll
             at /home/esafronov/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-0.1.14/src/future/chain.rs:32
             at /home/esafronov/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-0.1.14/src/future/and_then.rs:32
             at /home/esafronov/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-0.1.14/src/future/map_err.rs:30
  18: tokio_core::reactor::Core::poll
             at /home/esafronov/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-0.1.14/src/future/mod.rs:107
             at /home/esafronov/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-0.1.14/src/task_impl/mod.rs:291
             at /home/esafronov/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-0.1.14/src/task_impl/mod.rs:352
             at /home/esafronov/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-0.1.14/src/task_impl/std/mod.rs:90
             at /home/esafronov/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-0.1.14/src/task_impl/mod.rs:352
             at /home/esafronov/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-0.1.14/src/task_impl/mod.rs:291
             at /home/esafronov/.cargo/registry/src/github.com-1ecc6299db9ec823/tokio-core-0.1.8/src/reactor/mod.rs:356
             at /home/esafronov/.cargo/registry/src/github.com-1ecc6299db9ec823/scoped-tls-0.1.0/src/lib.rs:135
             at /home/esafronov/.cargo/registry/src/github.com-1ecc6299db9ec823/tokio-core-0.1.8/src/reactor/mod.rs:355
             at /home/esafronov/.cargo/registry/src/github.com-1ecc6299db9ec823/tokio-core-0.1.8/src/reactor/mod.rs:316
             at /home/esafronov/.cargo/registry/src/github.com-1ecc6299db9ec823/tokio-core-0.1.8/src/reactor/mod.rs:304
@seanmonstar
Copy link
Member

What is done in src/route/app.rs:278?

It is the case that header values can be sent in encodings that are not UTF-8. In that case, the bytes would need to be decoded according to some other knowledge. Perhaps because of this, Headers should not itself implement Display, because it cannot always succeed...

@3Hren
Copy link
Author

3Hren commented Jul 18, 2017

let headers = req.headers()
    .iter()
    .map(|header| (header.name().to_string(), header.value_string()))
    .collect();

As an alternative I could pack them as Vec<u8>, but didn't find such method...

@3Hren
Copy link
Author

3Hren commented Jul 18, 2017

@3Hren
Copy link
Author

3Hren commented Jul 18, 2017

I think we can we assume value_string() method as dangerous, because it may crash your application depending on user input.

@3Hren
Copy link
Author

3Hren commented Jul 19, 2017

As an alternative I could pack them as Vec, but didn't find such method...

Well, technically it is possible (https://github.com/3Hren/cocaine-http-proxy/blob/master/src/route/app.rs#L285), but looks weird.

I can implement value_vec() -> Vec<u8> method if you like.

@seanmonstar
Copy link
Member

Woops, closed the wrong issue with that commit.

@seanmonstar seanmonstar reopened this Jul 27, 2017
@seanmonstar seanmonstar added A-headers Area: headers. C-bug Category: bug. Something is wrong. This is bad! labels Sep 17, 2017
@seanmonstar
Copy link
Member

Yea, providing value_string and fmt::Display for Headers is a mistake. Fixing it is a breaking change, so will be taken care of likely in the 0.12 release.

@seanmonstar seanmonstar added this to the 0.12 milestone Sep 17, 2017
@seanmonstar seanmonstar removed this from the 0.12 milestone Feb 21, 2018
@seanmonstar
Copy link
Member

For now, the new version of hyper won't be including the typed headers directly, so I'm closing this here as a won't fix.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
A-headers Area: headers. C-bug Category: bug. Something is wrong. This is bad!
Projects
None yet
Development

No branches or pull requests

2 participants