Синхронный режим передачи по ICAP

Асинхронный режим передачи по ICAP, в при котором после успешного приема файла в обработку сервер сразу отвечает ICAP 204 No content, с версии 2.1. дополнен:

  • вариант ответа ICAP 200 OKрекомендованный метод: снимается требование к клиенту об обязательной передаче ICAP-заголовка Allow: 204.

  • синхронный режим работы – после успешной передачи файла в обработку, сервер ожидает вердикта по полученному файлу. Максимальное время ожидания ответа по умолчанию - 1 час.

После получения вердикта сервер отвечает клиенту

  • для вердиктов Clean и Unknown - кодами 204 No content или 200 OK (содержащим исходный http request/response)

  • для вердиктов Dangerous и Malicious - 200 OK, содержащим html-заглушку:

"<html><body><h1>Access Denied</h1><p>Malicious content detected.</p></body></html>"

К ответу добавляются заголовки ICAP:

  • X-Response-Info - содержит вердикт

  • X-Response-Desc - содержит подробности, относящиеся к вердикту - пустую строку

Примеры ответов:

Blocking response

ICAP/1.0 200 OK
Connection: close
Date: Mon, 27 Apr 2026 15:54:04 GMT
Encapsulated: res-hdr=0, res-body=73
Istag: v210-
Service: Multicheck ICAP collector v2.1.0
X-Response-Desc:
X-Response-Info: Dangerous
HTTP/1.1 403 Forbidden
X-Response-Desc:
X-Response-Info: Dangerous
52
++<++html++><++body++><++h1++>++Access Denied++<++/h1++><++p++>++Malicious content detected.++<++/p++><++/body++><++/html++>++
0

204 No Content response

ICAP/1.0 204 No Modifications
Connection: close
Encapsulated: null-body=0
Istag: v210-
Service: Multicheck ICAP collector v2.1.0
X-Response-Desc:
X-Response-Info: Clean

Поддержка ответов 200 OK

По стандарту ICAP отвечать статусом 204 можно только если клиент прислал заголовок Allow: 204

Некоторые клиенты, (например, squid), не принимает ответы 204 для контента >64кб.

Для подобных клиентов добавлена поддержка ответов 200 OK. Т.к. по стандарту в таком ответе надо вернуть клиенту оригинальный запрос целиком, приходится его сохранять. В зависимости от размера содержимого (если его удается определить) тело запроса сохраняется в storage (>=MaxMemContentSize) или в памяти. Место сохранения определяется константой `MaxMemContentSize`, равная 256кб. Сразу после ответа теза запросу удаляется.