问题标签 [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 请求转到 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 基本身份验证。
编辑:这是我想出的:
haskell - 在 Haskell WAI 中,如何将标头添加为中间件?
我试图通过编写一个非常简单的会话管理器来理解中间件。
我需要SetCookie
在响应中添加标题。我查看了wai-extra
包裹,发现wai-session
.
我正在使用 wai-3.0.2,它似乎无法让我直接访问 Response 的类型构造函数,并且我找到的所有示例都使用模式匹配Response(..)
来添加标题。
你能为我指出正确的方向吗?
haskell - Haskell websocket在不活动后关闭?
我有一个片段,在打开连接后看起来像这样
如果从客户端发送事件,则此代码有效,但在关闭某些不活动连接后,我在客户端(web javascript)连接关闭时收到错误(调用 websockets 的 onclose)。websockets 在一些不活动后是否关闭。另外,如果这是在主线程中,它可以正常工作吗?
haskell - 如何从 Vault 中获取数据
我正在使用 wai 来构建 Web 后端。
我想知道请求的保险库中保存了哪种数据。
但我不知道如何检查此保险库中已有哪些密钥。
我找到了https://github.com/HeinrichApfelmus/vault/blob/master/src/Data/Vault/ST/ST.hs
并尝试
但是ghc说“不在范围内:数据构造函数'DV.Vault'”
有什么办法可以得到金库的钥匙?
或者我可以知道哪些数据保存在这个保险库中的文档在哪里。
haskell - 在没有“IO”的情况下在 WAI 中使用请求参数会导致问题
我正在为使用 WAI 启动和运行 API 的基础知识而苦苦挣扎。主要问题是处理IO
感染一切。我相信一旦我更好地理解 Monads,我的问题就会解决,但希望这个问题的答案将是一个很好的起点。
以下是一个简短示例,它在根 url 上提供静态 html 页面,并接受带有用户名的请求,该用户名/api/my-data
应返回相应用户的数据。我不知道如何使用IO Bytestring
请求body
来进行地图查找、检索数据并将结果发送回以 json 编码的结果。
我尝试使用fmap
提取Bytestring
然后unpack
将其转换为字符串以进行查找,但无论我做什么,我最终都会追逐与该死的IO
monad 相关的类型错误。
无论如何,这是相关的代码:
这会导致此错误:
我可以轻松地更改和的类型,getUserInfo
但myData
最终IO Bytestring -> IO (Map.Map String String)
会IO (Map.Map String String) -> Response
出现更多类型错误。类型让我头晕目眩。
haskell - 在与 WAI 处理程序内的数据库通信时避免由 IO 引起的错误
我正在使用 warp、wai 和 acid-state 在 haskell 中编写 Web 服务。到目前为止,我有两个需要数据库交互的处理函数,后者给我带来了麻烦。
首先是注册:
如您所见,我设法IO
通过在let _ = ..
.
在登录功能(目前只返回用户地图)中,我无法避免IO
,因为我需要在响应中实际发回结果:
这会导致以下错误:
我相信该错误是由 db 查询返回一个IO
值引起的。我的第一个想法是Response
将类型签名更改为IO Response
,但随后顶层函数抱怨它需要一个Response
,而不是一个IO Response
。
在类似的注释中,我本来希望这样写registerUser
:
但这会导致非常相似的错误。
为了完整起见,这里是调用registerUser
and的函数loginUser
:
如何避免这些 IO 错误?
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 文件中。
当我运行时,更新:这部分完全是我的错误。我将包添加到错误的 cabal 文件中.. 蹩脚。导入 Network.Wai.Middleware.Static 工作并提供静态文件。留下下面的错误以防万一任何人搜索它并发现它很有用。)stack build
我得到:(
接下来我尝试使用servant的serveDirectory
如下(简化):
我收到此错误:
我是 Haskell 初学者,我对 Wai 不熟悉,所以甚至不确定从哪里开始。我需要对博客文章中的示例代码进行哪些更改才能提供静态文件?
编辑:由于评论从默认视图中隐藏,我将我的最后一条评论粘贴在这里:
这是他博客中马特代码的低调版本。我将他的所有模块合并到一个文件中,删除了所有数据库内容,但没有清理扩展/导入。当我运行此代码时,我收到上述类型不匹配错误。请注意,此代码不使用 Network.Wai.Middleware.Static,而我使用的是符合条件的 Servant StaticFiles 导入。
haskell - 为什么这在 GHCi 中有效,但在 Scotty 中无效?
我正在尝试制作一个列出给定目录内容的网页,但我遇到了一个奇怪的问题:当我在 GHCi 中逐行运行代码时,代码会产生所需的输出,但是当它在运行中执行时Scotty 实例,它会产生不同的(错误的)输出。这是代码的相关部分:
(语句中的最后一行do
只是将其呈现为 html。这有效,但正确的输出永远不会到达该函数)当我在 GHCi 中运行此函数的每一行时,我得到以下输出:
这是我所期待的。但是当这个函数从 Scotty 运行时,称为 as serveDir "stuff/"
,我得到这个输出:
这里发生了什么?我知道 ActionM 是 MonadIO 的一个实例,否则将无法编译。我有点不知所措。有人可以对此有所了解或提供建议吗?其余代码可根据要求提供,但我可以说我正在使用 wai-middleware-static 来允许静态文件请求,并且其他函数中来自该目录的其他文件请求有效。
http - 将 WAI 流与安全管道交错
我正在使用管道和 WAI 来传输音频。问题是我需要先查看安全管道中的一些数据,然后根据提取的信息选择响应标头,然后继续将该管道作为响应主体进行流式传输。这是我现在所拥有的,并且工作正常:
respond
是标准Application的函数参数,Mpeg.headerFromPipe
是我的前瞻性计算:
所以问题是:有什么方法可以在和用于选择标题respond
之间移动。我无法拆分并分成两个不同的 SafeT计算线程,因为首先将完成管道和管道(这是执行几次、检查数据、返回内容并与其余部分链接的结果)将失败。headerFromPipe
for
mph
responseStream
headerFromPipe
for
runSafeT
chunks
next