问题标签 [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 回答
233 浏览

haskell - 如何从 Wai 请求转到 Yesod 路线?

我想使用Wai HttpAuth 中间件在 HTTP 基本身份验证后面隐藏几页。为此,HttpAuth 中间件提供authIsProtected :: !(Request -> IO Bool).

要实现authIsProtected,我需要检查 URL 是否仅限管理员;似乎最好的方法是在文件中创建路由属性routes,然后使用此函数访问它们routeAttrs :: RouteAttrs a => Route a -> Set Text

但是,我无法访问函数Route中的a authIsProtected,只能访问 Wai Request。有没有办法可以从一个围Request到一个Route?我认为 Yesod 必须在后台执行此操作,但我不知道在哪里/如何。

可能我应该isAuthorized在我可以访问的地方进行身份验证Route,但我不确定我是否可以从那里运行 HTTP 基本身份验证。

编辑:这是我想出的:

0 投票
1 回答
991 浏览

haskell - 在 Haskell WAI 中,如何将标头添加为中间件?

我试图通过编写一个非常简单的会话管理器来理解中间件。

我需要SetCookie在响应中添加标题。我查看了wai-extra包裹,发现wai-session.

我正在使用 wai-3.0.2,它似乎无法让我直接访问 Response 的类型构造函数,并且我找到的所有示例都使用模式匹配Response(..)来添加标题。

你能为我指出正确的方向吗?

0 投票
0 回答
149 浏览

haskell - Haskell websocket在不活动后关闭?

我有一个片段,在打开连接后看起来像这样

如果从客户端发送事件,则此代码有效,但在关闭某些不活动连接后,我在客户端(web javascript)连接关闭时收到错误(调用 websockets 的 onclose)。websockets 在一些不活动后是否关闭。另外,如果这是在主线程中,它可以正常工作吗?

0 投票
0 回答
212 浏览

haskell - 如何从 Vault 中获取数据

我正在使用 wai 来构建 Web 后端。

我想知道请求的保险库中保存了哪种数据。

但我不知道如何检查此保险库中已有哪些密钥。

我找到了https://github.com/HeinrichApfelmus/vault/blob/master/src/Data/Vault/ST/ST.hs

并尝试

但是ghc说“不在范围内:数据构造函数'DV.Vault'”

有什么办法可以得到金库的钥匙?

或者我可以知道哪些数据保存在这个保险库中的文档在哪里。

0 投票
3 回答
551 浏览

haskell - 如何限制 WAI 中请求正文和标头的大小?

我正在使用Scotty开发一个应用程序,当然还有WAI。我希望能够限制请求的大小,包括正文长度和标题。我怎样才能做到这一点?是否可以使用普通的 WAI 中间件来做到这一点?

0 投票
1 回答
268 浏览

haskell - 在没有“IO”的情况下在 WAI 中使用请求参数会导致问题

我正在为使用 WAI 启动和运行 API 的基础知识而苦苦挣扎。主要问题是处理IO感染一切。我相信一旦我更好地理解 Monads,我的问题就会解决,但希望这个问题的答案将是一个很好的起点。

以下是一个简短示例,它在根 url 上提供静态 html 页面,并接受带有用户名的请求,该用户名/api/my-data应返回相应用户的数据。我不知道如何使用IO Bytestring请求body来进行地图查找、检索数据并将结果发送回以 json 编码的结果。

我尝试使用fmap提取Bytestring然后unpack将其转换为字符串以进行查找,但无论我做什么,我最终都会追逐与该死的IOmonad 相关的类型错误。

无论如何,这是相关的代码:

这会导致此错误:

我可以轻松地更改和的类型,getUserInfomyData最终IO Bytestring -> IO (Map.Map String String)IO (Map.Map String String) -> Response出现更多类型错误。类型让我头晕目眩。

0 投票
2 回答
209 浏览

haskell - 在与 WAI 处理程序内的数据库通信时避免由 IO 引起的错误

我正在使用 warp、wai 和 acid-state 在 haskell 中编写 Web 服务。到目前为止,我有两个需要数据库交互的处理函数,后者给我带来了麻烦。

首先是注册:

如您所见,我设法IO通过在let _ = ...

在登录功能(目前只返回用户地图)中,我无法避免IO,因为我需要在响应中实际发回结果:

这会导致以下错误:

我相信该错误是由 db 查询返回一个IO值引起的。我的第一个想法是Response将类型签名更改为IO Response,但随后顶层函数抱怨它需要一个Response,而不是一个IO Response

在类似的注释中,我本来希望这样写registerUser

但这会导致非常相似的错误。

为了完整起见,这里是调用registerUserand的函数loginUser

如何避免这些 IO 错误?

0 投票
1 回答
2759 浏览

haskell - 用仆人/围服务静态文件

我正在按照本教程http://www.parsonsmatt.org/programming/2015/06/07/servant-persistent.html通过servant 创建API。我想自定义服务器以提供静态文件,但找不到方法。

我正在使用stack构建工具。

我修改了Main.hs文件的运行以包含static( run port $ static $ logger $ app cfg) 并导入了Network.Wai.Middleware.Static (static). 我还添加wai-middleware-static >=0.7.0 && < 0.71到了我的 cabal 文件中。

当我运行时,stack build我得到:( 更新:这部分完全是我的错误。我将包添加到错误的 cabal 文件中.. 蹩脚。导入 Network.Wai.Middleware.Static 工作并提供静态文件。留下下面的错误以防万一任何人搜索它并发现它很有用。)

接下来我尝试使用servant的serveDirectory如下(简化):

我收到此错误:

我是 Haskell 初学者,我对 Wai 不熟悉,所以甚至不确定从哪里开始。我需要对博客文章中的示例代码进行哪些更改才能提供静态文件?

编辑:由于评论从默认视图中隐藏,我将我的最后一条评论粘贴在这里:

这是他博客中马特代码的低调版本。我将他的所有模块合并到一个文件中,删除了所有数据库内容,但没有清理扩展/导入。当我运行此代码时,我收到上述类型不匹配错误。请注意,此代码不使用 Network.Wai.Middleware.Static,而我使用的是符合条件的 Servant StaticFiles 导入。

0 投票
1 回答
113 浏览

haskell - 为什么这在 GHCi 中有效,但在 Scotty 中无效?

我正在尝试制作一个列出给定目录内容的网页,但我遇到了一个奇怪的问题:当我在 GHCi 中逐行运行代码时,代码会产生所需的输出,但是当它在运行中执行时Scotty 实例,它会产生不同的(错误的)输出。这是代码的相关部分:

(语句中的最后一行do只是将其呈现为 html。这有效,但正确的输出永远不会到达该函数)当我在 GHCi 中运行此函数的每一行时,我得到以下输出:

这是我所期待的。但是当这个函数从 Scotty 运行时,称为 as serveDir "stuff/",我得到这个输出:

这里发生了什么?我知道 ActionM 是 MonadIO 的一个实例,否则将无法编译。我有点不知所措。有人可以对此有所了解或提供建议吗?其余代码可根据要求提供,但我可以说我正在使用 wai-middleware-static 来允许静态文件请求,并且其他函数中来自该目录的其他文件请求有效。

0 投票
0 回答
96 浏览

http - 将 WAI 流与安全管道交错

我正在使用管道和 WAI 来传输音频。问题是我需要先查看安全管道中的一些数据,然后根据提取的信息选择响应标头,然后继续将该管道作为响应主体进行流式传输。这是我现在所拥有的,并且工作正常:

respond是标准Application的函数参数,Mpeg.headerFromPipe是我的前瞻性计算:

所以问题是:有什么方法可以在和用于选择标题respond之间移动。我无法拆分并分成两个不同的 SafeT计算线程,因为首先将完成管道和管道(这是执行几次、检查数据、返回内容并与其余部分链接的结果)将失败。headerFromPipeformphresponseStreamheaderFromPipeforrunSafeTchunksnext