Я хочу обслуживать некоторые статические файлы (.js, .css, ...) с моего гипер-сервера.
В настоящее время единственный способ, который я могу придумать, - это встраивать файлы в виде строк / загружать их при запуске.
Это есть ли лучший способ напрямую обслуживать весь каталог или выбранные файлы?
Как я могу обслуживать статические файлы / каталог в гипер?
Ответы (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
хорошо выглядеть. Единственная проблема в настоящее время заключается в том, что возвращаемые значения не совпадают.
hyper-static
использует type Future = Box<Future<Item = Response, Error = Error>>
, а я использую type Future = futures::future::FutureResult<Response, Error>
- person I3ck; 16.08.2017
nginx
илиcaddy
будет обслуживать файлы в любом случае, поэтому я бы не стал особо беспокоиться об этом и вместо этого установил бы обратный прокси-сервер. - person Jan Nils Ferner   schedule 16.08.2017