1
0
Fork 0
mirror of https://github.com/actix/actix-web.git synced 2024-11-10 19:01:05 +00:00

feat: Html responder (#3399)

This commit is contained in:
Rob Ede 2024-06-11 00:36:46 +01:00 committed by GitHub
parent 0ce488e57a
commit 188206a903
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 72 additions and 3 deletions

View file

@ -19,8 +19,6 @@ Multipart form support for Actix Web.
## Examples ## Examples
[More available in the examples repo →](https://github.com/actix/examples/tree/master/forms/multipart)
```rust ```rust
use actix_web::{post, App, HttpServer, Responder}; use actix_web::{post, App, HttpServer, Responder};
@ -58,6 +56,8 @@ async fn main() -> std::io::Result<()> {
<!-- cargo-rdme end --> <!-- cargo-rdme end -->
[More available in the examples repo &rarr;](https://github.com/actix/examples/tree/master/forms/multipart)
Curl request : Curl request :
```bash ```bash

View file

@ -4,6 +4,7 @@
### Added ### Added
- Add `web::Html` responder.
- Add `HttpRequest::full_url()` method to get the complete URL of the request. - Add `HttpRequest::full_url()` method to get the complete URL of the request.
### Fixed ### Fixed

View file

@ -109,4 +109,4 @@ This project is licensed under either of the following licenses, at your option:
## Code of Conduct ## 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.

View 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>"));
}
}

View file

@ -3,6 +3,7 @@
mod either; mod either;
mod form; mod form;
mod header; mod header;
mod html;
mod json; mod json;
mod path; mod path;
mod payload; mod payload;
@ -13,6 +14,7 @@ pub use self::{
either::Either, either::Either,
form::{Form, FormConfig, UrlEncoded}, form::{Form, FormConfig, UrlEncoded},
header::Header, header::Header,
html::Html,
json::{Json, JsonBody, JsonConfig}, json::{Json, JsonBody, JsonConfig},
path::{Path, PathConfig}, path::{Path, PathConfig},
payload::{Payload, PayloadConfig}, payload::{Payload, PayloadConfig},