Публикация данных формы с помощью nickel.rs работает в первый раз, возвращает 404 раза

Я создал следующую форму входа и сопровождающий шаблон:

main.rs

#[macro_use]
extern crate nickel;
extern crate mustache;
extern crate rustc_serialize;

use std::collections::HashMap;
use nickel::{Nickel, MediaType, HttpRouter};
use nickel::status::StatusCode;

fn main() {
    let mut server = Nickel::new();
    let mut router = Nickel::router();

    router.get("/", middleware!(|request, mut response| {
        response.set(StatusCode::Ok);
        response.set(MediaType::Html);
        return response.send_file("assets/login.tpl");
    }));

    router.post("/login", middleware!(|request, mut response| {
        response.set(StatusCode::Ok);
        response.set(MediaType::Html);

        let mut data: HashMap<&str, &str> = HashMap::new();
        data.insert("error", "hello");
        return response.render("assets/login.tpl", &data);
    }));

    server.utilize(router);
    server.listen("127.0.0.1:6767");
}

активы /login.tpl

<html lang="en">
    <head>
        <meta charset="utf8"/>
    </head>
    <body>
        <h1>Login</h1>
        <form method="post" action="login">
            <label for="email">Email</label>
            <input type="email" name="email"/>
            <br/>
            <label for="password">Password</label>
            <input type="password" name="password"/>
            <br/>
            <button type="submit">Login</button><br/>
            <a href="/register">Register</a>
        </form>
        {{error}}
    </body>
</html>

Когда я отправляю форму в первый раз, я вижу сообщение "привет". Если я отправляю форму снова, я вижу "Не найдено".

Я не могу понять, где проблема.

1 ответ

Решение

Проблема в том, что вы отправляете данные POST, а они не читаются, что приводит к следующему запросу (из-за keepalive).

Чтобы исправить это, вы можете либо убедиться, что тело POST прочитано, либо добавить Connection: Close к заголовкам ответа, чтобы предотвратить keepalive.

FWIW: Это известная проблема в гипер, но никель должен добавить свое собственное решение, чтобы избежать путаницы здесь. Если вы хотите следить за обновлениями по этому вопросу, пожалуйста, подпишитесь на проблему, в которой Shepmaster вошел на Github.

Другие вопросы по тегам