Added built-in http server

this allows you to get a list of available maps on the server, get the status and download pk3s

pk3 download must get the sv_allowDownload and the download url configured

downloading works when talking to the /pk3 endpoint like this: curl http://localhost:8080/pk3/baseq3/my.pk3
This commit is contained in:
Martin Gerhardy 2022-04-22 20:36:36 +02:00
parent 6d74896557
commit 6e4e8622ea
5 changed files with 1211 additions and 2 deletions

View file

@ -199,6 +199,10 @@ ifndef USE_VOIP
USE_VOIP=1 USE_VOIP=1
endif endif
ifndef USE_HTTP_SERVER
USE_HTTP_SERVER=0
endif
ifndef USE_FREETYPE ifndef USE_FREETYPE
USE_FREETYPE=0 USE_FREETYPE=0
endif endif
@ -1114,6 +1118,10 @@ ifeq ($(USE_CURL),1)
endif endif
endif endif
ifeq ($(USE_HTTP_SERVER),1)
SERVER_CFLAGS += -DUSE_HTTP_SERVER
endif
ifeq ($(USE_VOIP),1) ifeq ($(USE_VOIP),1)
CLIENT_CFLAGS += -DUSE_VOIP CLIENT_CFLAGS += -DUSE_VOIP
SERVER_CFLAGS += -DUSE_VOIP SERVER_CFLAGS += -DUSE_VOIP
@ -2300,6 +2308,7 @@ Q3DOBJ = \
$(B)/ded/sv_client.o \ $(B)/ded/sv_client.o \
$(B)/ded/sv_ccmds.o \ $(B)/ded/sv_ccmds.o \
$(B)/ded/sv_game.o \ $(B)/ded/sv_game.o \
$(B)/ded/sv_http.o \
$(B)/ded/sv_init.o \ $(B)/ded/sv_init.o \
$(B)/ded/sv_main.o \ $(B)/ded/sv_main.o \
$(B)/ded/sv_net_chan.o \ $(B)/ded/sv_net_chan.o \

View file

@ -269,7 +269,7 @@ static struct addrinfo *SearchAddrInfo(struct addrinfo *hints, sa_family_t famil
Sys_StringToSockaddr Sys_StringToSockaddr
============= =============
*/ */
static qboolean Sys_StringToSockaddr(const char *s, struct sockaddr *sadr, int sadr_len, sa_family_t family) qboolean Sys_StringToSockaddr(const char *s, struct sockaddr *sadr, int sadr_len, sa_family_t family)
{ {
struct addrinfo hints; struct addrinfo hints;
struct addrinfo *res = NULL; struct addrinfo *res = NULL;

1169
code/server/sv_http.c Normal file

File diff suppressed because it is too large Load diff

View file

@ -22,6 +22,13 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#include "server.h" #include "server.h"
#ifdef USE_HTTP_SERVER
extern cvar_t *sv_httpServerPort;
extern cvar_t *sv_httpServerIP;
extern cvar_t *sv_httpServerBearer;
extern qboolean SV_HTTPServerInit(void);
extern void SV_HTTPServerShutdown(void);
#endif
/* /*
=============== ===============
@ -655,6 +662,11 @@ void SV_Init (void)
sv_voip = Cvar_Get("sv_voip", "1", CVAR_LATCH); sv_voip = Cvar_Get("sv_voip", "1", CVAR_LATCH);
Cvar_CheckRange(sv_voip, 0, 1, qtrue); Cvar_CheckRange(sv_voip, 0, 1, qtrue);
sv_voipProtocol = Cvar_Get("sv_voipProtocol", sv_voip->integer ? "opus" : "", CVAR_SYSTEMINFO | CVAR_ROM ); sv_voipProtocol = Cvar_Get("sv_voipProtocol", sv_voip->integer ? "opus" : "", CVAR_SYSTEMINFO | CVAR_ROM );
#endif
#ifdef USE_HTTP_SERVER
sv_httpServerPort = Cvar_Get("sv_httpServerPort", "8080", CVAR_SYSTEMINFO | CVAR_INIT | CVAR_ARCHIVE);
sv_httpServerIP = Cvar_Get("sv_httpServerIP", "0.0.0.0", CVAR_INIT | CVAR_ARCHIVE);
sv_httpServerBearer = Cvar_Get("sv_httpServerBearer", "", CVAR_ARCHIVE);
#endif #endif
Cvar_Get ("sv_paks", "", CVAR_SYSTEMINFO | CVAR_ROM ); Cvar_Get ("sv_paks", "", CVAR_SYSTEMINFO | CVAR_ROM );
Cvar_Get ("sv_pakNames", "", CVAR_SYSTEMINFO | CVAR_ROM ); Cvar_Get ("sv_pakNames", "", CVAR_SYSTEMINFO | CVAR_ROM );
@ -693,9 +705,15 @@ void SV_Init (void)
// init the botlib here because we need the pre-compiler in the UI // init the botlib here because we need the pre-compiler in the UI
SV_BotInitBotLib(); SV_BotInitBotLib();
// Load saved bans // Load saved bans
Cbuf_AddText("rehashbans\n"); Cbuf_AddText("rehashbans\n");
#ifdef USE_HTTP_SERVER
if (!SV_HTTPServerInit()) {
Com_Printf("Failed to init http server\n");
}
#endif
} }
@ -779,5 +797,9 @@ void SV_Shutdown( char *finalmsg ) {
// disconnect any local clients // disconnect any local clients
if( sv_killserver->integer != 2 ) if( sv_killserver->integer != 2 )
CL_Disconnect( qfalse ); CL_Disconnect( qfalse );
#ifdef USE_HTTP_SERVER
SV_HTTPServerShutdown();
#endif
} }

View file

@ -27,6 +27,10 @@ cvar_t *sv_voip;
cvar_t *sv_voipProtocol; cvar_t *sv_voipProtocol;
#endif #endif
#ifdef USE_HTTP_SERVER
extern void HTTP_Frame(void);
#endif
serverStatic_t svs; // persistant server info serverStatic_t svs; // persistant server info
server_t sv; // local server server_t sv; // local server
vm_t *gvm = NULL; // game virtual machine vm_t *gvm = NULL; // game virtual machine
@ -1068,6 +1072,11 @@ void SV_Frame( int msec ) {
return; return;
} }
#ifdef USE_HTTP_SERVER
// a map must be running in dedicated server mode
HTTP_Frame();
#endif
// allow pause if only the local client is connected // allow pause if only the local client is connected
if ( SV_CheckPaused() ) { if ( SV_CheckPaused() ) {
return; return;