Crate actix_plus_static_files

Source
Expand description

§actix-plus-static-files

Dual-licensed under MIT or the UNLICENSE.

§Overview

  • Embed static resources in executable via convenient macro
  • Serve static resources as directory in actix-web
  • Support for angular-like routers
  • Fork of actix-web-static-files by Alexander Korolev

§Usage

§Use-case #1: Static resources folder

Create folder with static resources in your project (for example static):

cd project_dir
mkdir static
echo "Hello, world" > static/hello

Add to Cargo.toml dependency to actix-web-static-files:

[dependencies]
actix-plus-static-files = "0.1.0"

Include static files in Actix Web application:

use actix_web::{App, HttpServer};
use actix_plus_static_files::{build_hashmap_from_included_dir, ResourceFiles, Dir, include_dir};

const DIR: Dir = include_dir!("./examples/static");

#[actix_web::main]
async fn main() {
    HttpServer::new(|| {
        let hash_map = build_hashmap_from_included_dir(&DIR);
        App::new().service(ResourceFiles::new("/", hash_map))
    })
        .bind("127.0.0.1:8192")
        .expect("Failed to bind to port")
        .run()
        .await
        .expect("Failed to run server");
}

Run the server:

cargo run

Request the resource:

$ curl -v http://localhost:8080/static/hello
*   Trying 127.0.0.1:8080...
* TCP_NODELAY set
* Connected to localhost (127.0.0.1) port 8080 (#0)
> GET /static/hello HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.65.3
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< content-length: 13
< date: Tue, 06 Aug 2019 13:36:50 GMT
<
Hello, world
* Connection #0 to host localhost left intact

§Use-case #2: Angular-like applications

If you are using Angular (or any of a large variety of other such libraries, such as Svelte + Routify) as frontend, you may want to resolve all not found calls via index.html of frontend app. To do this just call method resolve_not_found_to_root after resource creation.

use actix_web::{App, HttpServer};
use actix_plus_static_files::{build_hashmap_from_included_dir, ResourceFiles, Dir, include_dir};

const DIR: Dir = include_dir!("./examples/static");

#[actix_web::main]
async fn main() {
    HttpServer::new(|| {
        let hash_map = build_hashmap_from_included_dir(&DIR);
        App::new().service(ResourceFiles::new("/", hash_map).resolve_not_found_to_root())
    })
        .bind("127.0.0.1:8192")
        .expect("Failed to bind to port")
        .run()
        .await
        .expect("Failed to run server");
}

Remember to place you static resources route after all other routes.

Structs§

Enums§

Functions§

  • The Dir type as loaded by the re-exported macro from the include_dir crate provides a recursive data structure with nested directories, but a HashMap of paths to resources is more conducive to serving requests. This function performs the necessary recursion to translate from the former to the latter, and should be called at runtime when initializing Actix web routes.