1(globalThis.webpackChunkactix_website||=[]).push([[2184],{75739(e,n,t){const r={"./application/Cargo.toml":35806,"./application/src/app.rs":82541,"./application/src/combine.rs":54695,"./application/src/config.rs":35142,"./application/src/main.rs":95185,"./application/src/mutable_state.rs":4906,"./application/src/scope.rs":87262,"./application/src/state.rs":48039,"./application/src/vh.rs":77954,"./async-handlers/Cargo.toml":84820,"./async-handlers/src/main.rs":84403,"./async-handlers/src/stream.rs":38178,"./databases/Cargo.toml":97106,"./databases/src/main.rs":32789,"./easy-form-handling/Cargo.toml":88681,"./easy-form-handling/src/main.rs":63800,"./either/Cargo.toml":29619,"./either/src/main.rs":96854,"./errors/Cargo.toml":34841,"./errors/src/helpers.rs":69172,"./errors/src/logging.rs":104,"./errors/src/main.rs":53896,"./errors/src/override_error.rs":74116,"./errors/src/recommend_one.rs":23988,"./errors/src/recommend_two.rs":14122,"./extractors/Cargo.toml":21135,"./extractors/src/form.rs":95509,"./extractors/src/form_optional.rs":27636,"./extractors/src/json_one.rs":35114,"./extractors/src/json_two.rs":52464,"./extractors/src/main.rs":84242,"./extractors/src/multiple.rs":29391,"./extractors/src/path_one.rs":47639,"./extractors/src/path_three.rs":4771,"./extractors/src/path_two.rs":59993,"./extractors/src/query.rs":72559,"./flexible-responders/Cargo.toml":67141,"./flexible-responders/src/main.rs":88884,"./getting-started/Cargo.toml":11308,"./getting-started/src/main.rs":57467,"./http2/Cargo.toml":69294,"./http2/src/main.rs":5953,"./main-example/Cargo.toml":8768,"./main-example/src/main.rs":13887,"./middleware/Cargo.toml":45310,"./middleware/src/default_headers.rs":90802,"./middleware/src/errorhandler.rs":94586,"./middleware/src/from_fn.rs":53351,"./middleware/src/logger.rs":42380,"./middleware/src/main.rs":2673,"./middleware/src/user_sessions.rs":77175,"./middleware/src/wrap_fn.rs":53283,"./powerful-extractors/Cargo.toml":19886,"./powerful-extractors/src/main.rs":2561,"./request-handlers/Cargo.toml":92895,"./request-handlers/src/handlers_arc.rs":39529,"./request-handlers/src/main.rs":15970,"./request-routing/Cargo.toml":80006,"./request-routing/src/main.rs":58889,"./requests/Cargo.toml":25036,"./requests/src/main.rs":66619,"./requests/src/manual.rs":10012,"./requests/src/multipart.rs":60716,"./requests/src/streaming.rs":43588,"./requests/src/urlencoded.rs":73179,"./responder-trait/Cargo.toml":47327,"./responder-trait/src/main.rs":11618,"./responses/Cargo.toml":93792,"./responses/src/auto.rs":84417,"./responses/src/chunked.rs":89192,"./responses/src/identity.rs":80496,"./responses/src/identity_two.rs":65793,"./responses/src/json_resp.rs":39953,"./responses/src/main.rs":6271,"./sea-orm-databases/Cargo.toml":99325,"./sea-orm-databases/src/main.rs":31452,"./sea-orm-databases/src/mod.rs":83261,"./sea-orm-databases/src/prelude.rs":96092,"./sea-orm-databases/src/users.rs":14193,"./server/Cargo.toml":98697,"./server/src/keep_alive.rs":33578,"./server/src/keep_alive_tp.rs":83921,"./server/src/main.rs":21048,"./server/src/signals.rs":53936,"./server/src/ssl.rs":48435,"./server/src/workers.rs":17686,"./static-files/Cargo.toml":59358,"./static-files/src/configuration.rs":49148,"./static-files/src/configuration_two.rs":20125,"./static-files/src/directory.rs":49553,"./static-files/src/main.rs":14449,"./testing/Cargo.toml":32736,"./testing/src/integration_one.rs":85233,"./testing/src/integration_two.rs":41635,"./testing/src/main.rs":2367,"./testing/src/stream_response.rs":72810,"./url-dispatch/Cargo.toml":584,"./url-dispatch/src/cfg.rs":25730,"./url-dispatch/src/dhandler.rs":49454,"./url-dispatch/src/guard.rs":37385,"./url-dispatch/src/guard2.rs":64339,"./url-dispatch/src/main.rs":96599,"./url-dispatch/src/minfo.rs":43171,"./url-dispatch/src/norm.rs":5412,"./url-dispatch/src/norm2.rs":48116,"./url-dispatch/src/path.rs":16713,"./url-dispatch/src/path2.rs":31123,"./url-dispatch/src/pbuf.rs":97103,"./url-dispatch/src/resource.rs":63046,"./url-dispatch/src/scope.rs":36408,"./url-dispatch/src/url_ext.rs":17401,"./url-dispatch/src/urls.rs":43652,"./websockets/Cargo.toml":41894,"./websockets/src/main.rs":32553};function s(e){const n=a(e);return t(n)}function a(e){if(!t.o(r,e)){const n=new Error("Cannot find module '"+e+"'");throw n.code="MODULE_NOT_FOUND",n}return r[e]}s.keys=function(){return Object.keys(r)},s.resolve=a,e.exports=s,s.id=75739},43425(e,n,t){"use strict";t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>p,default:()=>l,frontMatter:()=>o,metadata:()=>r,toc:()=>u});const r=JSON.parse('{"id":"databases","title":"Databases","description":"We have several example projects showing use of async database adapters:","source":"@site/docs/databases.md","sourceDirName":".","slug":"/databases","permalink":"/docs/databases","draft":false,"unlisted":false,"editUrl":"https://github.com/actix/actix-website/edit/main/docs/databases.md","tags":[],"version":"current","frontMatter":{"title":"Databases"},"sidebar":"docs","previous":{"title":"Auto-Reloading","permalink":"/docs/autoreload"},"next":{"title":"HTTP Server Initialization","permalink":"/docs/http_server_init"}}');var s=t(91987),a=t(67008),i=t(93196);const o={title:"Databases"},p="Async Options",d={},u=[];function c(e){const n={a:"a",code:"code",h1:"h1",header:"header",li:"li",p:"p",ul:"ul",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"async-options",children:"Async Options"})}),"\n",(0,s.jsx)(n.p,{children:"We have several example projects showing use of async database adapters:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://github.com/actix/examples/tree/master/databases/postgres",children:"Postgres"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://github.com/actix/examples/tree/master/databases/sqlite",children:"SQLite"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://github.com/actix/examples/tree/master/databases/mongodb",children:"MongoDB"})}),"\n"]}),"\n",(0,s.jsx)(n.h1,{id:"diesel",children:"Diesel"}),"\n",(0,s.jsxs)(n.p,{children:["The current versions of Diesel (v1/v2) does not support asynchronous operations, so it is important to use the ",(0,s.jsx)(n.a,{href:"https://docs.rs/actix-web/4/actix_web/web/fn.block.html",children:(0,s.jsx)(n.code,{children:"web::block"})})," function to offload your database operations to the Actix runtime thread-pool."]}),"\n",(0,s.jsx)(n.p,{children:"You can create action functions that correspond to all the operations your app will perform on the database."}),"\n",(0,s.jsx)(i.A,{example:"databases",file:"main.rs",section:"handler"}),"\n",(0,s.jsxs)(n.p,{children:["Now you should set up the database pool using a crate such as ",(0,s.jsx)(n.code,{children:"r2d2"}),", which makes many DB connections available to your app. This means that multiple handlers can manipulate the DB at the same time, and still accept new connections. Simply, the pool in your app state. (In this case, it's beneficial not to use a state wrapper struct because the pool handles shared access for you.)"]}),"\n",(0,s.jsx)(i.A,{example:"databases",file:"main.rs",section:"main"}),"\n",(0,s.jsxs)(n.p,{children:["Now, in a request handler, use the ",(0,s.jsx)(n.code,{children:"Data<T>"})," extractor to get the pool from app state and get a connection from it. This provides an owned database connection that can be passed into a ",(0,s.jsx)(n.a,{href:"https://docs.rs/actix-web/4/actix_web/web/fn.block.html",children:(0,s.jsx)(n.code,{children:"web::block"})})," closure. Then just call the action function with the necessary arguments and ",(0,s.jsx)(n.code,{children:".await"})," the result."]}),"\n",(0,s.jsxs)(n.p,{children:["This example also maps the error to an ",(0,s.jsx)(n.code,{children:"HttpResponse"})," before using the ",(0,s.jsx)(n.code,{children:"?"})," operator but this is not necessary if your return error type implements ",(0,s.jsx)(n.a,{href:"https://docs.rs/actix-web/4/actix_web/error/trait.ResponseError.html",children:(0,s.jsx)(n.code,{children:"ResponseError"})}),"."]}),"\n",(0,s.jsx)(i.A,{example:"databases",file:"main.rs",section:"index"}),"\n",(0,s.jsxs)(n.p,{children:["That's it! See the full example ",(0,s.jsx)(n.a,{href:"https://github.com/actix/examples/tree/master/databases/diesel",children:"here"}),"."]}),"\n",(0,s.jsx)(n.h1,{id:"seaorm",children:"SeaORM"}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.a,{href:"https://www.sea-ql.org/SeaORM/",children:"SeaORM"})," is a Rust ORM with full async support. When used with Actix Web, unlike Diesel, it allows you to perform database operations directly in an asynchronous manner without needing to use ",(0,s.jsx)(n.code,{children:"web::block"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["First, define your data models and functions for database operations. Using ",(0,s.jsx)(n.code,{children:"sea-orm-cli"}),", you can use a data model that is automatically generated from an existing DB definition:"]}),"\n",(0,s.jsx)(i.A,{example:"sea-orm-databases",file:"main.rs",section:"handler"}),"\n",(0,s.jsx)(n.p,{children:"Next, set up the database connection as part of your application state. SeaORM manages connection pools by default, so you don't need additional pool configuration:"}),"\n",(0,s.jsx)(i.A,{example:"sea-orm-databases",file:"main.rs",section:"main"}),"\n",(0,s.jsxs)(n.p,{children:["In your request handler, use the ",(0,s.jsx)(n.code,{children:"web::Data<DatabaseConnection>"})," extractor to get the database connection and perform async operations directly:"]}),"\n",(0,s.jsx)(i.A,{example:"sea-orm-databases",file:"main.rs",section:"index"}),"\n",(0,s.jsxs)(n.p,{children:["For a full example, please refer to ",(0,s.jsx)(n.a,{href:"https://github.com/actix/examples/tree/master/databases/sea-orm",children:"here"}),"."]})]})}function l(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},93196(e,n,t){"use strict";var r=t(18828),s=t(91987);const a=t(75739),i=({example:e,file:n,section:t,language:i})=>{const o="manifest"===n?"Cargo.toml":`src/${n??"main.rs"}`,p=a(`./${e}/${o}`).default,d=p.match(new RegExp(`(?://|#) <${t}>\n([\\s\\S]*)(?://|#) </${t}>`))?.[1];if(void 0===d)throw new Error(`Missing code section "${t}" in ${e}/${o}`);return(0,s.jsx)(r.A,{className:`language-${i??"rust"}`,children:d})};t.d(n,["A",0,i])},35806(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'[package]\nname = "application"\nversion = "1.0.0"\npublish = false\nedition.workspace = true\n\n[dependencies]\nactix-web = "4"\n'])},82541(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'#![allow(dead_code)]\n\n// <setup>\nuse actix_web::{web, App, HttpServer, Responder};\n\nasync fn index() -> impl Responder {\n "Hello world!"\n}\n\n#[actix_web::main]\nasync fn main() -> std::io::Result<()> {\n HttpServer::new(|| {\n App::new().service(\n // prefixes all resources and routes attached to it...\n web::scope("/app")\n // ...so this handles requests for `GET /app/index.html`\n .route("/index.html", web::get().to(index)),\n )\n })\n .bind(("127.0.0.1", 8080))?\n .run()\n .await\n}\n// </setup>\n'])},54695(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'#![allow(dead_code)]\n\nuse actix_web::{web, App, HttpResponse, HttpServer};\n\n// <combine>\nstruct State1;\nstruct State2;\n\n#[actix_web::main]\nasync fn main() -> std::io::Result<()> {\n HttpServer::new(|| {\n App::new()\n .service(\n web::scope("/app1")\n .app_data(web::Data::new(State1
1))\n .route("/", web::to(HttpResponse::Ok)),\n )\n .service(\n web::scope("/app2")\n .app_data(web::Data::new(State2))\n .route("/", web::to(HttpResponse::Ok)),\n )\n })\n .bind(("127.0.0.1", 8080))?\n .run()\n .await\n}\n// </combine>\n'])},35142(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'#![allow(dead_code)]\n\n// <config>\nuse actix_web::{web, App, HttpResponse, HttpServer};\n\n// this function could be located in a different module\nfn scoped_config(cfg: &mut web::ServiceConfig) {\n cfg.service(\n web::resource("/test")\n .route(web::get().to(|| async { HttpResponse::Ok().body("test") }))\n .route(web::head().to(HttpResponse::MethodNotAllowed)),\n );\n}\n\n// this function could be located in a different module\nfn config(cfg: &mut web::ServiceConfig) {\n cfg.service(\n web::resource("/app")\n .route(web::get().to(|| async { HttpResponse::Ok().body("app") }))\n .route(web::head().to(HttpResponse::MethodNotAllowed)),\n );\n}\n\n#[actix_web::main]\nasync fn main() -> std::io::Result<()> {\n HttpServer::new(|| {\n App::new()\n .configure(config)\n .service(web::scope("/api").configure(scoped_config))\n .route(\n "/",\n web::get().to(|| async { HttpResponse::Ok().body("/") }),\n )\n })\n .bind(("127.0.0.1", 8080))?\n .run()\n .await\n}\n// </config>\n'])},95185(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'use actix_web::{web, App, HttpResponse, HttpServer};\n\npub mod app;\npub mod combine;\npub mod config;\npub mod scope;\npub mod state;\npub mod vh;\n\n// <multi>\n#[actix_web::main]\nasync fn main() -> std::io::Result<()> {\n HttpServer::new(|| {\n App::new()\n .service(web::scope("/app1").route("/", web::to(HttpResponse::Ok)))\n .service(web::scope("/app2").route("/", web::to(HttpResponse::Ok)))\n .route("/", web::to(HttpResponse::Ok))\n })\n .bind(("127.0.0.1", 8080))?\n .run()\n .await\n}\n// </multi>\n'])},4906(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'// <setup_mutable>\nuse actix_web::{web, App, HttpServer};\nuse std::sync::Mutex;\n\nstruct AppStateWithCounter {\n counter: Mutex<i32>, // <- Mutex is necessary to mutate safely across threads\n}\n\nasync fn index(data: web::Data<AppStateWithCounter>) -> String {\n let mut counter = data.counter.lock().unwrap(); // <- get counter\'s MutexGuard\n *counter += 1; // <- access counter inside MutexGuard\n\n format!("Request number: {counter}") // <- response with count\n}\n// </setup_mutable>\n\n// <make_app_mutable>\n#[actix_web::main]\nasync fn main() -> std::io::Result<()> {\n // Note: web::Data created _outside_ HttpServer::new closure\n let counter = web::Data::new(AppStateWithCounter {\n counter: Mutex::new(0),\n });\n\n HttpServer::new(move || {\n // move counter into the closure\n App::new()\n .app_data(counter.clone()) // <- register the created data\n .route("/", web::get().to(index))\n })\n .bind(("127.0.0.1", 8080))?\n .run()\n .await\n}\n// </make_app_mutable>\n'])},87262(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'use actix_web::{get, web, App, HttpRequest, Responder};\n\n#[get("/show")]\nasync fn show_users(_req: HttpRequest) -> impl Responder {\n "unimplemented!"\n}\n\n// <scope>\n#[actix_web::main]\nasync fn main() {\n let scope = web::scope("/users").service(show_users);\n App::new().service(scope);\n}\n// </scope>\n'])},48039(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'// <setup>\nuse actix_web::{get, web, App, HttpServer};\n\n// This struct represents state\nstruct AppState {\n app_name: String,\n}\n\n#[get("/")]\nasync fn index(data: web::Data<AppState>) -> String {\n let app_name = &data.app_name; // <- get app_name\n format!("Hello {app_name}!") // <- response with app_name\n}\n// </setup>\n\n// <start_app>\n#[actix_web::main]\nasync fn main() -> std::io::Result<()> {\n HttpServer::new(|| {\n App::new()\n .app_data(web::Data::new(AppState {\n app_name: String::from("Actix Web"),\n }))\n .service(index)\n })\n .bind(("127.0.0.1", 8080))?\n .run()\n .await\n}\n// </start_app>\n'])},77954(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'use actix_web::{guard, web, App, HttpResponse, HttpServer};\n\n// <vh>\n#[actix_web::main]\nasync fn main() -> std::io::Result<()> {\n HttpServer::new(|| {\n App::new()\n .service(\n web::scope("/")\n .guard(guard::Host("www.rust-lang.org"))\n .route("", web::to(|| async { HttpResponse::Ok().body("www") })),\n )\n .service(\n web::scope("/")\n .guard(guard::Host("users.rust-lang.org"))\n .route("", web::to(|| async { HttpResponse::Ok().body("user") })),\n )\n .route("/", web::to(HttpResponse::Ok))\n })\n .bind(("127.0.0.1", 8080))?\n .run()\n .await\n}\n// </vh>\n'])},84820(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'[package]\nname = "async-handlers"\nversion = "1.0.0"\npublish = false\nedition.workspace = true\n\n[dependencies]\nactix-web = "4"\nfutures = "0.3"\n'])},84403(e,n,t){"use strict";t.r(n);t.d(n,["default",0,"pub mod stream;\n\nfn main() {}\n"])},38178(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'// <stream>\nuse actix_web::{get, web, App, Error, HttpResponse, HttpServer};\nuse futures::{future::ok, stream::once};\n\n#[get("/stream")]\nasync fn stream() -> HttpResponse {\n let body = once(ok::<_, Error>(web::Bytes::from_static(b"test")));\n\n HttpResponse::Ok()\n .content_type("application/json")\n .streaming(body)\n}\n\n#[actix_web::main]\nasync fn main() -> std::io::Result<()> {\n HttpServer::new(|| App::new().service(stream))\n .bind(("127.0.0.1", 8080))?\n .run()\n .await\n}\n// </stream>\n'])},97106(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'[package]\nname = "databases"\nversion = "1.0.0"\npublish = false\nedition.workspace = true\n\n[dependencies]\nactix-web = "4"\ndiesel = { version = "2", features = ["sqlite", "r2d2"] }\nserde = { version = "1", features = ["derive"] }\nuuid = { version = "1", features = ["v4"] }\n'])},32789(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'use std::io;\n\nuse actix_web::{error, web, App, HttpResponse, HttpServer, Responder};\nuse diesel::{prelude::*, r2d2, Insertable, Queryable, SqliteConnection};\nuse serde::Serialize;\n\nmod schema {\n diesel::table! {\n users {\n id -> VarChar,\n name -> VarChar,\n }\n }\n}\n\n#[derive(Debug, Serialize, Queryable)]\nstruct User {\n id: String,\n name: String,\n}\n\n// <handler>\n#[derive(Debug, Insertable)]\n#[diesel(table_name = self::schema::users)]\nstruct NewUser<\'a> {\n id: &\'a str,\n name: &\'a str,\n}\n\nfn insert_new_user(\n conn: &mut SqliteConnection,\n user_name: String,\n) ->
1 diesel::QueryResult<User> {\n use crate::schema::users::dsl::*;\n\n // Create insertion model\n let uid = format!("{}", uuid::Uuid::new_v4());\n let new_user = NewUser {\n id: &uid,\n name: &user_name,\n };\n\n // normal diesel operations\n diesel::insert_into(users)\n .values(&new_user)\n .execute(conn)\n .expect("Error inserting person");\n\n let user = users\n .filter(id.eq(&uid))\n .first::<User>(conn)\n .expect("Error loading person that was just inserted");\n\n Ok(user)\n}\n// </handler>\n\n// <main>\ntype DbPool = r2d2::Pool<r2d2::ConnectionManager<SqliteConnection>>;\n\n#[actix_web::main]\nasync fn main() -> io::Result<()> {\n // connect to SQLite DB\n let manager = r2d2::ConnectionManager::<SqliteConnection>::new("app.db");\n let pool = r2d2::Pool::builder()\n .build(manager)\n .expect("database URL should be valid path to SQLite DB file");\n\n // start HTTP server on port 8080\n HttpServer::new(move || {\n App::new()\n .app_data(web::Data::new(pool.clone()))\n .route("/{name}", web::get().to(index))\n })\n .bind(("127.0.0.1", 8080))?\n .run()\n .await\n}\n// </main>\n\n// <index>\nasync fn index(\n pool: web::Data<DbPool>,\n name: web::Path<(String,)>,\n) -> actix_web::Result<impl Responder> {\n let (name,) = name.into_inner();\n\n let user = web::block(move || {\n // Obtaining a connection from the pool is also a potentially blocking operation.\n // So, it should be called within the `web::block` closure, as well.\n let mut conn = pool.get().expect("couldn\'t get db connection from pool");\n\n insert_new_user(&mut conn, name)\n })\n .await?\n .map_err(error::ErrorInternalServerError)?;\n\n Ok(HttpResponse::Ok().json(user))\n}\n// </index>\n'])},88681(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'[package]\nname = "easy-form-handling"\nversion = "1.0.0"\npublish = false\nedition.workspace = true\n\n[dependencies]\nactix-web = "4"\nserde = { version = "1", features = ["derive"] }\n'])},63800(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'use actix_web::{web, App, HttpResponse, HttpServer, Responder};\nuse serde::Deserialize;\nuse actix_web::web::{Either, Json, Form};\n\n// <easy-form-handling>\n#[derive(Deserialize)]\nstruct Register {\n username: String,\n country: String,\n}\n\n// register form is JSON\nasync fn json_register(form: web::Json<Register>) -> impl Responder {\n format!("Hello {} from {}!", form.username, form.country)\n}\n\n// register form can be either JSON or URL-encoded\nasync fn register(form: Either<Json<Register>, Form<Register>>) -> impl Responder {\n let Register { username, country } = form.into_inner();\n format!("Hello {username} from {country}!")\n}\n// </easy-form-handling>\n\nasync fn index() -> HttpResponse {\n HttpResponse::Ok()\n .content_type("text/html; charset=utf-8")\n .body(include_str!("../static/form.html"))\n}\n\n#[actix_web::main]\nasync fn main() -> std::io::Result<()> {\n HttpServer::new(|| {\n App::new()\n .route("/", web::get().to(index))\n .route("/register", web::post().to(register))\n .route("/json_register", web::post().to(json_register))\n })\n .bind(("127.0.0.1", 8080))?\n .run()\n .await\n}\n'])},29619(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'[package]\nname = "either"\nversion = "1.0.0"\npublish = false\nedition.workspace = true\n\n[dependencies]\nactix-web = "4"\n'])},96854(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'// <either>\nuse actix_web::{Either, Error, HttpResponse};\n\ntype RegisterResult = Either<HttpResponse, Result<&\'static str, Error>>;\n\nasync fn index() -> RegisterResult {\n if is_a_variant() {\n // choose Left variant\n Either::Left(HttpResponse::BadRequest().body("Bad data"))\n } else {\n // choose Right variant\n Either::Right(Ok("Hello!"))\n }\n}\n// </either>\n\n#[actix_web::main]\nasync fn main() -> std::io::Result<()> {\n use actix_web::{web, App, HttpServer};\n\n HttpServer::new(|| App::new().route("/", web::get().to(index)))\n .bind(("127.0.0.1", 8080))?\n .run()\n .await\n}\n\nfn is_a_variant() -> bool {\n true\n}\n'])},34841(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'[package]\nname = "my_errors"\nversion = "1.0.0"\npublish = false\nedition.workspace = true\n\n[dependencies]\nactix-web = "4"\nderive_more = { version = "2", features = ["display", "error"] }\nenv_logger = "0.11"\nlog = "0.4"\n'])},69172(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'// <helpers>\nuse actix_web::{error, get, App, HttpServer};\n\n#[derive(Debug)]\nstruct MyError {\n name: &\'static str,\n}\n\n#[get("/")]\nasync fn index() -> actix_web::Result<String> {\n let result = Err(MyError { name: "test error" });
1\n\n result.map_err(|err| error::ErrorBadRequest(err.name))\n}\n// </helpers>\n\n#[actix_web::main]\nasync fn main() -> std::io::Result<()> {\n HttpServer::new(|| App::new().service(index))\n .bind(("127.0.0.1", 8080))?\n .run()\n .await\n}\n'])},104(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'// <logging>\nuse actix_web::{error, get, middleware::Logger, App, HttpServer, Result};\nuse derive_more::derive::{Display, Error};\nuse log::info;\n\n#[derive(Debug, Display, Error)]\n#[display("my error: {name}")]\npub struct MyError {\n name: &\'static str,\n}\n\n// Use default implementation for `error_response()` method\nimpl error::ResponseError for MyError {}\n\n#[get("/")]\nasync fn index() -> Result<&\'static str, MyError> {\n let err = MyError { name: "test error" };\n info!("{}", err);\n Err(err)\n}\n\n#[rustfmt::skip]\n#[actix_web::main]\nasync fn main() -> std::io::Result<()> {\n unsafe {\n std::env::set_var("RUST_LOG", "info");\n std::env::set_var("RUST_BACKTRACE", "1");\n }\n env_logger::init();\n\n HttpServer::new(|| {\n let logger = Logger::default();\n\n App::new()\n .wrap(logger)\n .service(index)\n })\n .bind(("127.0.0.1", 8080))?\n .run()\n .await\n}\n// </logging>\n'])},53896(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'pub mod helpers;\npub mod logging;\npub mod override_error;\npub mod recommend_one;\npub mod recommend_two;\n\n// <response-error>\nuse actix_web::{error, Result};\nuse derive_more::derive::{Display, Error};\n\n#[derive(Debug, Display, Error)]\n#[display("my error: {name}")]\nstruct MyError {\n name: &\'static str,\n}\n\n// Use default implementation for `error_response()` method\nimpl error::ResponseError for MyError {}\n\nasync fn index() -> Result<&\'static str, MyError> {\n Err(MyError { name: "test" })\n}\n// </response-error>\n\n#[actix_web::main]\nasync fn main() -> std::io::Result<()> {\n use actix_web::{web, App, HttpServer};\n\n HttpServer::new(|| App::new().route("/", web::get().to(index)))\n .bind(("127.0.0.1", 8080))?\n .run()\n .await\n}\n'])},74116(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'// <override>\nuse actix_web::{\n error, get,\n http::{header::ContentType, StatusCode},\n App, HttpResponse,\n};\nuse derive_more::derive::{Display, Error};\n\n#[derive(Debug, Display, Error)]\nenum MyError {\n #[display("internal error")]\n InternalError,\n\n #[display("bad request")]\n BadClientData,\n\n #[display("timeout")]\n Timeout,\n}\n\nimpl error::ResponseError for MyError {\n fn error_response(&self) -> HttpResponse {\n HttpResponse::build(self.status_code())\n .insert_header(ContentType::html())\n .body(self.to_string())\n }\n\n fn status_code(&self) -> StatusCode {\n match *self {\n MyError::InternalError => StatusCode::INTERNAL_SERVER_ERROR,\n MyError::BadClientData => StatusCode::BAD_REQUEST,\n MyError::Timeout => StatusCode::GATEWAY_TIMEOUT,\n }\n }\n}\n\n#[get("/")]\nasync fn index() -> Result<&\'static str, MyError> {\n Err(MyError::BadClientData)\n}\n// </override>\n\n#[get("/e2")]\nasync fn error2() -> Result<&\'static str, MyError> {\n Err(MyError::InternalError)\n}\n\n#[get("/e3")]\nasync fn error3() -> Result<&\'static str, MyError> {\n Err(MyError::Timeout)\n}\n\n#[actix_web::main]\nasync fn main() -> std::io::Result<()> {\n use actix_web::HttpServer;\n\n HttpServer::new(|| App::new().service(index).service(error2).service(error3))\n .bind(("127.0.0.1", 8080))?\n .run()\n .await\n}\n'])},23988(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'// <recommend-one>\nuse actix_web::{\n error, get,\n http::{header::ContentType, StatusCode},\n App, HttpResponse, HttpServer,\n};\nuse derive_more::derive::{Display, Error};\n\n#[derive(Debug, Display, Error)]\nenum UserError {\n #[display("Validation error on field: {field}")]\n ValidationError { field: String },\n}\n\nimpl error::ResponseError for UserError {\n fn error_response(&self) -> HttpResponse {\n HttpResponse::build(self.status_code())\n .insert_header(ContentType::html())\n .body(self.to_string())\n }\n fn status_code(&self) -> StatusCode {\n match *self {\n UserError::ValidationError { .. } => StatusCode::BAD_REQUEST,\n }\n }\n}\n// </recommend-one>\n\n#[get("/")]\nasync fn index() -> Result<&\'static str, UserError> {\n Err(UserError::ValidationError {\n field: "bad stuff".to_string(),\n })\n}\n\n#[actix_web::main]\nasync fn main() -> std::io::Result<()> {\n HttpServer::new(|| App::new().service(index))\n .bind(("127.0.0.1", 8080))?\n .run()\n .await\n}\n'])},14122(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'// <recommend-two>\nuse actix_web::{\n error, get,\n http::{header::ContentType, StatusCode},\n App, HttpResponse, HttpServer,\n};\nuse derive_more::derive::{Display, Error};\n\n#[derive(Debug, Display, Error)]\nenum UserError {\n #[display("An internal error occurred. Please try again later.")]\n InternalError,\n}\n\nimpl error::ResponseError for UserError {\n fn error_response(&self) -> HttpResponse {\n HttpResponse::build(self.status_code())\n .insert_header(ContentType::html())\n .body(self.to_string())\n }\n\n fn status_code(&self) -> StatusCode {\n match *self {\n UserError::InternalError =>
1 StatusCode::INTERNAL_SERVER_ERROR,\n }\n }\n}\n\n#[get("/")]\nasync fn index() -> Result<&\'static str, UserError> {\n do_thing_that_fails().map_err(|_e| UserError::InternalError)?;\n Ok("success!")\n}\n// </recommend-two>\n\nfn do_thing_that_fails() -> Result<(), std::io::Error> {\n Err(std::io::Error::new(std::io::ErrorKind::Other, "some error"))\n}\n\n#[actix_web::main]\nasync fn main() -> std::io::Result<()> {\n HttpServer::new(|| App::new().service(index))\n .bind(("127.0.0.1", 8080))?\n .run()\n .await\n}\n'])},21135(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'[package]\nname = "extractors"\nversion = "1.0.0"\npublish = false\nedition.workspace = true\n\n[dependencies]\nactix-web = "4"\nserde = "1"\n'])},95509(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'// <form>\nuse actix_web::{post, web, App, HttpServer, Result};\nuse serde::Deserialize;\n\n#[derive(Deserialize)]\nstruct FormData {\n username: String,\n}\n\n/// extract form data using serde\n/// this handler gets called only if the content type is *x-www-form-urlencoded*\n/// and the content of the request could be deserialized to a `FormData` struct\n#[post("/")]\nasync fn index(form: web::Form<FormData>) -> Result<String> {\n Ok(format!("Welcome {}!", form.username))\n}\n// </form>\n\n#[actix_web::main]\nasync fn main() -> std::io::Result<()> {\n HttpServer::new(|| App::new().service(index))\n .bind(("127.0.0.1", 8080))?\n .run()\n .await\n}\n'])},27636(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'// <form-optional>\nuse actix_web::{post, web, App, HttpServer, Result};\nuse serde::Deserialize;\n\n#[derive(Deserialize)]\nstruct FormData {\n username: String,\n}\n\n/// accept form data when it is present and valid\n#[post("/maybe")]\nasync fn maybe(form: Option<web::Form<FormData>>) -> Result<String> {\n let Some(form) = form else {\n return Ok("Missing or invalid form data.".to_string());\n };\n\n Ok(format!("Welcome {}!", form.username))\n}\n// </form-optional>\n\n#[actix_web::main]\nasync fn main() -> std::io::Result<()> {\n HttpServer::new(|| App::new().service(maybe))\n .bind(("127.0.0.1", 8080))?\n .run()\n .await\n}\n'])},35114(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'// <json-one>\nuse actix_web::{post, web, App, HttpServer, Result};\nuse serde::Deserialize;\n\n#[derive(Deserialize)]\nstruct Info {\n username: String,\n}\n\n/// deserialize `Info` from request\'s body\n#[post("/submit")]\nasync fn submit(info: web::Json<Info>) -> Result<String> {\n Ok(format!("Welcome {}!", info.username))\n}\n// </json-one>\n\n#[actix_web::main]\nasync fn main() -> std::io::Result<()> {\n HttpServer::new(|| App::new().service(submit))\n .bind(("127.0.0.1", 8080))?\n .run()\n .await\n}\n'])},52464(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'#![allow(dead_code)]\n\n// <json-two>\nuse actix_web::{error, web, App, HttpResponse, HttpServer, Responder};\nuse serde::Deserialize;\n\n#[derive(Deserialize)]\nstruct Info {\n username: String,\n}\n\n/// deserialize `Info` from request\'s body, max payload size is 4kb\nasync fn index(info: web::Json<Info>) -> impl Responder {\n format!("Welcome {}!", info.username)\n}\n\n#[actix_web::main]\nasync fn main() -> std::io::Result<()> {\n HttpServer::new(|| {\n let json_config = web::JsonConfig::default()\n .limit(4096)\n .error_handler(|err, _req| {\n // create custom error response\n error::InternalError::from_response(err, HttpResponse::Conflict().finish())\n .into()\n });\n\n App::new().service(\n web::resource("/")\n // change json extractor configuration\n .app_data(json_config)\n .route(web::post().to(index)),\n )\n })\n .bind(("127.0.0.1", 8080))?\n .run()\n .await\n}\n// </json-two>\n'])},84242(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'use actix_web::{web, App, FromRequest, HttpRequest, HttpServer, Responder};\nuse serde::Deserialize;\n\n// pub mod custom_handler;\npub mod form;\npub mod form_optional;\npub mod json_one;\npub mod json_two;\npub mod multiple;\npub mod path_one;\npub mod path_three;\npub mod path_two;\npub mod query;\n\n#[derive(Deserialize, Debug)]\nstruct MyInfo {\n username: String,\n id: u32,\n}\n\n// <option-one>\nasync fn index(path: web::Path<(String, String)>, json: web::Json<MyInfo>) -> impl Responder {\n let path = path.into_inner();\n format!("{} {} {} {}", path.0, path.1, json.id, json.username)\n}\n// </option-one>\n\n// <option-two>\nasync fn extract(req: HttpRequest) -> impl Responder {\n let params = web::Path::<(String, String)>::extract(&req)\n .await\n .unwrap()\n .into_inner();\n\n let info = web::Json::<MyInfo>::extract(&req)\n .await\n .expect("Err with reading json.");\n\n format!("{} {} {} {}", params.0, params.1, info.username, info.id)\n}\n// </option-two>\n\n#[actix_web::main]\nasync fn main() -> std::io::Result<()> {\n HttpServer::new(|| {\n App::new()\n .route("/{name}/{id}", web::post().to(index))\n .route("/{name}/{id}/extract", web::post().to(extract))\n })\n .bind(("127.0.0.1", 8080))?\n .run()\n .await\n}\n'])},29391(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'// <multi>\nuse actix_web::{get, web};\nuse serde::Deserialize;\n\n#[derive(Deserialize)]\nstruct Info {\n username: String,\n}\n\n#[get("/users/{user_id}/{friend}")] // <- define path parameters\nasync fn index(path: web::Path<(u32, Str
1ing)>, query: web::Query<Info>) -> String {\n let (user_id, friend) = path.into_inner();\n format!(\n "Welcome {}, friend {}, user_id {}!",\n query.username, friend, user_id\n )\n}\n\n#[actix_web::main]\nasync fn main() -> std::io::Result<()> {\n use actix_web::{App, HttpServer};\n\n HttpServer::new(|| App::new().service(index))\n .bind(("127.0.0.1", 8080))?\n .run()\n .await\n}\n// </multi>\n'])},47639(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'// <path-one>\nuse actix_web::{get, web, App, HttpServer, Result};\n\n/// extract path info from "/users/{user_id}/{friend}" url\n/// {user_id} - deserializes to a u32\n/// {friend} - deserializes to a String\n#[get("/users/{user_id}/{friend}")] // <- define path parameters\nasync fn index(path: web::Path<(u32, String)>) -> Result<String> {\n let (user_id, friend) = path.into_inner();\n Ok(format!("Welcome {}, user_id {}!", friend, user_id))\n}\n\n#[actix_web::main]\nasync fn main() -> std::io::Result<()> {\n HttpServer::new(|| App::new().service(index))\n .bind(("127.0.0.1", 8080))?\n .run()\n .await\n}\n// </path-one>\n'])},4771(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'use actix_web::{get, HttpRequest, Result};\n\n// <path-three>\n#[get("/users/{user_id}/{friend}")] // <- define path parameters\nasync fn index(req: HttpRequest) -> Result<String> {\n let name: String = req.match_info().get("friend").unwrap().parse().unwrap();\n let userid: i32 = req.match_info().query("user_id").parse().unwrap();\n\n Ok(format!("Welcome {}, user_id {}!", name, userid))\n}\n\n#[actix_web::main]\nasync fn main() -> std::io::Result<()> {\n use actix_web::{App, HttpServer};\n\n HttpServer::new(|| App::new().service(index))\n .bind(("127.0.0.1", 8080))?\n .run()\n .await\n}\n// </path-three>\n'])},59993(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'// <path-two>\nuse actix_web::{get, web, Result};\nuse serde::Deserialize;\n\n#[derive(Deserialize)]\nstruct Info {\n user_id: u32,\n friend: String,\n}\n\n/// extract path info using serde\n#[get("/users/{user_id}/{friend}")] // <- define path parameters\nasync fn index(info: web::Path<Info>) -> Result<String> {\n Ok(format!(\n "Welcome {}, user_id {}!",\n info.friend, info.user_id\n ))\n}\n\n#[actix_web::main]\nasync fn main() -> std::io::Result<()> {\n use actix_web::{App, HttpServer};\n\n HttpServer::new(|| App::new().service(index))\n .bind(("127.0.0.1", 8080))?\n .run()\n .await\n}\n// </path-two>\n'])},72559(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'// <query>\nuse actix_web::{get, web, App, HttpServer};\nuse serde::Deserialize;\n\n#[derive(Deserialize)]\nstruct Info {\n username: String,\n}\n\n// this handler gets called if the query deserializes into `Info` successfully\n// otherwise a 400 Bad Request error response is returned\n#[get("/")]\nasync fn index(info: web::Query<Info>) -> String {\n format!("Welcome {}!", info.username)\n}\n// </query>\n\n#[actix_web::main]\nasync fn main() -> std::io::Result<()> {\n HttpServer::new(|| App::new().service(index))\n .bind(("127.0.0.1", 8080))?\n .run()\n .await\n}\n'])},67141(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'[package]\nname = "flexible-responders"\nversion = "1.0.0"\npublish = false\nedition.workspace = true\n\n[dependencies]\nactix-web = "4"\nserde = "1"\n'])},88884(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'use actix_web::{web, App, HttpServer, Responder};\nuse serde::Serialize;\n\n// <flexible-responders>\n#[derive(Serialize)]\nstruct Measurement {\n temperature: f32,\n}\n\nasync fn hello_world() -> impl Responder {\n "Hello World!"\n}\n\nasync fn current_temperature() -> impl Responder {\n web::Json(Measurement { temperature: 42.3 })\n}\n// </flexible-responders>\n\n#[actix_web::main]\nasync fn main() -> std::io::Result<()> {\n HttpServer::new(|| {\n App::new()\n .service(web::resource("/").to(hello_world))\n .service(web::resource("/temp").to(current_temperature))\n })\n .bind(("127.0.0.1", 8080))?\n .run()\n .await\n}\n'])},11308(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'[package]\nname = "getting-started"\nversion = "1.0.0"\npublish = false\nedition.workspace = true\n\n[dependencies]\nactix-web = "4"\n'])},57467(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'// <handlers>\nuse actix_web::{get, post, web, App, HttpResponse, HttpServer, Responder};\n\n#[get("/")]\nasync fn hello() -> impl Responder {\n HttpResponse::Ok().body("Hello world!")\n}\n\n#[post("/echo")]\nasync fn echo(req_body: String) -> impl Responder {\n HttpResponse::Ok().body(req_body)\n}\n\nasync fn manual_hello() -> impl Responder {\n HttpResponse::Ok().body("Hey there!")\n}\n// </handlers>\n\n// <main>\n#[actix_web::main]\nasync fn main() -> std::io::Result<()> {\n HttpServer::new(|| {\n App::new()\n .service(hello)\n .service(echo)\n .route("/hey", web::get().to(manual_hello))\n })\n .bind(("127.0.0.1", 8080))?\n .run()\n .await\n}\n// </main>\n'])},69294(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'[package]\nname = "http2"\nversion = "1.0.0"\npublish = false\nedition.workspace = true\n\n# <deps>\n[dependencies]\nactix-web = { version = "4", features = ["rustls-0_23"] }\nrustls = "0.23"\nrustls-pemfile = "2"\n# </deps>\n'])},5953(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'use std::{fs::File, io::BufReader};\n\n// <main>\nuse actix_web::{web, App, HttpRequest, HttpServer, Responder};\n\nasync fn index(_req: HttpRequest) -> impl Responder {\n "Hello TLS World!"\n}\n\n#[actix_web::main]\nasync fn main() -> std::io::Result<()> {\n rustls::crypto::aws_lc_rs::default_provider()\n .install_default()\n .unwrap();\n\n let mut certs_file = BufReader::new(File::open("cert.pem").unwrap());\n let mut key_file = BufReader::new(File::open("key.pem").unwrap());
1\n\n // load TLS certs and key\n // to create a self-signed temporary cert for testing:\n // `openssl req -x509 -newkey rsa:4096 -nodes -keyout key.pem -out cert.pem -days 365 -subj \'/CN=localhost\'`\n let tls_certs = rustls_pemfile::certs(&mut certs_file)\n .collect::<Result<Vec<_>, _>>()\n .unwrap();\n let tls_key = rustls_pemfile::pkcs8_private_keys(&mut key_file)\n .next()\n .unwrap()\n .unwrap();\n\n // set up TLS config options\n let tls_config = rustls::ServerConfig::builder()\n .with_no_client_auth()\n .with_single_cert(tls_certs, rustls::pki_types::PrivateKeyDer::Pkcs8(tls_key))\n .unwrap();\n\n HttpServer::new(|| App::new().route("/", web::get().to(index)))\n .bind_rustls_0_23(("127.0.0.1", 8443), tls_config)?\n .run()\n .await\n}\n// </main>\n'])},8768(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'[package]\nname = "main-example"\nversion = "1.0.0"\npublish = false\nedition.workspace = true\n\n[dependencies]\nactix-web = "4"\n'])},13887(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'// <main-example>\nuse actix_web::{web, App, HttpRequest, HttpServer, Responder};\n\nasync fn greet(req: HttpRequest) -> impl Responder {\n let name = req.match_info().get("name").unwrap_or("World");\n format!("Hello {}!", &name)\n}\n\n#[actix_web::main]\nasync fn main() -> std::io::Result<()> {\n HttpServer::new(|| {\n App::new()\n .route("/", web::get().to(greet))\n .route("/{name}", web::get().to(greet))\n })\n .bind(("127.0.0.1", 8080))?\n .run()\n .await\n}\n// </main-example>\n'])},45310(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'[package]\nname = "middleware"\nversion = "1.0.0"\npublish = false\nedition.workspace = true\n\n[dependencies]\nactix-session = { version = "0.11", features = ["cookie-session"] }\nactix-web = "4"\nenv_logger = "0.11"\nfutures-util = { version = "0.3.31", default-features = false, features = ["std"] }\n'])},90802(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'// <default-headers>\nuse actix_web::{http::Method, middleware, web, App, HttpResponse, HttpServer};\n\n#[actix_web::main]\nasync fn main() -> std::io::Result<()> {\n HttpServer::new(|| {\n App::new()\n .wrap(middleware::DefaultHeaders::new().add(("X-Version", "0.2")))\n .service(\n web::resource("/test")\n .route(web::get().to(HttpResponse::Ok))\n .route(web::method(Method::HEAD).to(HttpResponse::MethodNotAllowed)),\n )\n })\n .bind(("127.0.0.1", 8080))?\n .run()\n .await\n}\n// </default-headers>\n'])},94586(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'#![allow(dead_code)]\n\n// <error-handler>\nuse actix_web::middleware::{ErrorHandlerResponse, ErrorHandlers};\nuse actix_web::{\n dev,\n http::{header, StatusCode},\n web, App, HttpResponse, HttpServer, Result,\n};\n\nfn add_error_header<B>(mut res: dev::ServiceResponse<B>) -> Result<ErrorHandlerResponse<B>> {\n res.response_mut().headers_mut().insert(\n header::CONTENT_TYPE,\n header::HeaderValue::from_static("Error"),\n );\n\n Ok(ErrorHandlerResponse::Response(res.map_into_left_body()))\n}\n\n#[actix_web::main]\nasync fn main() -> std::io::Result<()> {\n HttpServer::new(|| {\n App::new()\n .wrap(\n ErrorHandlers::new()\n .handler(StatusCode::INTERNAL_SERVER_ERROR, add_error_header),\n )\n .service(web::resource("/").route(web::get().to(HttpResponse::InternalServerError)))\n })\n .bind(("127.0.0.1", 8080))?\n .run()\n .await\n}\n// </error-handler>\n'])},53351(e,n,t){"use strict";t.r(n);t.d(n,["default",0,"#![allow(dead_code, unused_variables)]\n\n// <from-fn>\nuse actix_web::{\n body::MessageBody,\n dev::{ServiceRequest, ServiceResponse},\n middleware::{from_fn, Next},\n App, Error,\n};\n\nasync fn my_middleware(\n req: ServiceRequest,\n next: Next<impl MessageBody>,\n) -> Result<ServiceResponse<impl MessageBody>, Error> {\n // pre-processing\n next.call(req).await\n // post-processing\n}\n\n#[actix_web::main]\nasync fn main() {\n let app = App::new().wrap(from_fn(my_middleware));\n}\n// </from-fn>\n"])},42380(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'// <logger>\nuse actix_web::middleware::Logger;\nuse env_logger::Env;\n\n#[actix_web::main]\nasync fn main() -> std::io::Result<()> {\n use actix_web::{App, HttpServer};\n\n env_logger::init_from_env(Env::default().default_filter_or("info"));\n\n HttpServer::new(|| {\n App::new()\n .wrap(Logger::default())\n .wrap(Logger::new("%a %{User-Agent}i"))\n })\n .bind(("127.0.0.1", 8080))?\n .run()\n .await\n}\n// </logger>\n'])},2673(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'pub mod default_headers;\npub mod errorhandler;\npub mod from_fn;\npub mod logger;\npub mod user_sessions;\npub mod wrap_fn;\n\n// <simple>\nuse std::future::{ready, Ready};\n\nuse actix_web::{\n dev::{forward_ready, Service, ServiceRequest, ServiceResponse, Transform},\n Error,\n};\nuse futures_util::future::LocalBoxFuture;\n\n// There are two steps in middleware processing.\n// 1. Middleware initialization, middleware factory gets called with\n// next service in chain as parameter.\n// 2. Middleware\'s call method gets called with normal request.\npub struct SayHi;\n\n// Middleware factory is `Transform` trait\n// `S` - type of the next service\n// `B` - type of response\'s body\nimpl<S, B> Transform<S, ServiceRequest> for SayHi\nwhere\n S: Service<ServiceRequest, Response = ServiceResponse<B>, Error = Error>
1,\n S::Future: \'static,\n B: \'static,\n{\n type Response = ServiceResponse<B>;\n type Error = Error;\n type InitError = ();\n type Transform = SayHiMiddleware<S>;\n type Future = Ready<Result<Self::Transform, Self::InitError>>;\n\n fn new_transform(&self, service: S) -> Self::Future {\n ready(Ok(SayHiMiddleware { service }))\n }\n}\n\npub struct SayHiMiddleware<S> {\n service: S,\n}\n\nimpl<S, B> Service<ServiceRequest> for SayHiMiddleware<S>\nwhere\n S: Service<ServiceRequest, Response = ServiceResponse<B>, Error = Error>,\n S::Future: \'static,\n B: \'static,\n{\n type Response = ServiceResponse<B>;\n type Error = Error;\n type Future = LocalBoxFuture<\'static, Result<Self::Response, Self::Error>>;\n\n forward_ready!(service);\n\n fn call(&self, req: ServiceRequest) -> Self::Future {\n println!("Hi from start. You requested: {}", req.path());\n\n let fut = self.service.call(req);\n\n Box::pin(async move {\n let res = fut.await?;\n\n println!("Hi from response");\n Ok(res)\n })\n }\n}\n// </simple>\n\n#[actix_web::main]\nasync fn main() -> std::io::Result<()> {\n use actix_web::{web, App, HttpServer};\n\n HttpServer::new(|| {\n App::new().wrap(SayHi).service(\n web::resource("/").to(|| async {\n "Hello, middleware! Check the console where the server is run."\n }),\n )\n })\n .bind(("127.0.0.1", 8080))?\n .run()\n .await\n}\n'])},77175(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'#![allow(dead_code)]\n\n// <user-session>\nuse actix_session::{Session, SessionMiddleware, storage::CookieSessionStore};\nuse actix_web::{web, App, Error, HttpResponse, HttpServer, cookie::Key};\n\nasync fn index(session: Session) -> Result<HttpResponse, Error> {\n // access session data\n if let Some(count) = session.get::<i32>("counter")? {\n session.insert("counter", count + 1)?;\n } else {\n session.insert("counter", 1)?;\n }\n\n Ok(HttpResponse::Ok().body(format!(\n "Count is {:?}!",\n session.get::<i32>("counter")?.unwrap()\n )))\n}\n\n#[actix_web::main]\nasync fn main() -> std::io::Result<()> {\n HttpServer::new(|| {\n App::new()\n .wrap(\n // create cookie based session middleware\n SessionMiddleware::builder(CookieSessionStore::default(), Key::from(&[0; 64]))\n .cookie_secure(false)\n .build()\n )\n .service(web::resource("/").to(index))\n })\n .bind(("127.0.0.1", 8080))?\n .run()\n .await\n}\n// </user-session>\n'])},53283(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'#![allow(dead_code, unused_variables)]\n\n// <wrap-fn>\nuse actix_web::{dev::Service as _, web, App};\nuse futures_util::future::FutureExt;\n\n#[actix_web::main]\nasync fn main() {\n let app = App::new()\n .wrap_fn(|req, srv| {\n println!("Hi from start. You requested: {}", req.path());\n srv.call(req).map(|res| {\n println!("Hi from response");\n res\n })\n })\n .route(\n "/index.html",\n web::get().to(|| async { "Hello, middleware!" }),\n );\n}\n// </wrap-fn>\n'])},19886(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'[package]\nname = "powerful-extractors"\nversion = "1.0.0"\npublish = false\nedition.workspace = true\n\n[dependencies]\nactix-web = "4"\nserde = "1"\n'])},2561(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'use actix_web::{web, App, HttpResponse, HttpServer, Responder};\nuse serde::{Deserialize, Serialize};\n\n// <powerful-extractors>\n#[derive(Deserialize, Serialize)]\nstruct Event {\n id: Option<i32>,\n timestamp: f64,\n kind: String,\n tags: Vec<String>,\n}\n\nasync fn capture_event(evt: web::Json<Event>) -> impl Responder {\n let new_event = store_in_db(evt.timestamp, &evt.kind, &evt.tags);\n format!("got event {}", new_event.id.unwrap())\n}\n// </powerful-extractors>\n\nfn store_in_db(timestamp: f64, kind: &str, tags: &[String]) -> Event {\n // store item in db and get new_event\n // use id to lookup item\n Event {\n id: Some(1),\n timestamp,\n kind: kind.to_string(),\n tags: tags.to_vec(),\n }\n}\n\n\nasync fn index() -> HttpResponse {\n HttpResponse::Ok()\n .content_type("text/html; charset=utf-8")\n .body(include_str!("../static/form.html"))\n}\n\n#[actix_web::main]\nasync fn main() -> std::io::Result<()> {\n HttpServer::new(|| {\n App::new()\n .route("/", web::get().to(index))\n .route("/event", web::post().to(capture_event))\n })\n .bind(("127.0.0.1", 8080))?\n .run()\n .await\n}\n'])},92895(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'[package]\nname = "request-handlers"\nversion = "1.0.0"\npublish = false\nedition.workspace = true\n\n[dependencies]\nactix-web = "4"\n'])},39529(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'// <arc>\nuse actix_web::{get, web, App, HttpServer, Responder};\nuse std::{\n cell::Cell,\n sync::atomic::{AtomicUsize, Ordering},\n sync::Arc,\n};\n\n#[derive(Clone)]\nstruct AppState {\n local_count: Cell<usize>,\n global_count: Arc<AtomicUsize>,\n}\n\n#[get("/")]\nasync fn show_count(data: web::Data<AppState>) -> impl Responder {\n format!(\n "global_count: {}\\nlocal_count: {}",\n data.global_count.load(Ordering::Relaxed),\n data.local_count.get()\n )\n}\n\n#[get("/add")]\nasync fn add_one(data: web::Data<AppState>) -> impl Responder {\n data.global_count.fetch_add(1, Ordering::Relaxed);\n\n let local_count = data.local_count.get();\n data.local_count.set(local_count + 1);\n\n format!(\n "global_count: {}\\nlocal_count: {}",\n data.global_count.load(Ordering::Relaxed),\n data.local_count.get()\n )\n}\n\n#[actix_web::main]\nasync fn main() -> std::io::Result<()> {\n let data = AppState {\n local_count: Cell::new(0),\n global_count: Arc::new(AtomicUsize::new(0)),\n };\n\n HttpServer::new(move || {\n App::new()\n .app_data(web::Data::new(data.clone()))\n .service(show_count)\n .service(add_one)\n })\n .bind(("127.0.0.1", 8080))?\n .run()\n .await\n}\n// </arc>\n'])},15970(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'pub mod handlers_arc;\n// <data>\nuse actix_web::{web, App, HttpServer, Responder};\nuse std::cell::Cell;\n\n#[derive(Clone)]\nstruct AppState {\n count: Cell<usize>,\n}\n\nasync fn show_count(data: web::Data<AppState>) -> impl Responder {\n format!("count: {}", data.count.get())\n}\n\nasync fn add_one(data: web::Data<AppState>) ->
1 impl Responder {\n let count = data.count.get();\n data.count.set(count + 1);\n\n format!("count: {}", data.count.get())\n}\n\n#[actix_web::main]\nasync fn main() -> std::io::Result<()> {\n let data = AppState {\n count: Cell::new(0),\n };\n\n HttpServer::new(move || {\n App::new()\n .app_data(web::Data::new(data.clone()))\n .route("/", web::to(show_count))\n .route("/add", web::to(add_one))\n })\n .bind(("127.0.0.1", 8080))?\n .run()\n .await\n}\n// </data>\n'])},80006(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'[package]\nname = "request-routing"\nversion = "1.0.0"\npublish = false\nedition.workspace = true\n\n[dependencies]\nactix-web = "4"\n'])},58889(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'// <request-routing>\nuse actix_web::{get, web, App, HttpServer, Responder};\n\n#[get("/")]\nasync fn index() -> impl Responder {\n "Hello, World!"\n}\n\n#[get("/{name}")]\nasync fn hello(name: web::Path<String>) -> impl Responder {\n format!("Hello {}!", &name)\n}\n\n#[actix_web::main]\nasync fn main() -> std::io::Result<()> {\n HttpServer::new(|| App::new().service(index).service(hello))\n .bind(("127.0.0.1", 8080))?\n .run()\n .await\n}\n// </request-routing>\n'])},25036(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'[package]\nname = "requests"\nversion = "1.0.0"\npublish = false\nedition.workspace = true\n\n[dependencies]\nactix-web = "4"\nfutures = "0.3"\nserde = "1"\nserde_json = "1"\n'])},66619(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'pub mod manual;\npub mod multipart;\npub mod streaming;\npub mod urlencoded;\n\n// <json-request>\nuse actix_web::{web, App, HttpServer, Result};\nuse serde::Deserialize;\n\n#[derive(Deserialize)]\nstruct Info {\n username: String,\n}\n\n/// extract `Info` using serde\nasync fn index(info: web::Json<Info>) -> Result<String> {\n Ok(format!("Welcome {}!", info.username))\n}\n\n#[actix_web::main]\nasync fn main() -> std::io::Result<()> {\n HttpServer::new(|| App::new().route("/", web::post().to(index)))\n .bind(("127.0.0.1", 8080))?\n .run()\n .await\n}\n// </json-request>\n'])},10012(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'// <json-manual>\nuse actix_web::{error, post, web, App, Error, HttpResponse};\nuse futures::StreamExt;\nuse serde::{Deserialize, Serialize};\n\n#[derive(Serialize, Deserialize)]\nstruct MyObj {\n name: String,\n number: i32,\n}\n\nconst MAX_SIZE: usize = 262_144; // max payload size is 256k\n\n#[post("/")]\nasync fn index_manual(mut payload: web::Payload) -> Result<HttpResponse, Error> {\n // payload is a stream of Bytes objects\n let mut body = web::BytesMut::new();\n while let Some(chunk) = payload.next().await {\n let chunk = chunk?;\n // limit max size of in-memory payload\n if (body.len() + chunk.len()) > MAX_SIZE {\n return Err(error::ErrorBadRequest("overflow"));\n }\n body.extend_from_slice(&chunk);\n }\n\n // body is loaded, now we can deserialize serde-json\n let obj = serde_json::from_slice::<MyObj>(&body)?;\n Ok(HttpResponse::Ok().json(obj)) // <- send response\n}\n// </json-manual>\n\n#[actix_web::main]\nasync fn main() -> std::io::Result<()> {\n use actix_web::HttpServer;\n\n HttpServer::new(|| App::new().service(index_manual))\n .bind(("127.0.0.1", 8080))?\n .run()\n .await\n}\n'])},60716(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'// <multipart>\n// use actix_web::{error, Error, HttpRequest, HttpResponse};\n// use futures::Future;\n\n// pub fn index(req: HttpRequest) -> Box<Future<Item = HttpResponse, Error = Error>> {\n// // get multipart and iterate over multipart items\n// req.multipart().and_then(|item| match item {\n// multipart::MultipartItem::Field(field) => {\n// println!(\n// "==== FIELD ==== {:?} {:?}",\n// field.headers(),\n// field.content_type()\n// );\n// Either::A(\n// field\n// .map(|chunk| {\n// println!("-- CHUNK: \\n{}", std::str::from_utf8(&chunk).unwrap());\n// })\n// .fold((), |_, _| result(Ok(()))),\n// )\n// }\n// multipart::MultipartItem::Nested(mp) => Either::B(result(Ok(()))),\n// })\n// }\n// </multipart>\n'])},43588(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'// <streaming>\nuse actix_web::{get, web, Error, HttpResponse};\nuse futures::StreamExt;\n\n#[get("/")]\nasync fn index(mut body: web::Payload) -> Result<HttpResponse, Error> {\n let mut bytes = web::BytesMut::new();\n while let Some(item) = body.next().await {\n let item = item?;\n println!("Chunk: {:?}", &item);\n bytes.extend_from_slice(&item);\n }\n\n Ok(HttpResponse::Ok().finish())\n}\n// </streaming>\n\n#[actix_web::main]\nasync fn main() -> std::io::Result<()> {\n use actix_web::{App, HttpServer};\n\n HttpServer::new(|| App::new().service(index))\n .bind(("127.0.0.1", 8080))?\n .run()\n .await\n}\n'])},73179(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'// <urlencoded>\nuse actix_web::{post, web, HttpResponse};\nuse serde::Deserialize;\n\n#[derive(Deserialize)]\nstruct FormData {\n username: String,\n}
1\n\n#[post("/")]\nasync fn index(form: web::Form<FormData>) -> HttpResponse {\n HttpResponse::Ok().body(format!("username: {}", form.username))\n}\n// </urlencoded>\n\n#[actix_web::main]\nasync fn main() -> std::io::Result<()> {\n use actix_web::{App, HttpServer};\n\n HttpServer::new(|| App::new().service(index))\n .bind(("127.0.0.1", 8080))?\n .run()\n .await\n}\n'])},47327(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'[package]\nname = "responder-trait"\nversion = "1.0.0"\npublish = false\nedition.workspace = true\n\n[dependencies]\nactix-web = "4"\nserde = "1"\nserde_json = "1"\n'])},11618(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'// <responder-trait>\nuse actix_web::{\n body::BoxBody, http::header::ContentType, HttpRequest, HttpResponse, Responder,\n};\nuse serde::Serialize;\n\n#[derive(Serialize)]\nstruct MyObj {\n name: &\'static str,\n}\n\n// Responder\nimpl Responder for MyObj {\n type Body = BoxBody;\n\n fn respond_to(self, _req: &HttpRequest) -> HttpResponse<Self::Body> {\n let body = serde_json::to_string(&self).unwrap();\n\n // Create response and set content type\n HttpResponse::Ok()\n .content_type(ContentType::json())\n .body(body)\n }\n}\n\nasync fn index() -> impl Responder {\n MyObj { name: "user" }\n}\n// </responder-trait>\n\n#[actix_web::main]\nasync fn main() -> std::io::Result<()> {\n use actix_web::{web, App, HttpServer};\n\n HttpServer::new(|| App::new().route("/", web::get().to(index)))\n .bind(("127.0.0.1", 8080))?\n .run()\n .await\n}\n'])},93792(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'[package]\nname = "responses"\nversion = "1.0.0"\npublish = false\nedition.workspace = true\n\n[dependencies]\nactix-web = "4"\nfutures = "0.3"\nserde = "1"\n'])},84417(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'// <auto>\nuse actix_web::{get, middleware, App, HttpResponse, HttpServer};\n\n#[get("/")]\nasync fn index() -> HttpResponse {\n HttpResponse::Ok().body("data")\n}\n\n#[actix_web::main]\nasync fn main() -> std::io::Result<()> {\n HttpServer::new(|| {\n App::new()\n .wrap(middleware::Compress::default())\n .service(index)\n })\n .bind(("127.0.0.1", 8080))?\n .run()\n .await\n}\n// </auto>\n'])},89192(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'use std::io;\n\n// <chunked>\nuse actix_web::{get, web, App, Error, HttpRequest, HttpResponse, HttpServer};\nuse futures::future::ok;\nuse futures::stream::once;\n\n#[get("/")]\nasync fn index(_req: HttpRequest) -> HttpResponse {\n HttpResponse::Ok().streaming(once(ok::<_, Error>(web::Bytes::from_static(b"data"))))\n}\n// </chunked>\n\n#[actix_web::main]\nasync fn main() -> io::Result<()> {\n HttpServer::new(|| App::new().service(index))\n .bind(("127.0.0.1", 8080))\n .unwrap()\n .run()\n .await\n}\n'])},80496(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'// <identity>\nuse actix_web::{\n get, http::header::ContentEncoding, middleware, App, HttpResponse, HttpServer,\n};\n\n#[get("/")]\nasync fn index() -> HttpResponse {\n HttpResponse::Ok()\n // v- disable compression\n .insert_header(ContentEncoding::Identity)\n .body("data")\n}\n\n#[actix_web::main]\nasync fn main() -> std::io::Result<()> {\n HttpServer::new(|| {\n App::new()\n .wrap(middleware::Compress::default())\n .service(index)\n })\n .bind(("127.0.0.1", 8080))?\n .run()\n .await\n}\n// </identity>\n'])},65793(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'// <identity-two>\nuse actix_web::{\n get, http::header::ContentEncoding, middleware, App, HttpResponse, HttpServer,\n};\n\nstatic HELLO_WORLD: &[u8] = &[\n 0x1f, 0x8b, 0x08, 0x00, 0xa2, 0x30, 0x10, 0x5c, 0x00, 0x03, 0xcb, 0x48, 0xcd, 0xc9, 0xc9,\n 0x57, 0x28, 0xcf, 0x2f, 0xca, 0x49, 0xe1, 0x02, 0x00, 0x2d, 0x3b, 0x08, 0xaf, 0x0c, 0x00,\n 0x00, 0x00,\n];\n\n#[get("/")]\nasync fn index() -> HttpResponse {\n HttpResponse::Ok()\n .insert_header(ContentEncoding::Gzip)\n .body(HELLO_WORLD)\n}\n// </identity-two>\n\n#[actix_web::main]\nasync fn main() -> std::io::Result<()> {\n HttpServer::new(|| {\n App::new()\n .wrap(middleware::Compress::default())\n .service(index)\n })\n .bind(("127.0.0.1", 8080))?\n .run()\n .await\n}\n'])},39953(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'// <json-resp>\nuse actix_web::{get, web, Responder, Result};\nuse serde::Serialize;\n\n#[derive(Serialize)]\nstruct MyObj {\n name: String,\n}\n\n#[get("/a/{name}")]\nasync fn index(name: web::Path<String>) -> Result<impl Responder> {\n let obj = MyObj {\n name: name.to_string(),\n };\n Ok(web::Json(obj))\n}\n\n#[actix_web::main]\nasync fn main() -> std::io::Result<()> {\n use actix_web::{App, HttpServer};\n\n HttpServer::new(|| App::new().service(index))\n .bind(("127.0.0.1", 8080))?\n .run()\n .await\n}\n// </json-resp>\n'])},6271(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'pub mod auto;\npub mod chunked;\npub mod identity;\npub mod identity_two;\npub mod json_resp;\n\n// <builder>\nuse actix_web::{http::header::ContentType, HttpResponse};\n\nasync fn index() -> HttpResponse {\n HttpResponse::Ok()\n .content_type(ContentType::plaintext())\n .insert_header(("X-Hdr", "sample"))\n .body("data")\n}\n// </builder>\n\n#[actix_web::main]\nasync fn main() -> std::io::Result<()> {\n use actix_web::{web, App, HttpServer};\n\n HttpServer::new(|| App::new().route("/", web::get().to(index)))\n .bind(("127.0.0.1", 8080))?\n .run()\n .await\n}\n'])},99325(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'[package]\nname = "sea-orm-databases"\nversion = "0.1.0"\npublish = false\nedition.workspace = true\n\n[dependencies]\nactix-web = "4"\nsea-orm = { version = "1.1.20", features = ["sqlx-sqlite", "runtime-tokio-native-tls", "macros"] }\nserde = { version = "1", features = ["derive"] }\nuuid = { version = "1", features = ["v4"] }\n'])},31452(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'use std::io;\n\nuse actix_web::{error, web, App, HttpResponse, HttpServer, Responder};\nuse sea_orm::{ActiveModelTrait, Database, DatabaseConnection, Set};\nuse serde::Serialize;\nuse uuid::Uuid;\n\n// <handler>\n// Importing the existing entity modules\npub mod prelude;\npub mod users;\nuse crate::users::ActiveModel as UserActiveModel;\n\n#[derive(Debug, Serialize)]\nstruct User {\n id: String,\n name: String,\n}\n\nasync fn insert_new_user(\n conn: &DatabaseConnection,\n user_name: String,\n) -> Result<User, sea_orm::DbErr> {\n // Create insertion model\n let uid = Uuid::new_v4().to_string();\n let new_user = UserActiveModel {\n id: Set(uid.clone()),\
1n name: Set(user_name),\n ..Default::default()\n };\n\n // Insert the user\n let user = new_user.insert(conn).await?;\n\n Ok(User {\n id: user.id,\n name: user.name,\n })\n}\n// </handler>\n\n// <main>\n#[actix_web::main]\nasync fn main() -> io::Result<()> {\n let database_url = "sqlite:app.db";\n let conn = Database::connect(database_url)\n .await\n .expect("Failed to connect to database");\n\n HttpServer::new(move || {\n App::new()\n .app_data(web::Data::new(conn.clone()))\n .route("/{name}", web::get().to(index))\n })\n .bind(("127.0.0.1", 8080))?\n .run()\n .await\n}\n// </main>\n\n// <index>\nasync fn index(\n conn: web::Data<DatabaseConnection>,\n name: web::Path<(String,)>,\n) -> actix_web::Result<impl Responder> {\n let (name,) = name.into_inner();\n\n let user = insert_new_user(&conn, name)\n .await\n .map_err(error::ErrorInternalServerError)?;\n\n Ok(HttpResponse::Ok().json(user))\n}\n// </index>\n'])},83261(e,n,t){"use strict";t.r(n);t.d(n,["default",0,"//! `SeaORM` Entity, @generated by sea-orm-codegen 1.1.4\n\npub mod prelude;\n\npub mod users;\n"])},96092(e,n,t){"use strict";t.r(n);t.d(n,["default",0,"//! `SeaORM` Entity, @generated by sea-orm-codegen 1.1.4\n\npub use super::users::Entity as Users;\n"])},14193(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'//! `SeaORM` Entity, @generated by sea-orm-codegen 1.1.4\n\nuse sea_orm::entity::prelude::*;\n\n#[derive(Clone, Debug, PartialEq, DeriveEntityModel, Eq)]\n#[sea_orm(table_name = "users")]\npub struct Model {\n #[sea_orm(primary_key, auto_increment = false)]\n pub id: String,\n pub name: String,\n}\n\n#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)]\npub enum Relation {}\n\nimpl ActiveModelBehavior for ActiveModel {}\n'])},98697(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'[package]\nname = "server"\nversion = "1.0.0"\npublish = false\nedition.workspace = true\n\n[dependencies]\nactix-web = { version = "4", features = ["openssl"] }\nopenssl = "0.10"\ntokio = { version = "1", features = ["full"] }\n'])},33578(e,n,t){"use strict";t.r(n);t.d(n,["default",0,"use actix_web::{\n body::MessageBody,\n dev::{ServiceFactory, ServiceRequest, ServiceResponse},\n App, Error,\n};\n\n#[allow(dead_code)]\nfn app() -> App<\n impl ServiceFactory<\n ServiceRequest,\n Response = ServiceResponse<impl MessageBody>,\n Config = (),\n InitError = (),\n Error = Error,\n >,\n> {\n App::new()\n}\n\n// <keep-alive>\nuse actix_web::{http::KeepAlive, HttpServer};\nuse std::time::Duration;\n\n#[actix_web::main]\nasync fn main() -> std::io::Result<()> {\n // Set keep-alive to 75 seconds\n let _one = HttpServer::new(app).keep_alive(Duration::from_secs(75));\n\n // Use OS's keep-alive (usually quite long)\n let _two = HttpServer::new(app).keep_alive(KeepAlive::Os);\n\n // Disable keep-alive\n let _three = HttpServer::new(app).keep_alive(None);\n\n Ok(())\n}\n// </keep-alive>\n"])},83921(e,n,t){"use strict";t.r(n);t.d(n,["default",0,"#![allow(dead_code)]\n\n// <example>\nuse actix_web::{http, HttpRequest, HttpResponse};\n\nasync fn index(_req: HttpRequest) -> HttpResponse {\n let mut resp = HttpResponse::Ok()\n .force_close() // <- Close connection on HttpResponseBu
1ilder\n .finish();\n\n // Alternatively close connection on the HttpResponse struct\n resp.head_mut().set_connection_type(http::ConnectionType::Close);\n\n resp\n}\n// </example>\n\n// ConnectionType::Close\n// ConnectionType::KeepAlive\n// ConnectionType::Upgrade\n"])},21048(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'pub mod keep_alive;\npub mod keep_alive_tp;\npub mod signals;\npub mod ssl;\npub mod workers;\n\n// <main>\nuse actix_web::{web, App, HttpResponse, HttpServer};\n\n#[actix_web::main]\nasync fn main() -> std::io::Result<()> {\n HttpServer::new(|| App::new().route("/", web::get().to(HttpResponse::Ok)))\n .bind(("127.0.0.1", 8080))?\n .run()\n .await\n}\n// </main>\n'])},53936(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'// <signals>\nuse actix_web::{web, App, HttpResponse, HttpServer};\nuse std::io;\n\n#[tokio::main]\nasync fn main() -> io::Result<()> {\n let srv = HttpServer::new(|| App::new().route("/", web::get().to(HttpResponse::Ok)))\n .bind(("127.0.0.1", 8080))?\n .shutdown_timeout(60) // <- Set shutdown timeout to 60 seconds\n .run();\n\n // obtain handle to server\n let srv_handle = srv.handle();\n\n // spawn server as Tokio task to start processing connections\n tokio::spawn(srv);\n\n // pause accepting new connections\n srv_handle.pause().await;\n\n // resume accepting new connections\n srv_handle.resume().await;\n\n // stop server gracefully\n srv_handle.stop(true).await;\n\n Ok(())\n}\n// </signals>\n\n#[allow(dead_code)]\nfn run_main() {\n let _ = main();\n}\n'])},48435(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'#![allow(dead_code)]\n\n// <ssl>\nuse actix_web::{get, App, HttpRequest, HttpServer, Responder};\nuse openssl::ssl::{SslAcceptor, SslFiletype, SslMethod};\n\n#[get("/")]\nasync fn index(_req: HttpRequest) -> impl Responder {\n "Welcome!"\n}\n\n#[actix_web::main]\nasync fn main() -> std::io::Result<()> {\n // load TLS keys\n // to create a self-signed temporary cert for testing:\n // `openssl req -x509 -newkey rsa:4096 -nodes -keyout key.pem -out cert.pem -days 365 -subj \'/CN=localhost\'`\n let mut builder = SslAcceptor::mozilla_intermediate(SslMethod::tls()).unwrap();\n builder\n .set_private_key_file("key.pem", SslFiletype::PEM)\n .unwrap();\n builder.set_certificate_chain_file("cert.pem").unwrap();\n\n HttpServer::new(|| App::new().service(index))\n .bind_openssl("127.0.0.1:8080", builder)?\n .run()\n .await\n}\n// </ssl>\n'])},17686(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'// <workers>\nuse actix_web::{web, App, HttpResponse, HttpServer};\n\n#[actix_web::main]\nasync fn main() {\n let _ = HttpServer::new(|| App::new().route("/", web::get().to(HttpResponse::Ok))).workers(4);\n // <- Start 4 workers\n}\n// </workers>\n'])},59358(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'[package]\nname = "static-files"\nversion = "1.0.0"\npublish = false\nedition.workspace = true\n\n[dependencies]\nactix-web = "4"\nactix-files = "0.7"\n'])},49148(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'// <config-one>\nuse actix_files as fs;\nuse actix_web::http::header::{ContentDisposition, DispositionType};\nuse actix_web::{get, App, Error, HttpRequest, HttpServer};\n\n#[get("/{filename:.*}")]\nasync fn index(req: HttpRequest) -> Result<fs::NamedFile, Error> {\n let path: std::path::PathBuf = req.match_info().query("filename").parse().unwrap();\n let file = fs::NamedFile::open(path)?;\n Ok(file\n .use_last_modified(true)\n .set_content_disposition(ContentDisposition {\n disposition: DispositionType::Attachment,\n parameters: vec![],\n }))\n}\n\n#[actix_web::main]\nasync fn main() -> std::io::Result<()> {\n HttpServer::new(|| App::new().service(index))\n .bind(("127.0.0.1", 8080))?\n .run()\n .await\n}\n// </config-one>\n'])},20125(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'// <config-two>\nuse actix_files as fs;\nuse actix_web::{App, HttpServer};\n\n#[actix_web::main]\nasync fn main() -> std::io::Result<()> {\n HttpServer::new(|| {\n App::new().service(\n fs::Files::new("/static", ".")\n .show_files_listing()\n .use_last_modified(true),\n )\n })\n .bind(("127.0.0.1", 8080))?\n .run()\n .await\n}\n// </config-two>\n'])},49553(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'// <directory>\nuse actix_files as fs;\nuse actix_web::{App, HttpServer};\n\n#[actix_web::main]\nasync fn main() -> std::io::Result<()> {\n HttpServer::new(|| App::new().service(fs::Files::new("/static", ".").show_files_listing()))\n .bind(("127.0.0.1", 8080))?\n .run()\n .await\n}\n// </directory>\n'])},14449(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'pub mod configuration;\npub mod configuration_two;\npub mod directory;\n\n// <individual-file>\nuse actix_files::NamedFile;\nuse actix_web::HttpRequest;\nuse std::path::PathBuf;\n\nasync fn index(req: HttpRequest) -> actix_web::Result<NamedFile> {\n let path: PathBuf = req.match_info().query("filename").parse().unwrap();\n Ok(NamedFile::open(path)?)\n}\n\n#[actix_web::main]\nasync fn main() -> std::io::Result<()> {\n use actix_web::{web, App, HttpServer};\n\n HttpServer::new(|| App::new().route("/{filename:.*}", web::get().to(index)))\n .bind(("127.0.0.1", 8080))?\n .run()\n .await\n}\n// </individual-file>\n'])},32736(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'[package]\nname = "testing"\nversion = "1.0.0"\npublish = false\nedition.workspace = true\n\n[dependencies]\nactix-web = "4"\nfutures = "0.3"\nserde = "1"\n'])},85233(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'use actix_web::{get, HttpRequest, Responder};\n\n#[allow(dead_code)]\n#[get("/")]\nasync fn index(_req: HttpRequest) -> impl Responder {\n "Hello world!"\n}\n\n// <integration-one>\n#[cfg(test)]\nmod tests {\n use actix_web::{http::header::ContentType, test, App};\n\n use super::*;\n\n #[actix_web::test]\n async fn test_index_get() {\n let app = test::init_service(App::new().service(index)).await;\n let req = test::TestRequest::default()\n .insert_header(ContentType::plaintext())\n .to_request();\n let resp = test::call_service(&app, req).await;\n assert!(resp.status().is_success());\n }\n\n #[actix_web::test]\n async fn test_index_post() {\n let app = test::init_service(App::new().service(index)).await;\n let req = test::TestRequest::post().uri("/").to_request();\n let resp = test::call_service(&app, req).await;\n assert!(resp.status().is_client_error());\n }\n}\n// </integration-one>\n'])},41635(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'use actix_web::{get, web, HttpResponse, Responder};\nuse serde::{Deserialize, Serialize};\n\n#[derive(Deserialize, Serialize, Debug)]\nstruct AppState {\n count: i32,\n}\n\n#[allow(dead_code)]\n#[get("/")]\nasync fn index(data: web::Data<AppState>) -> impl Responder {\n HttpResponse::Ok().json(data.get_ref())\n}\n\n// <integration-two>\n#[cfg(test)]\nmod tests {\n use super::*;\n use actix_web::{test, web, App};\n\n #[actix_web::test]\n async fn test_index_get() {\n let app = test::init_service(\n App::new()\n .app_data(web::Data::new(AppState { count: 4 }))\n .service(index),\n )\n .await;\n let req = test::TestRequest::get().uri("/").to_request();\n let resp: AppState = test::call_and_read_body_json(&app, req).await;\n\n assert_eq!(resp.count, 4);\n }\n}\n// </integration-two>\n'])},2367(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'pub mod integration_one;\npub mod integration_two;\npub mod stream_response;\nuse actix_web::{http, web, App, HttpRequest, HttpResponse};\n\nasync fn index(req: HttpRequest) -> HttpResponse {\n if let Some(hdr) = req.headers().get(http::header::CONTENT_TYPE) {\n if let Ok(_s) = hdr.to_str() {\n return HttpResponse::Ok().into();\n }\n }\n HttpResponse::BadRequest().into()\n}\n\nfn main() {\n App::new().route("/", web::get().to(index));\n}\n\n// <unit-tests>\n#[cfg(test)]\nmod tests {\n use super::*;\n use actix_web::{\n http::{self, header::ContentType},\n test,\n };
1\n\n #[actix_web::test]\n async fn test_index_ok() {\n let req = test::TestRequest::default()\n .insert_header(ContentType::plaintext())\n .to_http_request();\n let resp = index(req).await;\n assert_eq!(resp.status(), http::StatusCode::OK);\n }\n\n #[actix_web::test]\n async fn test_index_not_ok() {\n let req = test::TestRequest::default().to_http_request();\n let resp = index(req).await;\n assert_eq!(resp.status(), http::StatusCode::BAD_REQUEST);\n }\n}\n// </unit-tests>\n'])},72810(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'// <stream-response>\nuse std::task::Poll;\n\nuse actix_web::{\n http::{self, header::ContentEncoding, StatusCode},\n web, App, Error, HttpRequest, HttpResponse,\n};\nuse futures::stream;\n\nasync fn sse(_req: HttpRequest) -> HttpResponse {\n let mut counter: usize = 5;\n\n // yields `data: N` where N in [5; 1]\n let server_events =\n stream::poll_fn(move |_cx| -> Poll<Option<Result<web::Bytes, Error>>> {\n if counter == 0 {\n return Poll::Ready(None);\n }\n let payload = format!("data: {}\\n\\n", counter);\n counter -= 1;\n Poll::Ready(Some(Ok(web::Bytes::from(payload))))\n });\n\n HttpResponse::build(StatusCode::OK)\n .insert_header((http::header::CONTENT_TYPE, "text/event-stream"))\n .insert_header(ContentEncoding::Identity)\n .streaming(server_events)\n}\n\npub fn main() {\n App::new().route("/", web::get().to(sse));\n}\n\n#[cfg(test)]\nmod tests {\n use super::*;\n\n use actix_web::{body, body::MessageBody as _, rt::pin, test, web, App};\n use futures::future;\n\n #[actix_web::test]\n async fn test_stream_chunk() {\n let app = test::init_service(App::new().route("/", web::get().to(sse))).await;\n let req = test::TestRequest::get().to_request();\n\n let resp = test::call_service(&app, req).await;\n assert!(resp.status().is_success());\n\n let body = resp.into_body();\n pin!(body);\n\n // first chunk\n let bytes = future::poll_fn(|cx| body.as_mut().poll_next(cx)).await;\n assert_eq!(\n bytes.unwrap().unwrap(),\n web::Bytes::from_static(b"data: 5\\n\\n")\n );\n\n // second chunk\n let bytes = future::poll_fn(|cx| body.as_mut().poll_next(cx)).await;\n assert_eq!(\n bytes.unwrap().unwrap(),\n web::Bytes::from_static(b"data: 4\\n\\n")\n );\n\n // remaining part\n for i in 0..3 {\n let expected_data = format!("data: {}\\n\\n", 3 - i);\n let bytes = future::poll_fn(|cx| body.as_mut().poll_next(cx)).await;\n assert_eq!(bytes.unwrap().unwrap(), web::Bytes::from(expected_data));\n }\n }\n\n #[actix_web::test]\n async fn test_stream_full_payload() {\n let app = test::init_service(App::new().route("/", web::get().to(sse))).await;\n let req = test::TestRequest::get().to_request();\n\n let resp = test::call_service(&app, req).await;\n assert!(resp.status().is_success());\n\n let body = resp.into_body();\n let bytes = body::to_bytes(body).await;\n assert_eq!(\n bytes.unwrap(),\n web::Bytes::from_static(b"data: 5\\n\\ndata: 4\\n\\ndata: 3\\n\\ndata: 2\\n\\ndata: 1\\n\\n")\n );\n }\n}\n// </stream-response>\n'])},584(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'[package]\nname = "url-dispatch"\nversion = "1.0.0"\npublish = false\nedition.workspace = true\n\n[dependencies]\nactix-web = "4"\nserde = "1"\n'])},25730(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'use actix_web::{guard, web, App, HttpResponse};\n\n#[rustfmt::skip]\n#[actix_web::main]\nasync fn main() -> std::io::Result<()> {\n use actix_web::HttpServer;\n\n HttpServer::new(|| {\n// <cfg>\nApp::new().service(\n web::resource("/path").route(\n web::route()\n .guard(guard::Get())\n .guard(guard::Header("content-type", "text/plain"))\n .to(HttpResponse::Ok),\n ),\n)\n// </cfg>\n })\n .bind(("127.0.0.1", 8080))?\n .run()\n .await\n}\n'])},49454(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'use actix_web::{guard, web, App, HttpRequest, HttpResponse, HttpServer, Responder};\n\n#[allow(dead_code)]\nasync fn index(_req: HttpRequest) -> impl Responder {\n "Welcome!"\n}\n\n// <default>\n#[actix_web::main]\nasync fn main() -> std::io::Result<()> {\n HttpServer::new(|| {\n App::new()\n .service(web::resource("/").route(web::get().to(index)))\n .default_service(\n web::route()\n .guard(guard::Not(guard::Get()))\n .to(HttpResponse::MethodNotAllowed),\n )\n })\n .bind(("127.0.0.1", 8080))?\n .run()\n .await\n}\n// </default>\n'])},37385(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'#![allow(dead_code)] // false positive on ContentTypeHeader\n\n// <guard>\nuse actix_web::{\n guard::{Guard, GuardContext},\n http, HttpResponse,\n};\n\nstruct ContentTypeHeader;\n\nimpl Guard for ContentTypeHeader {\n fn check(&self, req: &GuardContext) -> bool {\n req.head()\n .headers()\n .contains_key(http::header::CONTENT_TYPE)\n }\n}\n\n#[actix_web::main]\nasync fn main() -> std::io::Result<()> {\n use actix_web::{web, App, HttpServer};\n\n HttpServer::new(|| {\n App::new().route(\n "/",\n web::route().guard(ContentTypeHeader).to(HttpResponse::Ok),\n )\n })\n .bind(("127.0.0.1", 8080))?\n .run()\n .await\n}\n// </guard>\n'])}
1,64339(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'// <guard2>\nuse actix_web::{guard, web, App, HttpResponse, HttpServer};\n\n#[actix_web::main]\nasync fn main() -> std::io::Result<()> {\n HttpServer::new(|| {\n App::new().route(\n "/",\n web::route()\n .guard(guard::Not(guard::Get()))\n .to(HttpResponse::MethodNotAllowed),\n )\n })\n .bind(("127.0.0.1", 8080))?\n .run()\n .await\n}\n// </guard2>\n'])},96599(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'pub mod cfg;\npub mod dhandler;\npub mod guard;\npub mod guard2;\npub mod minfo;\npub mod norm;\npub mod norm2;\npub mod path;\npub mod path2;\npub mod resource;\npub mod scope;\npub mod url_ext;\npub mod urls;\n\n// <main>\nuse actix_web::{web, App, HttpResponse, HttpServer};\n\nasync fn index() -> HttpResponse {\n HttpResponse::Ok().body("Hello")\n}\n\n#[actix_web::main]\nasync fn main() -> std::io::Result<()> {\n HttpServer::new(|| {\n App::new()\n .route("/", web::get().to(index))\n .route("/user", web::post().to(index))\n })\n .bind(("127.0.0.1", 8080))?\n .run()\n .await\n}\n// </main>\n'])},43171(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'// <minfo>\nuse actix_web::{get, App, HttpRequest, HttpServer, Result};\n\n#[get("/a/{v1}/{v2}/")]\nasync fn index(req: HttpRequest) -> Result<String> {\n let v1: u8 = req.match_info().get("v1").unwrap().parse().unwrap();\n let v2: u8 = req.match_info().query("v2").parse().unwrap();\n let (v3, v4): (u8, u8) = req.match_info().load().unwrap();\n Ok(format!("Values {} {} {} {}", v1, v2, v3, v4))\n}\n\n#[actix_web::main]\nasync fn main() -> std::io::Result<()> {\n HttpServer::new(|| App::new().service(index))\n .bind(("127.0.0.1", 8080))?\n .run()\n .await\n}\n// </minfo>\n'])},5412(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'#![allow(dead_code)]\n\n// <norm>\nuse actix_web::{middleware, HttpResponse};\n\nasync fn index() -> HttpResponse {\n HttpResponse::Ok().body("Hello")\n}\n\n#[actix_web::main]\nasync fn main() -> std::io::Result<()> {\n use actix_web::{web, App, HttpServer};\n\n HttpServer::new(|| {\n App::new()\n .wrap(middleware::NormalizePath::default())\n .route("/resource/", web::to(index))\n })\n .bind(("127.0.0.1", 8080))?\n .run()\n .await\n}\n// </norm>\n'])},48116(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'use actix_web::HttpResponse;\n\n#[get("/resource/")]\nasync fn index() -> HttpResponse {\n HttpResponse::Ok().body("Hello")\n}\n\n// <norm>\nuse actix_web::{get, http::Method, middleware, web, App, HttpServer};\n\n#[actix_web::main]\nasync fn main() -> std::io::Result<()> {\n HttpServer::new(|| {\n App::new()\n .wrap(middleware::NormalizePath::default())\n .service(index)\n .default_service(web::route().method(Method::GET))\n })\n .bind(("127.0.0.1", 8080))?\n .run()\n .await\n}\n// </norm>\n'])},16713(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'// <path>\nuse actix_web::{get, web, App, HttpServer, Result};\n\n#[get("/{username}/{id}/index.html")] // <- define path parameters\nasync fn index(info: web::Path<(String, u32)>) -> Result<String> {\n let info = info.into_inner();\n Ok(format!("Welcome {}! id: {}", info.0, info.1))\n}\n\n#[actix_web::main]\nasync fn main() -> std::io::Result<()> {\n HttpServer::new(|| App::new().service(index))\n .bind(("127.0.0.1", 8080))?\n .run()\n .await\n}\n// </path>\n'])},31123(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'// <path>\nuse actix_web::{get, web, App, HttpServer, Result};\nuse serde::Deserialize;\n\n#[derive(Deserialize)]\nstruct Info {\n username: String,\n}\n\n// extract path info using serde\n#[get("/{username}/index.html")] // <- define path parameters\nasync fn index(info: web::Path<Info>) -> Result<String> {\n Ok(format!("Welcome {}!", info.username))\n}\n\n#[actix_web::main]\nasync fn main() -> std::io::Result<()> {\n HttpServer::new(|| App::new().service(index))\n .bind(("127.0.0.1", 8080))?\n .run()\n .await\n}\n// </path>\n'])},97103(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'// <pbuf>
1\nuse actix_web::{get, App, HttpRequest, HttpServer, Result};\nuse std::path::PathBuf;\n\n#[get("/a/{tail:.*}")]\nasync fn index(req: HttpRequest) -> Result<String> {\n let path: PathBuf = req.match_info().query("tail").parse().unwrap();\n Ok(format!("Path {:?}", path))\n}\n\n#[actix_web::main]\nasync fn main() -> std::io::Result<()> {\n HttpServer::new(|| App::new().service(index))\n .bind("127.0.0.1:8080")?\n .run()\n .await\n}\n// </pbuf>\n'])},63046(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'// <resource>\nuse actix_web::{guard, web, App, HttpResponse};\n\nasync fn index() -> HttpResponse {\n HttpResponse::Ok().body("Hello")\n}\n\npub fn main() {\n App::new()\n .service(web::resource("/prefix").to(index))\n .service(\n web::resource("/user/{name}")\n .name("user_detail")\n .guard(guard::Header("content-type", "application/json"))\n .route(web::get().to(HttpResponse::Ok))\n .route(web::put().to(HttpResponse::Ok)),\n );\n}\n// </resource>\n'])},36408(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'use actix_web::{get, web, App, HttpResponse, HttpServer};\n\n// <scope>\n#[get("/show")]\nasync fn show_users() -> HttpResponse {\n HttpResponse::Ok().body("Show users")\n}\n\n#[get("/show/{id}")]\nasync fn user_detail(path: web::Path<(u32,)>) -> HttpResponse {\n HttpResponse::Ok().body(format!("User detail: {}", path.into_inner().0))\n}\n\n#[actix_web::main]\nasync fn main() -> std::io::Result<()> {\n HttpServer::new(|| {\n App::new().service(\n web::scope("/users")\n .service(show_users)\n .service(user_detail),\n )\n })\n .bind(("127.0.0.1", 8080))?\n .run()\n .await\n}\n// </scope>\n'])},17401(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'// <ext>\nuse actix_web::{get, App, HttpRequest, HttpServer, Responder};\n\n#[get("/")]\nasync fn index(req: HttpRequest) -> impl Responder {\n let url = req.url_for("youtube", ["oHg5SJYRHA0"]).unwrap();\n assert_eq!(url.as_str(), "https://youtube.com/watch/oHg5SJYRHA0");\n\n url.to_string()\n}\n\n#[actix_web::main]\nasync fn main() -> std::io::Result<()> {\n HttpServer::new(|| {\n App::new()\n .service(index)\n .external_resource("youtube", "https://youtube.com/watch/{video_id}")\n })\n .bind(("127.0.0.1", 8080))?\n .run()\n .await\n}\n// </ext>\n'])},43652(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'// <url>\nuse actix_web::{get, guard, http::header, HttpRequest, HttpResponse, Result};\n\n#[get("/test/")]\nasync fn index(req: HttpRequest) -> Result<HttpResponse> {\n let url = req.url_for("foo", ["1", "2", "3"])?; // <- generate url for "foo" resource\n\n Ok(HttpResponse::Found()\n .insert_header((header::LOCATION, url.as_str()))\n .finish())\n}\n\n#[actix_web::main]\nasync fn main() -> std::io::Result<()> {\n use actix_web::{web, App, HttpServer};\n\n HttpServer::new(|| {\n App::new()\n .service(\n web::resource("/test/{a}/{b}/{c}")\n .name("foo") // <- set resource name, then it could be used in `url_for`\n .guard(guard::Get())\n .to(HttpResponse::Ok),\n )\n .service(index)\n })\n .bind(("127.0.0.1", 8080))?\n .run()\n .await\n}\n// </url>\n'])},41894(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'[package]\nname = "websockets"\nversion = "1.0.0"\npublish = false\nedition.workspace = true\n\n[dependencies]\nactix-web = "4"\nactix-ws = "0.4"\nfutures-util = { version = "0.3.31", default-features = false, features = ["std"] }\n'])},32553(e,n,t){"use strict";t.r(n);t.d(n,["default",0,'// <websockets>\nuse actix_web::{rt, web, App, Error, HttpRequest, HttpResponse, HttpServer};\nuse actix_ws::AggregatedMessage;\nuse futures_util::StreamExt as _;\n\nasync fn echo(req: HttpRequest, stream: web::Payload) -> Result<HttpResponse, Error> {\n let (res, mut session, stream) = actix_ws::handle(&req, stream)?;\n\n let mut stream = stream\n .aggregate_continuations()\n // aggregate continuation frames up to 1MiB\n .max_continuation_size(2_usize.pow(20));\n\n // start task but don\'t wait for it\n rt::spawn(async move {\n // receive messages from websocket\n while let Some(msg) = stream.next().await {\n match msg {\n Ok(AggregatedMessage::Text(text)) =>
1 {\n // echo text message\n session.text(text).await.unwrap();\n }\n\n Ok(AggregatedMessage::Binary(bin)) => {\n // echo binary message\n session.binary(bin).await.unwrap();\n }\n\n Ok(AggregatedMessage::Ping(msg)) => {\n // respond to PING frame with PONG frame\n session.pong(&msg).await.unwrap();\n }\n\n _ => {}\n }\n }\n });\n\n // respond immediately with response connected to WS session\n Ok(res)\n}\n\n#[actix_web::main]\nasync fn main() -> std::io::Result<()> {\n HttpServer::new(|| App::new().route("/echo", web::get().to(echo)))\n .bind(("127.0.0.1", 8080))?\n .run()\n .await\n}\n// </websockets>\n\n// testing requires specific headers:\n// Upgrade: websocket\n// Connection: Upgrade\n// Sec-WebSocket-Key: SOME_KEY\n// Sec-WebSocket-Version: 13\n'])}}]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.