Skip to content

Conversation

@Arteneko
Copy link

The current implementation of the stream responders have a very restricted lifetime which doesn't allow using them, and this lifetime restriction doesn't appear on the other responder implementations.

A short example of the current implementation's usage:

#[derive(Responder)]
pub enum Woof {
	Woof(ReaderStream<One<&'static [u8]>>),
}

The error generated is the following:

error: lifetime may not live long enough
  --> src/routes/catchers.rs:56:10
   |
56 | #[derive(Responder)]
   |          ^^^^^^^^^
   |          |
   |          has type `&rocket::Request<'1>`
   |          lifetime `'o` defined here
   |          method was supposed to return data with lifetime `'o` but it is returning data with lifetime `'1`
   |
   = note: this error originates in the derive macro `Responder` (in Nightly builds, run with -Z macro-backtrace for more info)

help: add bound `'r: 'o`

The generated code from the derive shows that the rocket::response::Result lifetime is the same as the rocket::request::Request and can't live longer than that.

impl<'r, 'o: 'r> ::rocket::response::Responder<'r, 'o> for Woof {
	fn respond_to(
		self,
		__req: &'r ::rocket::request::Request<'_>,
	) -> ::rocket::response::Result<'o> {
		match self {
			Woof::Woof(__0) => {
				let mut __res =
					<ReaderStream<One<&'_ [u8]>> as ::rocket::response::Responder>::respond_to(
						__0, __req,
					)?;
				::std::result::Result::Ok(__res)
			}
		}
	}
}

Fixing the lifetimes (in the same pattern as what's been done on e.g. &str) solves the issue.

i have tested the fix on ReaderStream as it's the one i'm using in my project and applied the same fix over to the other stream implementations but as i don't understand them as much i didn't properly test them on this.
Note: My project's rocket version is 0.5.1, that's where a friend and i initially found the issue leading to this fix.

JonathanMcCormickJr and others added 8 commits March 16, 2025 12:29
- Update `gen_certs.sh`
  - Generate client cert as well by default
  - Set expiration to 10 years to match other certs
  - Set subject to match expected values in testbench test
- Update testbench `mtls` to ignore key hash value, and only check issuer
  and subject.
commit 9fcc529
Author: Cormac Relf <[email protected]>
Date:   Mon Apr 14 17:36:07 2025 +1000

    Improve db_pools init: do not crash if DB unavailable during startup

    ## Why?

    When using `Pool::connect[_with]`, sqlx attempts to connect to the given
    database immediately, and the fairing will fail if there are any
    problems in that attempt (beyond obvious configuration problems that are
    found before hitting the network), e.g.:

    - the database is unavailable; or
    - the username/password is incorrect; or
    - the ssl configuration is invalid; or
    - any other connection issue.

    There are a few pros and cons to this approach:

    Pros:

    - In development, configuration errors are surfaced slightly faster

    Cons:

    - Databases are expected to be unavailable sometimes. It does not
      normally crash a server if one becomes unavailable after startup,
      so why should it prevent a server from starting at all? See
      [deadpool's justification]{https://docs.rs/deadpool} for not crashing.
    - In production/testing, slower to debug configuration or networking
      errors as your edit-test loop now involves restarting an application
      rather than refreshing a page or trying a request again.
    - Causes database or configuration issues to appear as "failed
      deployments" in standard deployment scenarios.
    - Introduces hard ordering constraints on operator actions during
      database recovery, requiring reboots to follow a functioning database
      or applications not to be restarted at certain times

    ## Effect of change

    The sqlx backend now behaves like the deadpool backend: no connection
    issues are surfaced during startup. You will not see them until you
    attempt to get a connection from the pool. That means rocket will launch
    and you can find problems like these in smoke tests.
commit 74f884d
Author: Dan Fego <[email protected]>
Date:   Sat Mar 29 00:11:16 2025 -0400

    Added test for new config values

commit 0212e88
Author: Dan Fego <[email protected]>
Date:   Sat Mar 29 00:03:01 2025 -0400

    Fix 'Config' made defaults consistent with docs
commit 599d5ee
Author: Paul Adenot <[email protected]>
Date:   Wed Jan 1 18:21:18 2025 +0100

    Fix Dockerfile example in "Deploying" chapter

    This now matches the layout of a typical project, instead of erroring out.
- Based on rwf2#2930
- Populates value from hyper version
- Adds method to override version for local requests
Rust now warns when it determines that an elided lifetime has a name. This
commit updates all of these cases to use the named lifetime instead.
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

Successfully merging this pull request may close these issues.

6 participants