1(globalThis.webpackChunkactix_website||=[]).push([[7924],{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},89252(e,n,t){"use strict";t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>u,default:()=>m,frontMatter:()=>d,metadata:()=>r,toc:()=>l});const r=JSON.parse('{"id":"getting-started","title":"Getting Started","description":"Installing Rust","source":"@site/docs/getting-started.md","sourceDirName":".","slug":"/getting-started","permalink":"/docs/getting-started","draft":false,"unlisted":false,"editUrl":"https://github.com/actix/actix-website/edit/main/docs/getting-started.md","tags":[],"version":"current","frontMatter":{"title":"Getting Started"},"sidebar":"docs","previous":{"title":"What is Actix Web","permalink":"/docs/whatis"},"next":{"title":"Application","permalink":"/docs/application"}}');var s=t(91987),a=t(67008),i=t(18828),o=t(93196),p=t(53097);const d={title:"Getting Started"},u=void 0,c={},l=[{value:"Installing Rust",id:"installing-rust",level:2},{value:"Hello, world!",id:"hello-world",level:2}];function w(e){const n={a:"a",code:"code",h2:"h2",p:"p",pre:"pre",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h2,{id:"installing-rust",children:"Installing Rust"}),"\n",(0,s.jsxs)(n.p,{children:["If you don't have Rust yet, we recommend you use ",(0,s.jsx)(n.code,{children:"rustup"})," to manage your Rust installation. The ",(0,s.jsx)(n.a,{href:"https://doc.rust-lang.org/book/ch01-01-installation.html",children:"official rust guide"})," has a wonderful section on getting started."]}),"\n",(0,s.jsx)("p",{children:(0,s.jsxs)(n.p,{children:["Actix Web currently has a minimum supported Rust version (MSRV) of ",p.A.rustVersion,". Running ",(0,s.jsx)("code",{children:"rustup update"})," will ensure you have the latest and greatest Rust version available. As such, this guide assumes you are running Rust ",p.A.rustVersion," or later."]})}),"\n",(0,s.jsx)(n.h2,{id:"hello-world",children:"Hello, world!"}),"\n",(0,s.jsx)(n.p,{children:"Start by creating a new binary-based Cargo project and changing into the new directory:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"cargo new hello-world\ncd hello-world\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Add ",(0,s.jsx)(n.code,{children:"actix-web"})," as a dependency of your project by adding the following to your ",(0,s.jsx)(n.code,{children:"Cargo.toml"})," file."]}),"\n",(0,s.jsx)(i.A,{className:"language-toml",children:`[dependencies]\nactix-web = "${p.A.actixWebMajorVersion}"`}),"\n",(0,s.jsxs)(n.p,{children:["Request handlers use async functions that accept zero or more parameters. These parameters can be extracted from a request (see ",(0,s.jsx)(n.code,{children:"FromRequest"})," trait), and the function returns a type that can be converted into an ",(0,s.jsx)(n.code,{children:"HttpResponse"})," (see ",(0,s.jsx)(n.code,{children:"Responder"})," trait):"]}),"\n",(0,s.jsxs)(n.p,{children:["Replace the contents of ",(0,s.jsx)(n.code,{children:"src/main.rs"})," with the following:"]}),"\n",(0,s.jsx)(o.A,{example:"getting-started",section:"handlers"}),"\n",(0,s.jsxs)(n.p,{children:["Notice that some of these handlers have routing information attached directly using the built-in macros. These allow you to specify the method and path that the handler should respond to. You will see below how to register ",(0,s.jsx)(n.code,{children:"manual_hello"})," (i.e. routes that do not use a routing macro)."]}),"\n",(0,s.jsxs)(n.p,{children:["Next, create an ",(0,s.jsx)(n.code,{children:"App"})," instance and register the request handlers. Use ",(0,s.jsx)(n.code,{children:"App::service"})," for the handlers using routing macros and ",(0,s.jsx)(n.code,{children:"App::route"})," for manually routed handlers, declaring the path and method. Finally, the app is started inside an ",(0,s.jsx)(n.code,{children:"HttpServer"})," which will serve incoming requests using your ",(0,s.jsx)(n.code,{children:"App"}),' as an "application factory".']}),"\n",(0,s.jsxs)(n.p,{children:["Further append the following ",(0,s.jsx)(n.code,{children:"main"})," function to ",(0,s.jsx)(n.code,{children:"src/main.rs"}),":"]}),"\n",(0,s.jsx)(o.A,{example:"getting-started",section:"main"}),"\n",(0,s.jsxs)(n.p,{children:["That's it! Compile and run the program with ",(0,s.jsx)(n.code,{children:"cargo run"}),". The ",(0,s.jsx)(n.code,{children:"#[actix_web::main]"})," macro executes the async main function within the actix runtime. Now you can go to ",(0,s.jsx)(n.code,{children:"http://127.0.0.1:8080/"})," or any of the other routes you defined to see the results."]})]})}function m(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(w,{...e})}):w(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])},53097(e,n,t){"use strict";const r={rustVersion:"1.72",actixWebMajorVersion:"4",tokioMajorVersion:"1",actorsMajorVersion:"0.13"};t.d(n,["A",0,r])},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.