mirror of https://github.com/rwf2/Rocket.git
Added Cookied as a response: can now set cookies. Added example of setting cookies. Working on retrieving them.
This commit is contained in:
parent
55d5dd2b46
commit
bceb1ecfb6
|
@ -0,0 +1,10 @@
|
||||||
|
[package]
|
||||||
|
name = "cookies"
|
||||||
|
version = "0.0.1"
|
||||||
|
authors = ["Sergio Benitez <sb@sergio.bz>"]
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
rocket = { path = "../../lib" }
|
||||||
|
rocket_macros = { path = "../../macros" }
|
||||||
|
lazy_static = "*"
|
||||||
|
tera = { git = "https://github.com/Keats/tera" }
|
|
@ -0,0 +1,16 @@
|
||||||
|
Rocket Todo Example
|
||||||
|
===================
|
||||||
|
|
||||||
|
Before running this example, you'll need to ensure there's a database file
|
||||||
|
present. You can do this with Diesel.
|
||||||
|
|
||||||
|
Running migration with Diesel
|
||||||
|
-----------------------------
|
||||||
|
|
||||||
|
Just run the following commands in your shell:
|
||||||
|
|
||||||
|
```
|
||||||
|
cargo install diesel_cli # installs the diesel CLI tools
|
||||||
|
DATABASE_URL=db/db.sql diesel migration run # create db/db.sql
|
||||||
|
```
|
||||||
|
|
|
@ -0,0 +1,43 @@
|
||||||
|
#![feature(plugin, custom_derive, custom_attribute)]
|
||||||
|
#![plugin(rocket_macros)]
|
||||||
|
|
||||||
|
#[macro_use]
|
||||||
|
extern crate lazy_static;
|
||||||
|
extern crate rocket;
|
||||||
|
extern crate tera;
|
||||||
|
|
||||||
|
mod static_files;
|
||||||
|
|
||||||
|
use rocket::Rocket;
|
||||||
|
use rocket::response::{Cookied, Redirect};
|
||||||
|
|
||||||
|
lazy_static!(static ref TERA: tera::Tera = tera::Tera::new("templates/**/*"););
|
||||||
|
|
||||||
|
fn ctxt(message: Option<&str>) -> tera::Context {
|
||||||
|
let mut context = tera::Context::new();
|
||||||
|
context.add("have_message", &message.is_some());
|
||||||
|
context.add("message", &message.unwrap_or("").to_string());
|
||||||
|
context
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(FromForm)]
|
||||||
|
struct Message {
|
||||||
|
message: String
|
||||||
|
}
|
||||||
|
|
||||||
|
#[route(POST, path = "/submit", form = "<message>")]
|
||||||
|
fn submit(message: Message) -> Cookied<Redirect> {
|
||||||
|
Cookied::new(Redirect::to("/")).add("message", &message.message)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[route(GET, path = "/")]
|
||||||
|
fn index() -> tera::TeraResult<String> {
|
||||||
|
TERA.render("index.html", ctxt(None))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let mut rocket = Rocket::new("127.0.0.1", 8000);
|
||||||
|
rocket.mount("/", static_files::routes());
|
||||||
|
rocket.mount("/", routes![submit, index]);
|
||||||
|
rocket.launch();
|
||||||
|
}
|
|
@ -0,0 +1,19 @@
|
||||||
|
use std::fs::File;
|
||||||
|
use std::io;
|
||||||
|
use rocket;
|
||||||
|
|
||||||
|
#[route(GET, path = "/<top>/<file>")]
|
||||||
|
fn all_level_one(top: &str, file: &str) -> io::Result<File> {
|
||||||
|
let file = format!("static/{}/{}", top, file);
|
||||||
|
File::open(file)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[route(GET, path = "/<file>")]
|
||||||
|
fn all(file: &str) -> io::Result<File> {
|
||||||
|
let file = format!("static/{}", file);
|
||||||
|
File::open(file)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn routes() -> Vec<rocket::Route> {
|
||||||
|
routes![all_level_one, all]
|
||||||
|
}
|
|
@ -0,0 +1,22 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8" />
|
||||||
|
<meta name="viewport" content="width=device-width" />
|
||||||
|
<title>Rocket: Cookie Examples</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>Rocket Cookie Examples</h1>
|
||||||
|
{% if have_message %}
|
||||||
|
<p>{{ message }}</p>
|
||||||
|
{% else %}
|
||||||
|
<p>No message yet.</p>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<form action="/submit" method="post" accept-charset="utf-8">
|
||||||
|
<textarea placeholder="Your message here..."
|
||||||
|
name="message" rows="10" cols="50"></textarea>
|
||||||
|
<p><input type="submit" value="Set Cookie"></p>
|
||||||
|
</form>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -0,0 +1,50 @@
|
||||||
|
use response::*;
|
||||||
|
use std::string::ToString;
|
||||||
|
use hyper::header::{SetCookie, CookiePair};
|
||||||
|
|
||||||
|
pub struct Cookied<R: Responder> {
|
||||||
|
cookies: Option<Vec<CookiePair>>,
|
||||||
|
responder: R
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<R: Responder> Cookied<R> {
|
||||||
|
pub fn new(responder: R) -> Cookied<R> {
|
||||||
|
Cookied {
|
||||||
|
cookies: None,
|
||||||
|
responder: responder
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn with(responder: R, pairs: &[(&ToString, &ToString)]) -> Cookied<R> {
|
||||||
|
Cookied {
|
||||||
|
cookies: Some(
|
||||||
|
pairs.iter()
|
||||||
|
.map(|p| CookiePair::new(p.0.to_string(), p.1.to_string()))
|
||||||
|
.collect()
|
||||||
|
),
|
||||||
|
responder: responder
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[inline(always)]
|
||||||
|
pub fn add<A: ToString, B: ToString>(mut self, a: A, b: B) -> Self {
|
||||||
|
let new_pair = CookiePair::new(a.to_string(), b.to_string());
|
||||||
|
match self.cookies {
|
||||||
|
Some(ref mut pairs) => pairs.push(new_pair),
|
||||||
|
None => self.cookies = Some(vec![new_pair])
|
||||||
|
};
|
||||||
|
|
||||||
|
self
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<R: Responder> Responder for Cookied<R> {
|
||||||
|
fn respond<'b>(&mut self, mut res: FreshHyperResponse<'b>) -> Outcome<'b> {
|
||||||
|
if let Some(pairs) = self.cookies.take() {
|
||||||
|
res.headers_mut().set(SetCookie(pairs));
|
||||||
|
}
|
||||||
|
|
||||||
|
self.responder.respond(res)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -3,6 +3,7 @@ mod responder;
|
||||||
mod redirect;
|
mod redirect;
|
||||||
mod with_status;
|
mod with_status;
|
||||||
mod outcome;
|
mod outcome;
|
||||||
|
mod cookied;
|
||||||
|
|
||||||
pub use hyper::server::Response as HyperResponse;
|
pub use hyper::server::Response as HyperResponse;
|
||||||
pub use hyper::net::Fresh as HyperFresh;
|
pub use hyper::net::Fresh as HyperFresh;
|
||||||
|
@ -15,6 +16,7 @@ pub use self::empty::{Empty, Forward};
|
||||||
pub use self::redirect::Redirect;
|
pub use self::redirect::Redirect;
|
||||||
pub use self::with_status::StatusResponse;
|
pub use self::with_status::StatusResponse;
|
||||||
pub use self::outcome::Outcome;
|
pub use self::outcome::Outcome;
|
||||||
|
pub use self::cookied::Cookied;
|
||||||
|
|
||||||
use std::ops::{Deref, DerefMut};
|
use std::ops::{Deref, DerefMut};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue