HTTP endpoints
Сервер запускает plaintext HTTP listener на httpPort (без TLS) и отдает server-info, resource manifest и resource file endpoints. Listener живет в src/network/CNetworkManager.cpp (HTTPServerThread); launcher забирает эти данные до подключения GTA, а in-game client получает тот же manifest уже по encrypted session.
Request handling
Роутинг идет только по path. HTTP method парсится, но не меняет поведение — любой поддерживаемый method на один и тот же path дает один и тот же ответ (отдельной обработки HEAD/OPTIONS или ответа 405 нет).
| Situation | Response |
|---|---|
| Malformed request line или заголовки больше лимита | 400 Bad Request |
| Advertised resource file найден | 200 OK (application/octet-stream) |
| Resource file не в advertised-list | 404 Not Found |
| Любой другой path | 200 OK с server-info JSON |
JSON- и file-ответы несут заголовок Access-Control-Allow-Origin: *.
Endpoints
| Path | Purpose |
|---|---|
/resources/manifest.json | Resource manifest с file hashes и resource config |
/resources/files/<resource>/<path> | Client-accessible resource file |
/assets/<resource>/<path> | Asset-pack file |
/stream/<resource>/<path> | Stream file для dlc/rpf resources |
любой другой path (/, /server-info.json, unknown) | Server-info JSON (fallback) |
Отдельного роута под /server-info.json нет: server-info — это fallback-ответ для любого path, который не совпал с manifest- или resource-file-роутами. Поэтому /, /server-info.json и неизвестные пути отдают один и тот же server-info JSON, а не 404.
server-info.json
Server-info JSON собирается inline в HTTPServerThread и содержит ровно эти поля:
| Field | Type | Value |
|---|---|---|
name | string | server display name |
players | number | admitted player count |
maxPlayers | number | player cap |
gamemode | string | gamemode name |
protocol | number | protocol version (11) |
build | number | client build version (10000) |
gtaBuild | number | supported GTA build (3788) |
channel | string | release channel/branch |
minClientBuild | number | minimum accepted client build |
useEarlyAuth | bool | early-auth enabled |
earlyAuthUrl | string | early-auth URL |
useCloudAuth | bool | cloud-auth enabled |
Здесь нет serverId, identityMode, host/port, connection/queue counts, password state, tags, language, tick rate или streaming distance — доступны только перечисленные выше поля.
resources/manifest.json
Manifest собирается в CResourceManager::BuildManifestJson и отдается как строка. Пустой manifest возвращается как {"schema":1,"files":[],"totalFiles":0,"totalBytes":0,"resources":[]}.
Top-level поля:
schema— версия схемы (1)files— плоский список client-accessible файловtotalFiles,totalBytes— счетчики по всем файламresources— список resources с конфигом
Каждый элемент files[]: resource, path, url, size, stream (bool), sha256 и опциональный enc (encryption marker для encrypted-at-rest файлов).
Каждый элемент resources[]: name, type, clientType, assetsBase, streamBase, опциональный clientMain, а также массивы exports, dependencies, clientFiles, dataFiles ({path, type}) и объект config.
Manifest не содержит engine version, protocol, server name или gamemode — эти значения живут в server-info JSON, а не в manifest.
Source backing
Страница основана на src/network/CNetworkManager.cpp (HTTP listener и server-info JSON) и server/src/CResourceManager.cpp (BuildManifestJson).