问题标签 [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.
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-form
URI 不同的 Host 标头,WAI 是否会正确处理此问题。
或者,如果这是不可能的:我想问一下 Haskell 中是否有比 WAI 更底层的 HTTP 库?
haskell - 使用 Servant 和 Raw WAI directoryServer 构建不正确的路由
作为 Haskell Servant 项目的一部分,我试图提供一个目录服务器作为端点,即
当我导航到我的页面时,例如
哪个服务
我看到页面与fileA
预期fileB
的表格一样并列在表格中。然而,问题是当我点击fileA
(例如)我被重定向到
和 404 错误。但是,如果我手动输入正确的地址,
我得到了奖励fileA
。那么如何告诉 Servant 或 Network.Wai.Application 为目录服务器中的路径添加前缀呢?
更多信息。当我使用静态路由而不是捕获时,该应用程序也会失败:
但是,如果我使用根路由,则处理程序按预期工作。
简单目录服务器.hs
simpleDirServer.cabal
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
haskell - 测试 wai 应用程序的状态更新
我有一个在Wai之上编写的应用程序,配置为具有一些自定义状态并且可以使用Test.Hspec.Wai进行测试。
我可以测试请求/响应交互,但我无法弄清楚如何测试状态变化;具体来说,如果我的应用程序状态是 a TVar Text
,我如何在测试中从中获取值,以验证其值?
*) 请注意,getState
我这里所说的方法在撰写本文时并未在最新的 LTS 中导出;添加 hspec-wai-0.10.1 以extra-deps
获得具有此处提到的所有功能的版本。
haskell - 如何使用 Haskell 中间件添加 HTTP 请求正文的请求和响应的特定表示
如何在请求记录器中添加请求和响应正文的特定表示?我希望能够有一些typeclass
可以让我实现这种表示。在Network.Wai.Middleware.RequestLogger.JSON
我可以看到请求记录器是如何实现的。
因此,如果我要收到请求:
我只想通过电子邮件发送:
我通过一些类型类来做到这一点:
这将允许我轻松使用我不想修改其默认行为的类型的 toJSON 和 FromJSON。是否也可以修改它,以便当我的应用程序像“消息”字段或“活动”字段一样运行时,我可以添加一些任意上下文。
haskell - 有没有办法在 scotty 中捕获所有异常而不将我的所有代码包装在异常捕获中
我希望我的默认处理程序能够捕获我的应用程序抛出的所有异常,但为了实现这一点,我需要在手动添加一些异常捕获后手动调用 raise 我的 IO 代码。
下面是一个示例最小服务器:
我希望能够在我的默认处理程序中捕获所有未捕获的异常,但这不是 scotty 的默认行为,只有在你调用raise
. 我可以将我所有的 ActionM 代码块都包装在其中,ExceptT
但这似乎是解决此问题的一种混乱/机械的方式。我主要是为了记录目的而这样做,这样我就可以向 Sentry 报告或记录到文件中,这样会更方便。
haskell - 使用“requestBody”(或“getRequestBodyChunk”)时遇到问题
依赖版本
- 围:
3.2.2.1
概要
我很不清楚getRequestBodyChunk
(https://hackage.haskell.org/package/wai-3.2.2.1/docs/Network-Wai.html#v:getRequestBodyChunk )的工作。我知道它会读取请求中可用的下一个字节块;最后产生一个Data.ByteString.empty
指示没有更多可用字节。
因此,给定一个req :: Request
; 我正在尝试Conduit
从请求正文创建一个:
但是,这似乎立即终止,因为我已经看到跟踪输出:
输出是
因此流终止。
但是我可以通过其他方式验证请求正文不为空。
所以我对此有点困惑,我有几个问题:
这是否意味着请求正文已经被消费了?
或者这是否意味着请求正文没有被分块?
或者这是否意味着对于较小的请求?分块字节总是空的?
Scotty 是否覆盖了这一点,特别是对于较小的请求(我似乎无法在其代码/文档中的任何地方找到它。)
如果我做这样的事情:
我确实得到了一个非终止的字节流;这使我怀疑这部分代码之前的某些内容消耗了请求正文:或者该函数返回一个空正文开始。
需要注意的一点是,这似乎只发生在较小的请求中。
另一点需要注意的是,我得到了Wai.Request
via Web.Scotty.Trans.request
;其中也有与身体相关的流媒体助手。
这也可以记录在案吗?我相信getRequestBodyChunk
这些信息可以改进 etc. 的文档。
haskell - 将数据放入请求库的中间件
我正在尝试编写一个 WAI 中间件,将一些数据放入请求的保险库中,但我似乎遗漏了一些东西,因为我以后无法查找它。即使是最简单的中间件也会失败:
然后我像这样使用它:
执行此操作时,http :3000/foo
我希望服务器打印Just 42
但在 prints 中Nothing
,这表明fooMW
. 我想我错过了一些关于如何编写中间件或如何使用vault的重要内容,但是什么?
haskell - 在 Scotty / WAI 中完全发送响应后如何运行操作
根据 GET 请求,我的 Scotty webapp 将运行一些计算并将其结果存储在一个临时文件中,它使用file
.
现在我想在文件发送后进行一些清理(即删除临时文件) 。Scotty 似乎没有包含这样做的方法。
WAI 中是否有任何功能可以实现这一点?
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 库
并将最后一行更改appMain
为run app
:
我认为这是将其用作 CGI 程序的最小更改,但显然不起作用。
我已经查看了 yesod 的关于部署 Web 应用程序的书籍章节,该章节很方便编写适当的 Apache 配置,以便服务器可以运行应用程序。它没有说明对应用程序代码的 nedded 更改,我认为这是问题所在。
我也检查了这个stackoverflow 问题,但它是近 8 年前的,所以现在已经过时了。