1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
//! Contains types that set the Content-Type of a response. //! //! # Usage //! //! Each type wraps a given responder. The `Responder` implementation of each //! type replaces the Content-Type of the wrapped responder and delegates the //! remainder of the response to the wrapped responder. This allows for setting //! the Content-Type of a type that doesn't set it itself or for overriding one //! that does. //! //! # Example //! //! The following snippet creates an `HTML` content response for a string. //! Normally, raw strings set their response Content-Type to `text/plain`. By //! using the `HTML` content response, the Content-Type will be set to //! `text/html` instead. //! //! ```rust //! use rocket::response::content; //! //! # #[allow(unused_variables)] //! let response = content::HTML("<h1>Hello, world!</h1>"); //! ``` use response::{Response, Responder}; use http::{Status, ContentType}; /// Sets the Content-Type of a `Responder` to a chosen value. /// /// Delagates the remainder of the response to the wrapped responder. /// /// # Example /// /// Set the Content-Type of a string to PDF. /// /// ```rust /// use rocket::response::content::Content; /// use rocket::http::ContentType; /// /// # #[allow(unused_variables)] /// let response = Content(ContentType::PDF, "Hi."); /// ``` #[derive(Debug, Clone, PartialEq)] pub struct Content<R>(pub ContentType, pub R); /// Overrides the Content-Type of the response to the wrapped `ContentType` then /// delegates the remainder of the response to the wrapped responder. impl<'r, R: Responder<'r>> Responder<'r> for Content<R> { #[inline(always)] fn respond(self) -> Result<Response<'r>, Status> { Response::build() .merge(self.1.respond()?) .header(self.0) .ok() } } macro_rules! ctrs { ($($name:ident: $name_str:expr, $ct_str:expr),+) => { $( #[doc="Override the `Content-Type` of the response to <b>"] #[doc=$name_str] #[doc="</b>, or <i>"] #[doc=$ct_str] #[doc="</i>."] /// /// Delagates the remainder of the response to the wrapped responder. #[derive(Debug, Clone, PartialEq)] pub struct $name<R>(pub R); /// Sets the Content-Type of the response then delegates the /// remainder of the response to the wrapped responder. impl<'r, R: Responder<'r>> Responder<'r> for $name<R> { fn respond(self) -> Result<Response<'r>, Status> { Content(ContentType::$name, self.0).respond() } } )+ } } ctrs! { JSON: "JSON", "application/json", XML: "XML", "text/xml", HTML: "HTML", "text/html", Plain: "plain text", "text/plain", CSS: "CSS", "text/css", JavaScript: "JavaScript", "application/javascript" }