解析多形式 MIME 类型的内容处置字段

Parse a Multi Form Mime Type's Content Disposition Fields

我正在用 C++ 为 IIS7/8 编写本机模块,其目的是拒绝上传到 IIS 的具有特定扩展名的文件。

我已经使用 OnReadEntity 使模块正常工作,并且可以在上传文件的 post 请求中看到请求 body。

但是,由于对 C++ 经验不足,我不知道如何从请求 body 中可靠地解析出 Content-Disposition 字段,以便我可以获得所有文件名。

下面是一个请求示例:

------WebKitFormBoundaryUomVPwKHGvBwvDhP
Content-Disposition: form-data; name="attach1"; filename="YSMIsapiFilter.sln"
Content-Type: text/plain

SomeDataHere

------WebKitFormBoundaryUomVPwKHGvBwvDhP
Content-Disposition: form-data; name="attach2"; filename="ysmISAPIFilter.log"
Content-Type: application/octet-stream

I AM A LOG
------WebKitFormBoundaryUomVPwKHGvBwvDhP
Content-Disposition: form-data; name="enter_a_number"


------WebKitFormBoundaryUomVPwKHGvBwvDhP--
ol: max-age=0
Connection: keep-alive
Accept:     text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8
Cookie: ASPSESSIONIDSSSRCTRS=GHMFFGABJAAOAEHFCFIOOJIO
Host: localhost:8080
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like                         Gecko) Chrome/49.0.2623.110 Safari/537.36
Upgrade-Insecure-Requests: 1

有谁知道 httpserv.h API 中是否有可以为我做这件事的东西。或者,如果有一个免费的 non-commercial mime 类型解析器可以执行此操作,它是在 Visual Studio 2015 中构建的。

还是需要我自己解析。

据我所知,Content-Disposition 和 content-type 应该始终是以 ------ 开头的行之后的第 2 行和第 3 行,webkitformBoundary 在等待客户端制作时有所不同post(IE、Chrome、FireFox 等)。那么我只需要跳到下一个 ------ 如果有的话。

Content-Disposition 通过 RFC 规范声明它将始终是 form-data;后跟表单字段的名称 "attach1",然后是输入 "filename" 的任何数据(如果是 "file".

类型的输入)

只是在这个问题上寻找正确方向的点。

我已经尝试过使用 Mimetic,但是当我将它 header 添加到我的项目时我无法构建它。它自带的Win32项目可以构建,但是在我的里面不会构建。

我能够通过将 CLR 与 C++ 混合并使我的 Native Http 模块成为混合模式 DLL 来解决这个问题。所以它是一个使用.Net CLR的原生DLL。

然后使用模块前提条件,如果加载了 .Net CLR 且位数为 32,我将模块设置为仅 运行。

在启用 .Net 的情况下,我能够添加对 System.Net.Http.Formatting 的引用,它具有内置的 MimeType 解析器库。

使用它我能够轻松地解析在我的本地 Http 模块中开始请求中的 Post 请求中的 Mime 类型,让我可以访问文件上传的 fileName 字段,然后我使用它如果文件名是被阻止的扩展名,则拒绝请求并抛出自定义 500 内部服务器错误。

我发现的一个警告是,有时实体主体请求没有以换行符结尾,这会破坏 .Net Mime 解析库,从而导致错误。因此,我在读取请求实体主体后检查缓冲区以确定最后一个字符是否是换行符,如果不是,我在使用原始缓冲区填充它以供使用后,通过将它附加到我的 .Net 内存流来添加一个到缓冲区在 .Net Mime 类型解析器中。