标签: happstack

Happstack状态概念和文档?

我正在开始制作Haskell Web服务器.我决定从Happstack和Happstack州开始.而且我很难理解Happstack状态的概念和属性.它是一种新型数据库吗?或者只是对象图系统?

你能解释它的概念和属性(特别是关于ACID,它是如何在磁盘上持久化数据的!)还是指向我的文档描述得很好?

database haskell concept happstack

5
推荐指数
1
解决办法
636
查看次数

如何在Happstack中创建数据库Monad堆栈?

我想创建一个Happstack应用程序,它具有对数据库的大量访问权限.我认为底部有IO的Monad Stack和顶部的Database Write-like monad(中间有日志编写器)将在每次访问中都有一个清晰的功能,例如:

itemsRequest :: ServerConfig -> ServerPart Response
itemsRequest cf = dir "items" $ do
  methodM [GET,HEAD]
  liftIO $ noticeM (scLogger cf) "sended job list"

  items <- runDBMonad (scDBConnString cf) $ getItemLists

  case items of
    (Right xs) -> ok $ toResponse $ show xs
    (Left err) -> internalServerError $ toResponse $ show err
Run Code Online (Sandbox Code Playgroud)

附:

getItemList :: MyDBMonad (Error [Item])
getItemList = do
  -- etc...
Run Code Online (Sandbox Code Playgroud)

但我对Monad和Monad变形金刚知之甚少(我把这个问题视为一个练习来了解它),我不知道如何开始创建Database Monad,如何将IO从happstack提升到数据库堆栈, ...等等.

monads haskell monad-transformers happstack

5
推荐指数
2
解决办法
842
查看次数

Happstack显示读取文件

这是一个Haskell新问题,可能与IO()monad有关.

我在一个Happstack.Server为文件上传生成响应的程序中有一个函数.

postFile = do methodM POST
              decodeBody filePolicy
              (tmp, name, meta) <- lookFile "upload"
              ok $ concat ["A file! ", tmp, " || ", name, " || ", show meta]
Run Code Online (Sandbox Code Playgroud)

这很好.现在,我希望它显示上传文件的内容以及本地临时名称,原始名称和内容类型元数据.我假设因为这一切都发生在一个do街区,我可以

postFile = do methodM POST
              decodeBody filePolicy
              (tmp, name, meta) <- lookFile "upload"
              contents <- readFile tmp
              ok $ concat ["A file! ", tmp, " || ", name, " || ", show meta, "\n\n", contents]
Run Code Online (Sandbox Code Playgroud)

但这给我带来了一连串的错误,这似乎告诉我一些事情随着decodeBody电话而来.

...
/home/inaimathi/projects/happstack-tutorial/parameters.hs:23:15:
    No instance …
Run Code Online (Sandbox Code Playgroud)

file-io haskell happstack

5
推荐指数
1
解决办法
507
查看次数

是否有可能匹配Happstack中的PATCH请求?

我想知道是否有可能匹配Happstack中的PATCH请求,除了Method数据类型没有PATCH的构造函数:

data Method
= GET | HEAD | POST | PUT | DELETE | TRACE | OPTIONS | CONNECT
Run Code Online (Sandbox Code Playgroud)

但是,在某些情况下可能会出现对PATCH请求的需求,例如,在使用Backbone.js时它可以很方便.如果可以在不修改Happstack的情况下匹配不同的方法而不是定义的方法,那将是很好的.另外我想知道Happstack是否支持PATCH请求的特殊原因.

haskell http happstack http-patch

5
推荐指数
1
解决办法
157
查看次数

我应该选择哪种Yesod的Warp和snap-server用于高性能应用服务器?

我在Yesod的主页上看过基准测试,但它们主要用于静态文件.Snap网站上的基准测试已经过时了.

我正在尝试将Haskell模块公开为服务.服务器的逻辑是在json中接收函数名和参数,调用haskell函数并再次将输出作为json传递.引用透明性保证了线程安全性以及记忆和缓存功能的能力.

如果我支持大约2k - 5k的并发连接,我将如何实现它?这种方法的可扩展性如何?

haskell happstack yesod haskell-snap-framework

5
推荐指数
2
解决办法
2283
查看次数

happstack-server-tls仅适用于自签名证书

我正在尝试使用happstack-server-tls创建一个Web服务器,该服务器将使用由私有CA签名的证书.不幸的是,如果我给服务器一个自签名证书,那么TLS握手似乎只会成功.Wireshark显示,当我的服务器使用由我的私有CA签名的证书时,它不会向客户端发送服务器Hello消息,而是发送致命(2)警报消息,报告握手失败(40).

这不是Web浏览器拒绝服务器证书的情况; Wireshark显示TLS握手甚至从未达到服务器向浏览器提供证书的程度.也不是未能就加密算法达成一致的情况,因为服务器使用与我想要使用的算法相同的自签名证书运行时没有问题.证书本身似乎有效,因为它openssl s_server在命令行上按预期工作,并且happstack-server-tls似乎使用OpenSSL进行TLS操作,所以我认为这不是证书生成方式的问题.

为了让happstack-server-tls与非自签名证书一起工作,我需要做些什么?

以下是一个最小的Haskell程序,它使用happstack-server-tls在端口8443上运行Web服务器来演示该问题.它最多需要三个参数:包含服务器私钥的文件,包含服务器证书的文件,以及(可选)包含CA证书的文件.

module Main ( main ) where

import Happstack.Server.Response (ok)
import Happstack.Server.SimpleHTTPS (TLSConf (..), nullTLSConf, simpleHTTPS)
import System.Environment (getArgs)

main :: IO ()
main = do args <- getArgs
          case args of
            [keyFile, certFile]         -> runServer keyFile certFile Nothing
            [keyFile, certFile, caFile] -> runServer keyFile certFile (Just caFile)

runServer :: FilePath -> FilePath -> Maybe FilePath -> IO ()
runServer keyFile certFile caFile = simpleHTTPS conf $ ok ":-)" …
Run Code Online (Sandbox Code Playgroud)

ssl haskell happstack

5
推荐指数
0
解决办法
279
查看次数

使用IxSet,我可以围绕任意Indexable类型构建一个Indexable包装器吗?

我希望能够做的事情如下:

import Data.IxSet

newtype Key a = Key Integer
  deriving (Eq, Ord, Show)

data Keyed a = Keyed { key :: (Key a), value :: a }
  deriving (Eq, Ord, Show)

instance Indexable a => Indexable (Keyed a)
    where empty = ixSet $ ixFun (\k -> [key k]) : _somehow_reuse_indices_of_a_
Run Code Online (Sandbox Code Playgroud)

我的想法是,如果某些数据结构是Indexable,我应该能够Keyed用相同的类型(加上索引Key a)来索引它.

应该很容易将传递给ixFun包装类型索引的函数转换为使用Keyed而不是a:只需要编写value.但我找不到任何方法来实际掌握这些功能.

我也看了一下ixset类型的包; Indexable的版本实际上提供了一个索引列表,而不是一个空的IxSet.这似乎更适合重用索引,但"索引列表"是一个自定义类型,它不会导出它的构造函数,所以我似乎无法得到它们.

我错过了任何支持这种用法的东西吗?

haskell happstack

5
推荐指数
1
解决办法
129
查看次数

如何解决具有相同包的不同版本范围的依赖树?

我正在尝试使用stack设置happstack-lite应用程序。

我用这些命令初始化了项目:

stack new my-happstack
cd my-happstack
stack setup
Run Code Online (Sandbox Code Playgroud)

我更改了package.yaml,因此它包含:

dependencies:
- base >= 4.7 && < 5
- happstack-lite >= 7.3
Run Code Online (Sandbox Code Playgroud)

然后我多次运行stack build并根据建议更改了项目目录中stack.yaml中的extra-deps(添加了依赖项,例如happstack-server)。

显然,我被要求将已经列出的包添加到extra-deps中,它们具有不同的版本边界和相同的版本(template-haskell-2.11.1.0):

stack.yaml内容:

extra-deps:
- happstack-lite-7.3.6
- happstack-server-7.4.6.4
- Win32-2.2.2.0@sha256:10ed55dd31315f386910c121c1d1d442df83bd2ee92090a753cd65300735a8ca
- network-2.6.3.6@sha256:1ca79d81af02d7acd6032d5e6c9bde4618a8fdcfbe19bd42b49d420183975df0
- template-haskell-2.11.1.0@sha256:f90d6ab73ad35c749e8547ca132e7ab5d32d2f8e7bb2e2ff6d597be26b58e061
- transformers-compat-0.5.1.4@sha256:1b4bfa8589afb1ca0e719129ab261bd90ef0cc3e6c0b9963f94970c082b61250
Run Code Online (Sandbox Code Playgroud)

堆栈构建的输出:

F:\Projects\Haskell\my-happstack>stack build

Error: While constructing the build plan, the following exceptions were encountered:

In the dependencies for Cabal-2.4.1.0: …
Run Code Online (Sandbox Code Playgroud)

haskell happstack haskell-stack

5
推荐指数
0
解决办法
142
查看次数

关于Haskell/HappStack中语法和类型签名的新手问题

为什么我不能这样做

z = x?
Run Code Online (Sandbox Code Playgroud)

但我可以这样做吗?

y s = x s
Run Code Online (Sandbox Code Playgroud)

我是Haskell新手这是我在GHCi中尝试过的:

Prelude> import Happstack.Server
Prelude Happstack.Server> let x s = ok $ toResponse $ "Some string"
Prelude Happstack.Server> :t x
x :: FilterMonad Response m => t -> m Response

Prelude Happstack.Server> let y s = x s
Prelude Happstack.Server> :t y
y :: FilterMonad Response m => t -> m Response

Prelude Happstack.Server> let z = x
<interactive>:1:9:
    No instance for (FilterMonad Response m0)
      arising from a use of …
Run Code Online (Sandbox Code Playgroud)

haskell happstack

4
推荐指数
1
解决办法
205
查看次数

如何在Haskell中查找类的源代码(实现)

我正在阅读有关IxSet的http://happstack.com/docs/crashcourse/AcidState.html#ixset的一些文档,我想知道如何查看从Data.IxSet导入的Indexable类型类的源代码.

然后我拿了一个Happstack的存储库,然后看着那里(darcs得到http://patch-tag.com/r/mae/happstack),但这让我更加沮丧.

我看到happstack/happstack-ixset/src/Happstack/Data/IxSet.hs文件,它创建了一个模块Happstack.Data.IxSet,但是我看不到哪个文件创建了一个模块Data.IxSet(并实现了类Indexable) .

haskell happstack

4
推荐指数
1
解决办法
470
查看次数