鉴于此片段:
(defroutes main-routes
(POST "/input/:controller" request
(let [buff (ByteArrayOutputStream.)]
(copy (request :body) buff)
;; --- snip
如果请求中有Content-Type标头,则buff的值将是非空字节数组。该值可以是非本地的,标题只需要在那里。
但是,如果请求没有内容类型,我需要转储正文(hm ......出错),以便客户端可以追踪违规上传。 (上传软件不在我的控制之下,其维护者不会在标题中提供额外的内容。)
感谢您提供有关如何解决或解决此问题的任何想法!
编辑:
以下是我从客户端获得的标题:
{
"content-length" "159",
"accept" "*/*",
"host" (snip),
"user-agent" (snip)
}
另外,我发现Ring使用Java的ServletRequest实例,使用标准默认值x-www-form-urlencoded填充内容类型。我现在猜测通过HTTPParser #Input为身体提供的HTTPParser无法正确解析它。
答案 0 :(得分:1)
根据:
http://mmcgrana.github.com/ring/ring.middleware.content-type-api.html
默认内容类型为application/octet-stream
。除非您主动支持该内容类型,否则您不能只检查内容类型是否与该内容类型匹配,然后根据该内容类型转储所需内容?
答案 1 :(得分:1)
我面临同样的问题。它绝对是无法正确解析身体并转换:body
的中间件之一。主要问题是Content-Type
表明正文应该是可解析的。
使用ngrep
,我发现curl
如何混淆中间件。以下,虽然在命令行上直观(或相当性感)发送错误的Content-Type
,这会混淆中间件:
curl -nd "Unknown error" http://localhost:3000/event/error
T 127.0.0.1:44440 -> 127.0.0.1:3000 [AP]
POST /event/error HTTP/1.1.
Authorization: Basic SzM5Mjg6ODc2NXJkZmdoam5idmNkOQ==.
User-Agent: curl/7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3.
Host: localhost:3000.
Accept: */*.
Content-Length: 13.
Content-Type: application/x-www-form-urlencoded.
.
Unknown error
以下情况会强制Content-Type
不透明,中间件不会干扰:body
。
curl -nd "Unknown error" -H "Content-Type: application/data" http://localhost:3000/event/error
T 127.0.0.1:44441 -> 127.0.0.1:3000 [AP]
POST /event/error HTTP/1.1.
Authorization: Basic SzM5Mjg6ODc2NXJkZmdoam5idmNkOQ==.
User-Agent: curl/7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3.
Host: localhost:3000.
Accept: */*.
Content-Type: application/data.
Content-Length: 13.
.
Unknown error
我正在考虑用更自由的方式替换中间件,因为即使请求是错误的,我仍然希望能够自己决定如何处理身体。当请求没有意义时,零请求正文是一个非常奇怪的选择。我实际上认为更正确的行为是将它传递给错误处理程序,默认情况下会返回400 Bad Request
或406 Not Acceptable
。
有什么想法吗?就我而言,我可能会向Compojure提出补丁。