【问题标题】:Compojure and Friend where is the state in this exampleCompojure 和 Friend 这个例子中的状态在哪里
【发布时间】:2013-12-11 14:20:46
【问题描述】:

我写了一个很像的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中,我总是得到第一个正确的结果。

此行为从何而来,在此示例中处理的状态在哪里?

【问题讨论】:

  • 我创建了一个小库来存储/重新创建请求,请求的主体是环所期望的流:github.com/noisesmith/groundhog 它可以添加为环处理程序,在请求到来时捕获请求在

标签: clojure ring


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-13
    • 2016-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-21
    • 1970-01-01
    相关资源
    最近更新 更多