【问题标题】:How to configure servant-multipart to allow longer file names?如何配置servant-multipart 以允许更长的文件名?
【发布时间】:2018-07-17 00:27:32
【问题描述】:

我有一些servant-multipart 端点,它是用MultipartForm Mem (MultipartData Mem) 之类的东西定义的。但是,由于defaultParseRequestBodyOptions,此端点不允许我上传长名称文件。

不知何故,我想用一些与noLimitParseRequestBodyOptions 关联的Mem' 替换Mem,但我无法弄清楚如何做到这一点。如何使用 Network.Wai.Parse 中的此选项使用servant-multipart 端点?

表单中的Multipart类型由tag参数化,在Servant.Multipart模块中有两个实现值TmpMem。现在,MemMultipartBackend 的一个实例,它有一个关联类型MultipartBackendOptions。我猜我必须在这里修改一些东西来调整相关的ParseRequestBodyOptions

【问题讨论】:

  • 你不能把你的defaultParseRequestBodyOptions 改成没有文件名长度限制吗?像这样:defaultParseRequestBodyOptions {prboKeyLength=Nothing}

标签: haskell multipart type-level-computation servant


【解决方案1】:

您无需定义Mem 的替代项。鉴于目前编写servant-multipart 的方式,默认情况下您不必指定任何multipart 选项。但是,您可以使用 serveWithContext 和包含您的选项的合适的 Context 来指定它们。下面是一个完整的示例,它只是将最大文件名长度覆盖为 512。特别感兴趣的是 ctxt,它包含我们的自定义选项 multipartOpts

{-# LANGUAGE DataKinds, TypeOperators #-}
import Data.Proxy
import Network.Wai.Handler.Warp
import Network.Wai.Parse
import Servant
import Servant.Multipart

type API = MultipartForm Tmp (MultipartData Tmp) :> Post '[PlainText] String

api :: Proxy API
api = Proxy

server :: MultipartData Tmp -> Handler String
server multipartData = return str

  where str = "The form was submitted with "
           ++ show nInputs ++ " textual inputs and "
           ++ show nFiles  ++ " files."
        nInputs = length (inputs multipartData)
        nFiles  = length (files multipartData)

main :: IO ()
main = run 8080 (serveWithContext api ctxt server)

  where ctxt = multipartOpts :. EmptyContext
        multipartOpts = (defaultMultipartOptions (Proxy :: Proxy Tmp))
          { generalOptions = setMaxRequestKeyLength 512 defaultParseRequestBodyOptions
          }

编辑:如果您是 Nix 用户,您可以使用此代码将以下内容放在 haskell 文件的顶部,使其可执行,然后启动它,让 Nix 获取所有 deps 等。

#!/usr/bin/env nix-shell
#!nix-shell -i runhaskell -p "haskellPackages.ghcWithPackages (pkgs: with pkgs; [servant-server servant-multipart wai-extra warp ])"

【讨论】:

  • 这很好用,但我还是很好奇:除了文件名限制之外,是否可以实际定义与 Mem 几乎相同的 Mem'?
  • 不确定,因为这是非后端特定类型的选项。
猜你喜欢
  • 1970-01-01
  • 2012-07-23
  • 2019-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多