Servlets Compojure:从缺少内容类型标头的POST请求获取正文
鉴于此片段:Servlets Compojure:从缺少内容类型标头的POST请求获取正文,servlets,clojure,httprequest,compojure,Servlets,Clojure,Httprequest,Compojure,鉴于此片段: (defroutes main-routes (POST "/input/:controller" request (let [buff (ByteArrayOutputStream.)] (copy (request :body) buff) ;; --- snip 如果请求中有Content-Type头,buff的值将是一个非空字节数组。该值可以是非分节的,标题必须在那里 但是,如果请求没有内容类型,我
(defroutes main-routes
(POST "/input/:controller" request
(let [buff (ByteArrayOutputStream.)]
(copy (request :body) buff)
;; --- snip
如果请求中有Content-Type头,buff的值将是一个非空字节数组。该值可以是非分节的,标题必须在那里
但是,如果请求没有内容类型,我需要转储正文(嗯……结果是错误的),以便客户端可以跟踪违规上传。(上传软件不在我的控制之下,其维护人员不会在标题中提供任何额外内容。)
感谢您提供有关如何解决或解决此问题的任何想法
编辑:
以下是我从客户端获得的标题:
{
"content-length" "159",
"accept" "*/*",
"host" (snip),
"user-agent" (snip)
}
另外,我发现使用Java的ServletRequest实例的Ring使用标准默认值x-www-form-urlencoded填充内容类型。我现在猜测,通过HTTPParser#Input提供主体的HTTPParser无法正确解析它 根据:
默认内容类型为
应用程序/octet流
。除非您积极支持该内容类型,否则您就不能检查该内容类型是否与该内容类型匹配,然后在此基础上转储所需内容吗?我面临同样的问题。它肯定是中间件之一,无法正确解析主体并转换:主体
。主要问题是内容类型
建议正文应该是可解析的
使用ngrep
,我发现curl
是如何混淆中间件的。下面的命令行虽然直观(或者更性感),但发送了错误的内容类型
,这会混淆中间件:
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
但是,以下操作会强制内容类型
不透明,并且中间件不会干扰:主体
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错误请求
或406不可接受
有什么想法吗?在我的情况下,我可能会向Compojure建议一个补丁。您的要求是什么。。?不清楚,请详细说明。内容类型中间件将内容类型添加到响应中,但我的问题是请求。如果请求没有内容类型,则请求映射中:body下的值为空输入流。Ok。您确定内容长度和/或正确的mime部分分隔符正确吗?只是为了确保它与其他任何事情无关。。您是否可以至少发布作为请求一部分发送的标题?