mirror of
https://github.com/actix/actix-web.git
synced 2024-12-24 00:50:36 +00:00
feat: Html responder (#3399)
This commit is contained in:
parent
0ce488e57a
commit
188206a903
5 changed files with 72 additions and 3 deletions
|
@ -19,8 +19,6 @@ Multipart form support for Actix Web.
|
|||
|
||||
## Examples
|
||||
|
||||
[More available in the examples repo →](https://github.com/actix/examples/tree/master/forms/multipart)
|
||||
|
||||
```rust
|
||||
use actix_web::{post, App, HttpServer, Responder};
|
||||
|
||||
|
@ -58,6 +56,8 @@ async fn main() -> std::io::Result<()> {
|
|||
|
||||
<!-- cargo-rdme end -->
|
||||
|
||||
[More available in the examples repo →](https://github.com/actix/examples/tree/master/forms/multipart)
|
||||
|
||||
Curl request :
|
||||
|
||||
```bash
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
|
||||
### Added
|
||||
|
||||
- Add `web::Html` responder.
|
||||
- Add `HttpRequest::full_url()` method to get the complete URL of the request.
|
||||
|
||||
### Fixed
|
||||
|
|
|
@ -109,4 +109,4 @@ This project is licensed under either of the following licenses, at your option:
|
|||
|
||||
## Code of Conduct
|
||||
|
||||
Contribution to the actix-web repo is organized under the terms of the Contributor Covenant. The Actix team promises to intervene to uphold that code of conduct.
|
||||
Contribution to the `actix/actix-web` repo is organized under the terms of the Contributor Covenant. The Actix team promises to intervene to uphold that code of conduct.
|
||||
|
|
66
actix-web/src/types/html.rs
Normal file
66
actix-web/src/types/html.rs
Normal file
|
@ -0,0 +1,66 @@
|
|||
//! Semantic HTML responder. See [`Html`].
|
||||
|
||||
use crate::{
|
||||
http::{
|
||||
header::{self, ContentType, TryIntoHeaderValue},
|
||||
StatusCode,
|
||||
},
|
||||
HttpRequest, HttpResponse, Responder,
|
||||
};
|
||||
|
||||
/// Semantic HTML responder.
|
||||
///
|
||||
/// When used as a responder, creates a 200 OK response, sets the correct HTML content type, and
|
||||
/// uses the string passed to [`Html::new()`] as the body.
|
||||
///
|
||||
/// ```
|
||||
/// # use actix_web::web::Html;
|
||||
/// Html::new("<p>Hello, World!</p>")
|
||||
/// # ;
|
||||
/// ```
|
||||
#[derive(Debug, Clone, PartialEq, Hash)]
|
||||
pub struct Html(String);
|
||||
|
||||
impl Html {
|
||||
/// Constructs a new `Html` responder.
|
||||
pub fn new(html: impl Into<String>) -> Self {
|
||||
Self(html.into())
|
||||
}
|
||||
}
|
||||
|
||||
impl Responder for Html {
|
||||
type Body = String;
|
||||
|
||||
fn respond_to(self, _req: &HttpRequest) -> HttpResponse<Self::Body> {
|
||||
let mut res = HttpResponse::with_body(StatusCode::OK, self.0);
|
||||
res.headers_mut().insert(
|
||||
header::CONTENT_TYPE,
|
||||
ContentType::html().try_into_value().unwrap(),
|
||||
);
|
||||
res
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
use crate::test::TestRequest;
|
||||
|
||||
#[test]
|
||||
fn responder() {
|
||||
let req = TestRequest::default().to_http_request();
|
||||
|
||||
let res = Html::new("<p>Hello, World!</p>");
|
||||
let res = res.respond_to(&req);
|
||||
|
||||
assert!(res.status().is_success());
|
||||
assert!(res
|
||||
.headers()
|
||||
.get(header::CONTENT_TYPE)
|
||||
.unwrap()
|
||||
.to_str()
|
||||
.unwrap()
|
||||
.starts_with("text/html"));
|
||||
assert!(res.body().starts_with("<p>"));
|
||||
}
|
||||
}
|
|
@ -3,6 +3,7 @@
|
|||
mod either;
|
||||
mod form;
|
||||
mod header;
|
||||
mod html;
|
||||
mod json;
|
||||
mod path;
|
||||
mod payload;
|
||||
|
@ -13,6 +14,7 @@ pub use self::{
|
|||
either::Either,
|
||||
form::{Form, FormConfig, UrlEncoded},
|
||||
header::Header,
|
||||
html::Html,
|
||||
json::{Json, JsonBody, JsonConfig},
|
||||
path::{Path, PathConfig},
|
||||
payload::{Payload, PayloadConfig},
|
||||
|
|
Loading…
Reference in a new issue