这个 HTTP POST 请求有什么问题?

这个 HTTP POST 请求有什么问题?

我正在尝试使用 Sulley 模糊测试框架来模糊测试服务器。

我在 Wireshark 中观察到以下流。错误表明 JSON 解析存在问题,但是,当我使用 Google Chrome 的 Postman 扩展程序尝试相同的 HTTP POST 请求时,它会成功。

有人能解释一下这个 HTTP POST 请求可能出了什么问题吗? JSON 似乎有效。

POST /restconf/config HTTP/1.1
Host: 127.0.0.1:8080
Accept: */*
Content-Type: application/yang.data+json
{ "toaster:toaster" : { "toaster:toasterManufacturer" : "Geqq", "toaster:toasterModelNumber" : "asaxc", "toaster:toasterStatus" : "_." }}


HTTP/1.1 400 Bad Request
Server: Apache-Coyote/1.1
Content-Type: */*
Transfer-Encoding: chunked
Date: Sat, 07 Jun 2014 05:26:35 GMT
Connection: close

152
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<errors xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf">
    <error>
        <error-type>protocol</error-type>
        <error-tag>malformed-message</error-tag>
        <error-message>Error parsing input: Root element of Json has to be Object</error-message>
    </error>
</errors>

0

答案1

标题中缺少“Content-Length”属性,服务器认为它是强制性的,我想这不应该是强制性的?

在标题中添加“Content-Length”后,效果非常好。

答案2

根据您的消息,它应该是 POST 请求正文前的一行空白。您可以尝试添加一行吗?

事实上,服务器可能会看到这个没有主体的请求,但带有如下标头:

{ "toaster:toaster" : value

这可以解释这个错误。

答案3

可能是因为“Content-Type”标头。如果服务器配置为仅接受“application/json”,则可能会返回此错误代码。尽管根据RFC2616

这只是一个猜测,但您可以尝试将“Content-Type”标头更改为“application/json”。

答案4

看起来您可能在最后一个标头和请求的有效负载之间缺少 CRLF。

即你有

POST /restconf/config HTTP/1.1
Host: 127.0.0.1:8080
Accept: */*
Content-Type: application/yang.data+json
{ "toaster:toaster" : { "toaster:toasterManufacturer" : "Geqq", "toaster:toasterModelNumber" : "asaxc", "toaster:toasterStatus" : "_." }}

而且应该是

POST /restconf/config HTTP/1.1
Host: 127.0.0.1:8080
Accept: */*
Content-Type: application/yang.data+json

{ "toaster:toaster" : { "toaster:toasterManufacturer" : "Geqq", "toaster:toasterModelNumber" : "asaxc", "toaster:toasterStatus" : "_." }}

相关内容