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 when using non-ASCII in a route #138

Open
phrohdoh opened this issue Oct 13, 2018 · 4 comments
Open

Panic when using non-ASCII in a route #138

phrohdoh opened this issue Oct 13, 2018 · 4 comments

Comments

@phrohdoh
Copy link

This very well may be a use-case that you decide not to support but I figured I'd report it regardless.

#[get("/£")]
#[content_type("plain")]
fn money_plz(&self) -> Result<String, ()> {
    Ok("$".into())
}
➜  server git:(master) ✗ RUST_BACKTRACE=1 cargo run
    Finished dev [unoptimized + debuginfo] target(s) in 0.14s
     Running `target/debug/grassdoor`
Listening on http://127.0.0.1:8080
thread 'main' panicked at 'byte index 2 is not a char boundary; it is inside '£' (bytes 1..3) of `/£`', libcore/str/mod.rs:2108:5
stack backtrace:
   0: std::sys::unix::backtrace::tracing::imp::unwind_backtrace
             at libstd/sys/unix/backtrace/tracing/gcc_s.rs:49
   1: std::sys_common::backtrace::print
             at libstd/sys_common/backtrace.rs:71
             at libstd/sys_common/backtrace.rs:59
   2: std::panicking::default_hook::{{closure}}
             at libstd/panicking.rs:211
   3: std::panicking::default_hook
             at libstd/panicking.rs:227
   4: <std::panicking::begin_panic::PanicPayload<A> as core::panic::BoxMeUp>::get
             at libstd/panicking.rs:475
   5: std::panicking::continue_panic_fmt
             at libstd/panicking.rs:390
   6: std::panicking::try::do_call
             at libstd/panicking.rs:325
   7: core::ptr::drop_in_place
             at libcore/panicking.rs:77
   8: core::str::run_utf8_validation
             at libcore/str/mod.rs:2108
   9: <usize as core::iter::range::Step>::add_usize
             at /Users/travis/build/rust-lang/rust/src/libcore/str/mod.rs:1891
  10: core::ptr::drop_in_place
             at /Users/travis/build/rust-lang/rust/src/libcore/option.rs:386
  11: core::str::traits::<impl core::slice::SliceIndex<str> for core::ops::range::Range<usize>>::index
             at /Users/travis/build/rust-lang/rust/src/libcore/str/mod.rs:1891
  12: core::str::traits::<impl core::ops::index::Index<core::ops::range::Range<usize>> for str>::index
             at /Users/travis/build/rust-lang/rust/src/libcore/str/mod.rs:1667
  13: core::str::traits::<impl core::ops::index::Index<core::ops::range::RangeFull> for str>::index
             at /Users/taryn/.cargo/registry/src/github.com-1ecc6299db9ec823/tower-web-0.3.1/src/routing/path.rs:18
  14: <tower_web::routing::route::Route<T>>::path
             at /Users/taryn/.cargo/registry/src/github.com-1ecc6299db9ec823/tower-web-0.3.1/src/routing/route.rs:39
  15: grassdoor::services::web::__IMPL_WEB_1_FOR_WebService::<impl tower_web::routing::resource::IntoResource<S, B> for grassdoor::services::web::WebService>::routes
             at ./<derive_resource macros>:2
  16: tower_web::util::tuple::<impl tower_web::routing::resource::IntoResource<S, B> for (T0, T1, T2)>::routes
             at /Users/taryn/.cargo/registry/src/github.com-1ecc6299db9ec823/tower-web-0.3.1/src/util/tuple.rs:3995
  17: <tower_web::service::builder::ServiceBuilder<T, S, C, M>>::build_new_service
             at /Users/taryn/.cargo/registry/src/github.com-1ecc6299db9ec823/tower-web-0.3.1/src/service/builder.rs:463
  18: <tower_web::service::builder::ServiceBuilder<T, S, C, M>>::run
             at /Users/taryn/.cargo/registry/src/github.com-1ecc6299db9ec823/tower-web-0.3.1/src/service/builder.rs:519
  19: grassdoor::main
             at src/main.rs:42
  20: std::rt::lang_start::{{closure}}
             at /Users/travis/build/rust-lang/rust/src/libstd/rt.rs:74
  21: std::panicking::try::do_call
             at libstd/rt.rs:59
             at libstd/panicking.rs:310
  22: panic_unwind::dwarf::eh::read_encoded_pointer
             at libpanic_unwind/lib.rs:105
  23: <std::sync::mutex::Mutex<T>>::new
             at libstd/panicking.rs:289
             at libstd/panic.rs:392
             at libstd/rt.rs:58
  24: std::rt::lang_start
             at /Users/travis/build/rust-lang/rust/src/libstd/rt.rs:74
  25: grassdoor::main

Using tower-web version 0.3.1.

@carllerche
Copy link
Owner

Yeah, that seems bad 👍

@carllerche
Copy link
Owner

Uris cannot actually contain non-ascii characters. These characters would be percent encoded.

So, tower-web could transparently percent encode these cases?

@Abogical
Copy link
Contributor

Abogical commented Mar 12, 2019

Uris cannot actually contain non-ascii characters. These characters would be percent encoded.

So, tower-web could transparently percent encode these cases?

Should this be done in the http crate?

@lnicola
Copy link
Collaborator

lnicola commented Apr 8, 2019

Filed #206 to fix the panic, although the route probably won't match due to the percent-encoding. See #142 and the linked thread for a wider discussion on decoding the request parameters.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants