Re: тестирование http2 утилитой h2spec

Sergey Kandaurov pluknet на nginx.com
Пн Сен 30 17:20:52 UTC 2019


> On 28 Sep 2019, at 11:42, Илья Шипицин <chipitsine на gmail.com> wrote:
> 
> привет!
> 
> если проверять nginx-1.17.4 вот этой утилитой https://github.com/summerwind/h2spec
> то несколько десятков тестов фейлятся. можете прокомментировать ?
> 
> [ilia на localhost h2spec]$ ./h2spec -p 443 -h xxx.xxx.ru -t http2 
> Hypertext Transfer Protocol Version 2 (HTTP/2)
>   3. Starting HTTP/2
>     3.5. HTTP/2 Connection Preface
>       ✔ 1: Sends client connection preface
>       ✔ 2: Sends invalid connection preface
> 
>   4. HTTP Frames
>     4.1. Frame Format
>       ✔ 1: Sends a frame with unknown type
>       ✔ 2: Sends a frame with undefined flag
>       ✔ 3: Sends a frame with reserved field bit
> 
>     4.2. Frame Size
>       ✔ 1: Sends a DATA frame with 2^14 octets in length

Здесь тестируется что-то другое.

Тест не проверяет, что мы отправляем максимальный SETTINGS_MAX_FRAME_SIZE,
либо проверяет, но тогда описание не соответствует тому, что тестируется,
т.к. согласно данным объективного контроля DATA имеет длину 16777215 байт. 
Далее, если тест наступит на client_max_body_size (по умолчанию 1m)
и nginx вернёт HTTP 413, не дочитав собственно тело,
тест всё равно будет признан успешным, т.к. получен HEADERS.
Поэтому вопрос, что здесь тестируется.

>       × 2: Sends a large size DATA frame that exceeds the SETTINGS_MAX_FRAME_SIZE
>         -> The endpoint MUST send an error code of FRAME_SIZE_ERROR.
>            Expected: GOAWAY Frame (Error Code: FRAME_SIZE_ERROR)
>                      RST_STREAM Frame (Error Code: FRAME_SIZE_ERROR)
>                      Connection closed
>              Actual: WINDOW_UPDATE Frame (length:4, flags:0x00, stream_id:1)

Вопреки описанию, тест закрывает соединение по собственной инициативе
через две с небольшим секунды после отправки HEADERS.

>       ✔ 3: Sends a large size HEADERS frame that exceeds the SETTINGS_MAX_FRAME_SIZE

Здесь тестируется что-то другое, см. выше по SETTINGS_MAX_FRAME_SIZE.
Тест отправляет HEADERS длиной > SETTINGS_MAX_FRAME_SIZE по умолчанию
и проверяет получение GOAWAY, который приходит, но по другой причине
(и с другим кодом).  А именно - в следствие достижения собственного лимита
в nginx, который настраивается директивой http2_max_header_size.

Дальше не смотрел.

-- 
Sergey Kandaurov



Подробная информация о списке рассылки nginx-ru