Kong: клиент закрывает keep-alive соединения - PullRequest
3 голосов
/ 24 июня 2019

Я пишу пользовательский плагин для kong. Плагин преобразует запрос / ответ в соответствии с моим сервером. Я получаю [info] 27#0: *588 client <x> closed keepalive connection.

После некоторой отладки я обнаружил, что ошибка возникает всякий раз, когда я устанавливаю ngx.arg[1] с моим преобразованным ответом. Я подписался на существующий плагин response-transformer, предоставленный kong.

Это тело функции kong body_filter:

local ctx = ngx.ctx
  local chunk, eof = ngx.arg[1], ngx.arg[2]

  ctx.rt_body_chunks = ctx.rt_body_chunks or {}
  ctx.rt_body_chunk_number = ctx.rt_body_chunk_number or 1

  if eof then
    local someChunks = concat(ctx.rt_body_chunks)
    local aBody = responseTransformer.transform(theConf, someChunks)
    aBody = unEscapeString(aBody)
    ngx.arg[1] = aBody or someChunks
  else
    ctx.rt_body_chunks[ctx.rt_body_chunk_number] = chunk
    ctx.rt_body_chunk_number = ctx.rt_body_chunk_number + 1
    ngx.arg[1] = nil
  end

Я запустил тот же плагин с локальным фиктивным сервером. Это сработало правильно. Но когда я проксировал свой сервер, я получил ошибку closed keepalive connection.

Из журналов Конга я вижу, что ответ был преобразован правильно.

Используя curl, я получаю примерно половину тела ответа.

1 Ответ

0 голосов
/ 24 июня 2019

Нашел причину. Сервер отправлял заголовок Content-Length. При переписывании тела это осталось без изменений. Итак, соединение было закрыто до того, как был доставлен весь контент.

Чтобы решить эту проблему, мне пришлось очистить заголовок Content-Length в функции header_filter:

kong.response.clear_header("Content-Length")

...