![这个 HTTP POST 请求有什么问题?](https://linux22.com/image/634544/%E8%BF%99%E4%B8%AA%20HTTP%20POST%20%E8%AF%B7%E6%B1%82%E6%9C%89%E4%BB%80%E4%B9%88%E9%97%AE%E9%A2%98%EF%BC%9F.png)
我正在尝试使用 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" : "_." }}