问题标签 [haskell-wai]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
342 浏览

haskell - 使用 WAI 获取 HTTP 请求的绝对形式请求目标

Request类型为请求方法和请求版本提供访问器,但不为两者之间的位提供访问器。

因此,如果我有以下要求:

GET http://www.example.org/index.html HTTP/1.1

我想要http://www.example.org/index.html介于两者之间

向代理发出请求时,RFC7230 第 5.3.2 节允许这样做。第 5.4 节说,Host如果请求在absolute-form. 这对我来说似乎已经足够好了,我不知道如果客户端行为不正确并发送与absolute-formURI 不同的 Host 标头,WAI 是否会正确处理此问题。

或者,如果这是不可能的:我想问一下 Haskell 中是否有比 WAI 更底层的 HTTP 库?

0 投票
1 回答
105 浏览

haskell - 使用 Servant 和 Raw WAI directoryServer 构建不正确的路由

作为 Haskell Servant 项目的一部分,我试图提供一个目录服务器作为端点,即

当我导航到我的页面时,例如

哪个服务

我看到页面与fileA预期fileB的表格一样并列在表格中。然而,问题是当我点击fileA(例如)我被重定向到

和 404 错误。但是,如果我手动输入正确的地址,

我得到了奖励fileA。那么如何告诉 Servant 或 Network.Wai.Application 为目录服务器中的路径添加前缀呢?


更多信息。当我使用静态路由而不是捕获时,该应用程序也会失败:

但是,如果我使用根路由,则处理程序按预期工作。


简单目录服务器.hs


simpleDirServer.cabal

0 投票
1 回答
68 浏览

haskell - wai-logger FileLogSpec 作为 Scotty 中间件报告 openFile:资源繁忙(文件已锁定)

我在 Haskell 中将 Scotty 用于后端应用程序,我有兴趣将所有请求记录到文件中。现有的 wai-middleware requestlogger是不够的,因为我想要FileLogSpec的属性,因为我喜欢 FileLogSpec 允许的多个但很短的日志文件。

我也对日志记录问题的替代解决方案持开放态度,但我对从 Scotty 切换不感兴趣。

我的问题是,在第一次请求后我收到此错误:

并且应用程序完全停止记录。

我目前将 wai-logger 变成中间件的实现是:

我尝试使用括号来清理记录器,如下所示:

这是我使用它的方式:

不幸的是,这导致了同样的结果。

我也在 wai logger 上创建了一个问题:https ://github.com/kazu-yamamoto/logger/issues/183

完整的源代码在这里:https ://github.com/into-cps-association/utilities_backend

0 投票
1 回答
111 浏览

haskell - 测试 wai 应用程序的状态更新

我有一个在Wai之上编写的应用程序,配置为具有一些自定义状态并且可以使用Test.Hspec.Wai进行测试。

我可以测试请求/响应交互,但我无法弄清楚如何测试状态变化;具体来说,如果我的应用程序状态是 a TVar Text,我如何在测试中从中获取值,以验证其值?


*) 请注意,getState我这里所说的方法在撰写本文时并未在最新的 LTS 中导出;添加 hspec-wai-0.10.1 以extra-deps获得具有此处提到的所有功能的版本。

0 投票
0 回答
91 浏览

haskell - 如何使用 Haskell 中间件添加 HTTP 请求正文的请求和响应的特定表示

如何在请求记录器中添加请求和响应正文的特定表示?我希望能够有一些typeclass可以让我实现这种表示。在Network.Wai.Middleware.RequestLogger.JSON我可以看到请求记录器是如何实现的。

因此,如果我要收到请求:

我只想通过电子邮件发送:

我通过一些类型类来做到这一点:

这将允许我轻松使用我不想修改其默认行为的类型的 toJSON 和 FromJSON。是否也可以修改它,以便当我的应用程序像“消息”字段或“活动”字段一样运行时,我可以添加一些任意上下文。

0 投票
1 回答
160 浏览

haskell - 有没有办法在 scotty 中捕获所有异常而不将我的所有代码包装在异常捕获中

我希望我的默认处理程序能够捕获我的应用程序抛出的所有异常,但为了实现这一点,我需要在手动添加一些异常捕获后手动调用 raise 我的 IO 代码。

下面是一个示例最小服务器:

我希望能够在我的默认处理程序中捕获所有未捕获的异常,但这不是 scotty 的默认行为,只有在你调用raise. 我可以将我所有的 ActionM 代码块都包装在其中,ExceptT但这似乎是解决此问题的一种混乱/机械的方式。我主要是为了记录目的而这样做,这样我就可以向 Sentry 报告或记录到文件中,这样会更方便。

0 投票
0 回答
48 浏览

haskell - 使用“requestBody”(或“getRequestBodyChunk”)时遇到问题

依赖版本

  • 围:3.2.2.1

概要

我很不清楚getRequestBodyChunkhttps://hackage.haskell.org/package/wai-3.2.2.1/docs/Network-Wai.html#v:getRequestBodyChunk )的工作。我知道它会读取请求中可用的下一个字节块;最后产生一个Data.ByteString.empty指示没有更多可用字节。

因此,给定一个req :: Request; 我正在尝试Conduit从请求正文创建一个:

但是,这似乎立即终止,因为我已经看到跟踪输出:

输出是

因此流终止。

但是我可以通过其他方式验证请求正文不为空。

所以我对此有点困惑,我有几个问题:

  • 这是否意味着请求正文已经被消费了?

  • 或者这是否意味着请求正文没有被分块?

  • 或者这是否意味着对于较小的请求?分块字节总是空的?

  • Scotty 是否覆盖了这一点,特别是对于较小的请求(我似乎无法在其代码/文档中的任何地方找到它。)

  • 如果我做这样的事情:

我确实得到了一个非终止的字节流;这使我怀疑这部分代码之前的某些内容消耗了请求正文:或者该函数返回一个空正文开始。

需要注意的一点是,这似乎只发生在较小的请求中。

另一点需要注意的是,我得到了Wai.Requestvia Web.Scotty.Trans.request;其中也有与身体相关的流媒体助手。

这也可以记录在案吗?我相信getRequestBodyChunk这些信息可以改进 etc. 的文档。

0 投票
1 回答
80 浏览

haskell - 将数据放入请求库的中间件

我正在尝试编写一个 WAI 中间件,将一些数据放入请求的保险库中,但我似乎遗漏了一些东西,因为我以后无法查找它。即使是最简单的中间件也会失败:

然后我像这样使用它:

执行此操作时,http :3000/foo我希望服务器打印Just 42但在 prints 中Nothing,这表明fooMW. 我想我错过了一些关于如何编写中间件或如何使用vault的重要内容,但是什么?

0 投票
1 回答
98 浏览

haskell - 在 Scotty / WAI 中完全发送响应后如何运行操作

根据 GET 请求,我的 Scotty webapp 将运行一些计算并将其结果存储在一个临时文件中,它使用file.

现在我想在文件发送进行一些清理(即删除临时文件) 。Scotty 似乎没有包含这样做的方法。

WAI 中是否有任何功能可以实现这一点?

0 投票
1 回答
58 浏览

apache - 将 yesod 应用程序作为(快速)CGI 服务

我正在尝试将 yesod 应用程序作为 CGI(或 FastCGI)程序提供,但 Apache 向我显示 500 错误:

[Mon Sep 21 17:35:41.425565 2020] [http:error] [pid 2758] [client 10.0.2.2:43872] AH02429:响应标头名称“21/Sep/2020”包含无效字符,正在中止请求

从一个新模板开始stack new project yesodweb/sqlite,我尝试通过更改将其转换为 CGI 程序src/Application.hs

我已经导入了 Wai CGI 库

并将最后一行更改appMainrun app

我认为这是将其用作 CGI 程序的最小更改,但显然不起作用。

我已经查看了 yesod 的关于部署 Web 应用程序的书籍章节,该章节很方便编写适当的 Apache 配置,以便服务器可以运行应用程序。它没有说明对应用程序代码的 nedded 更改,我认为这是问题所在。

我也检查了这个stackoverflow 问题,但它是近 8 年前的,所以现在已经过时了。