2.1 KiB
2.1 KiB
- Все запросы могут обрабатываться одним процессом CGI-программы
- Веб-сервер взаимодействует с процессом через UNIX Domain Sockets или TCP/IP (а не через stdin и stdout)
- Для общения используется бинарный протокол, обеспечивающий передачу любых текстовых данных
FastCGI на Java
Пример
public static void main(String[] args) {
FCGIInterface fcgiInterface = new FCGiInterface();
while (fcgiInterface.FCGIAccept() >= 0) {
String content = """
<html>...</html>
""";
String response = """
HTTP /1.1 200 OK
Content-Type: text/html
Content-Length: %d
%s
""".formatted(content.getBytes(StandardCharsets.UTF_8).length, content);
}
}
FCGIInterface- реализует магию по перенаправлениюSystem.in,System.outиSystem.errв потоки TCP сокета. Поля для запросов и сокета - статическиеFCGIInterface.request.params- объектProperties, через который можно узнать список параметров, переданных веб-сервером- Наиболее значимые параметры:
REQUEST_METHOD- Get, Post и тдQUERY_STRING- параметры запроса после?CONTENT_TYPE- значение заголовка запросаCONTENT_LENGTH- значение заголовка запроса Еще пример
private static String readRequestBody() throws IOException {
FCGIInterface.request.inStream.fill();
var contentLength = FCGIInterface.request.inStream.available();
var buffer = ByteBuffer.allocate(contentLength);
var readBytes = FCGIInterface.request.inStream.read(buffer.array(), 0, contentLength);
var requestBodyRaw = new byte[readBytes];
buffer.get(requestBodyRaw);
buffer.clear();
return new String(requestBodyRaw, StandardCharsets.UTF_8);
}