Как я могу обслуживать статические файлы / каталог в гипер?

Я хочу обслуживать некоторые статические файлы (.js, .css, ...) с моего гипер-сервера.
В настоящее время единственный способ, который я могу придумать, - это встраивать файлы в виде строк / загружать их при запуске.
Это есть ли лучший способ напрямую обслуживать весь каталог или выбранные файлы?


person I3ck    schedule 16.08.2017    source источник
comment
При развертывании в реальном мире ваш nginx или caddy будет обслуживать файлы в любом случае, поэтому я бы не стал особо беспокоиться об этом и вместо этого установил бы обратный прокси-сервер.   -  person Jan Nils Ferner    schedule 16.08.2017
comment
@JanNilsFerner Я с уважением не согласен с таким широким заявлением. Помните, что Rust - это системный язык, тот язык, на котором вы пишете NGINX. Кто сказал, что OP не пытается написать такой слой?   -  person Shepmaster    schedule 16.08.2017
comment
@Shepmaster Согласен, Rust был бы идеальным языком для написания обратного прокси. Обратите внимание, что я имел в виду, что мой комментарий должен интерпретироваться как прагматический совет, т.е. я предполагаю, что OP, вероятно, не пишет следующий nginx и просто хочет создать сеть на низком уровне, и в этом случае я бы рекомендовал не изобретать велосипед и использовать его код вместе с другими проверенными решениями.   -  person Jan Nils Ferner    schedule 16.08.2017
comment
Я бы предпочел, чтобы это было в одном месте. Другие фреймворки позволяли просто отображать пути к каталогам. Тем не менее, использование nginx - хорошее предложение. Но сначала я попробую сделать это в гипер   -  person I3ck    schedule 16.08.2017


Ответы (1)


После ввода слов «гиперстатический» в crates.io первый результат был гиперстатический файл. В репозитории GitHub проекта есть examples directory, с одним из таких примеров:

extern crate futures;
extern crate hyper;
extern crate hyper_staticfile;
extern crate tokio_core;

// This example serves the docs from target/doc/hyper_staticfile at /doc/
//
// Run `cargo doc && cargo run --example doc_server`, then
// point your browser to http://localhost:3000/

use futures::{Future, Stream, future};
use hyper::Error;
use hyper::server::{Http, Request, Response, Service};
use hyper_staticfile::Static;
use std::path::Path;
use tokio_core::reactor::{Core, Handle};
use tokio_core::net::TcpListener;

type ResponseFuture = Box<Future<Item=Response, Error=Error>>;

struct MainService {
    static_: Static,
}

impl MainService {
    fn new(handle: &Handle) -> MainService {
        MainService {
            static_: Static::new(handle, Path::new("target/doc/")),
        }
    }
}

impl Service for MainService {
    type Request = Request;
    type Response = Response;
    type Error = Error;
    type Future = ResponseFuture;

    fn call(&self, req: Request) -> Self::Future {
        if req.path() == "/" {
            let res = Response::new()
                .with_status(hyper::StatusCode::MovedPermanently)
                .with_header(hyper::header::Location::new("/hyper_staticfile/"));
            Box::new(future::ok(res))
        } else {
            self.static_.call(req)
        }
    }
}

fn main() {
    let mut core = Core::new().unwrap();
    let handle = core.handle();

    let addr = "127.0.0.1:3000".parse().unwrap();
    let listener = TcpListener::bind(&addr, &handle).unwrap();

    let http = Http::new();
    let server = listener.incoming().for_each(|(sock, addr)| {
        let s = MainService::new(&handle);
        http.bind_connection(&handle, sock, addr, s);
        Ok(())
    });

    println!("Doc server running on http://localhost:3000/");
    core.run(server).unwrap();
}
person Shepmaster    schedule 16.08.2017
comment
хорошо выглядеть. Единственная проблема в настоящее время заключается в том, что возвращаемые значения не совпадают. hyper-static использует type Future = Box<Future<Item = Response, Error = Error>>, а я использую type Future = futures::future::FutureResult<Response, Error> - person I3ck; 16.08.2017