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部分分隔符正确吗?只是为了确保它与其他任何事情无关。。您是否可以至少发布作为请求一部分发送的标题?