Compojure和Friend这个例子中的状态在哪里

时间:2013-12-11 14:20:46

标签: clojure ring

我写了一个看起来很像的clojure webapp 给出as the friend exmaple的示例webapp。我有 使用ring-mock编写了一个小测试来测试身份验证 工作正常。写这个测试我发现了一些我不理解的行为。

请参阅以下代码作为示例。

(let [route "/login"
      login-post (body (request :post route)
                       {"username" "Username" "password" "Password"})]
  (println (secured-app login-post))
  (println (secured-app login-post)))

第一个println会返回正确的结果:

{:status 303,
 :headers
 {"Set-Cookie"
  ("ring-session=ENCRYPTED-STUFF;Path=/"),
  "Location" "/"},
 :body ""}

但第二个返回登录错误:

{:status 302,
 :headers
 {"Location" "http://localhost/login?&login_failed=Y&username="},
 :body ""}

在此代码的某处,有一个状态是从第一个“传输” 请求被处理到第二个请求(secured-app login-post),但我没有看到它。

例如,当我运行此语句时:

 (println (secured-app(body (request :post "/login")
                            {"username" "Username" "password" "Password"})))

在repl中多次,我总是得到第一个正确的结果。

此行为来自何处以及此示例中的州处于何处?

1 个答案:

答案 0 :(得分:3)

ring.mock.request/body函数将给定的主体数据转换为可变的ByteArrayInputStream。这意味着通常,一旦您的请求通过应用程序传递,正在读取正文流(通常是ring.middleware.params/assoc-form-params,它会在请求正文上调用slurp),现在为空。

换句话说,如果您使用ring-mock测试环形应用程序,则不应重复使用正文的请求。最好总是创建一个新请求。