web add lectures for 1 milestone
deploy / Pull and Restart (push) Successful in 18s

This commit is contained in:
roma-dxunvrs
2026-10-30 19:01:08 +03:00
parent 283660b9ef
commit 2ec4a7e7db
4 changed files with 281 additions and 2 deletions
@@ -1,3 +1,47 @@
- Все запросы могут обрабатываться одним процессом CGI-программы
- Веб-сервер взаимодействует с процессом через UNIX Domain Sockets или TCP/IP (а не через stdin и stdout)
- Для общения используется бинарный протокол, обеспечивающий передачу любых текстовых данных
## FastCGI на Java
Пример
```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` - значение заголовка запроса
Еще пример
```Java
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);
}
```