Назад | Перейти на главную страницу

Что не так с этим HTTP-запросом POST?

Я пытаюсь провести фаззинг сервера с помощью фаззинга Салли.

Наблюдаю следующий поток в Wireshark. Ошибка говорит о проблеме с синтаксическим анализом JSON, однако, когда я пытаюсь выполнить тот же HTTP-запрос POST с использованием расширения Google Chrome Postman, это удается.

Может ли кто-нибудь объяснить, что может быть не так с этим запросом 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

В заголовке отсутствовало свойство Content-Length, и сервер считал его обязательным, что, я полагаю, не должно быть обязательным?

После добавления «Content-Length» в заголовок работает как шарм.

Исходя из вашего сообщения, перед телом запроса POST должна быть пустая строка. Можете попробовать добавить?

Как есть, возможно, сервер видит этот запрос без тела и заголовка, например:

{ "toaster:toaster" : value

что объяснило бы ошибку.

Похоже, вам может не хватать 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" : "_." }}

Может это из-за заголовка Content-Type. Если сервер настроен на прием только «application / json», он может вернуть этот код ошибки. Хотя он должен возвращать "415 Unsupported Media Type" согласно RFC2616.

Это всего лишь предположение, но вы можете попробовать изменить заголовок «Content-Type» на «application / json».