Finally getting into Matrix territory
This commit is contained in:
parent
8ec6d6afb3
commit
4cd24a6e97
3 changed files with 122 additions and 9 deletions
103
src/HttpServer.c
103
src/HttpServer.c
|
@ -109,17 +109,120 @@ HttpServerContextCreate(HttpRequestMethod requestMethod,
|
||||||
static void
|
static void
|
||||||
HttpServerContextFree(HttpServerContext * c)
|
HttpServerContextFree(HttpServerContext * c)
|
||||||
{
|
{
|
||||||
|
char *key;
|
||||||
|
void *val;
|
||||||
|
|
||||||
if (!c)
|
if (!c)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
while (HashMapIterate(c->requestHeaders, &key, &val))
|
||||||
|
{
|
||||||
|
free(key);
|
||||||
|
free(val);
|
||||||
|
}
|
||||||
HashMapFree(c->requestHeaders);
|
HashMapFree(c->requestHeaders);
|
||||||
|
|
||||||
|
/* It is up to the handler to free its values */
|
||||||
HashMapFree(c->responseHeaders);
|
HashMapFree(c->responseHeaders);
|
||||||
|
|
||||||
free(c->requestPath);
|
free(c->requestPath);
|
||||||
fclose(c->stream);
|
fclose(c->stream);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
HashMap *
|
||||||
|
HttpRequestHeaders(HttpServerContext * c)
|
||||||
|
{
|
||||||
|
if (!c)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return c->requestHeaders;
|
||||||
|
}
|
||||||
|
|
||||||
|
HttpRequestMethod
|
||||||
|
HttpRequestMethodGet(HttpServerContext * c)
|
||||||
|
{
|
||||||
|
if (!c)
|
||||||
|
{
|
||||||
|
return HTTP_METHOD_UNKNOWN;
|
||||||
|
}
|
||||||
|
|
||||||
|
return c->requestMethod;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *
|
||||||
|
HttpRequestPath(HttpServerContext * c)
|
||||||
|
{
|
||||||
|
if (!c)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return c->requestPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
HashMap *
|
||||||
|
HttpRequestParams(HttpServerContext * c)
|
||||||
|
{
|
||||||
|
/* TODO: Implement param parsing */
|
||||||
|
(void) c;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *
|
||||||
|
HttpResponseHeader(HttpServerContext * c, char *key, char *val)
|
||||||
|
{
|
||||||
|
if (!c)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return HashMapSet(c->responseHeaders, key, val);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
HttpResponseStatus(HttpServerContext * c, HttpStatus status)
|
||||||
|
{
|
||||||
|
if (!c)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
c->responseStatus = status;
|
||||||
|
}
|
||||||
|
|
||||||
|
FILE *
|
||||||
|
HttpStream(HttpServerContext * c)
|
||||||
|
{
|
||||||
|
if (!c)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return c->stream;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
HttpSendHeaders(HttpServerContext * c)
|
||||||
|
{
|
||||||
|
FILE *fp = c->stream;
|
||||||
|
|
||||||
|
char *key;
|
||||||
|
char *val;
|
||||||
|
|
||||||
|
fprintf(fp, "HTTP/1.0 %d %s\n", c->responseStatus, HttpStatusToString(c->responseStatus));
|
||||||
|
|
||||||
|
while (HashMapIterate(c->responseHeaders, &key, (void **) &val))
|
||||||
|
{
|
||||||
|
fprintf(fp, "%s: %s\n", key, val);
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(fp, "\n");
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
QueueConnection(HttpServer * server, int fd)
|
QueueConnection(HttpServer * server, int fd)
|
||||||
{
|
{
|
||||||
|
|
|
@ -38,15 +38,10 @@
|
||||||
#include <HashMap.h>
|
#include <HashMap.h>
|
||||||
#include <Config.h>
|
#include <Config.h>
|
||||||
#include <HttpServer.h>
|
#include <HttpServer.h>
|
||||||
|
#include <Matrix.h>
|
||||||
|
|
||||||
HttpServer *httpServer = NULL;
|
HttpServer *httpServer = NULL;
|
||||||
|
|
||||||
static void
|
|
||||||
TelodendriaHttpHandler(HttpServerContext *, void *args)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
TelodendriaSignalHandler(int signalNo)
|
TelodendriaSignalHandler(int signalNo)
|
||||||
{
|
{
|
||||||
|
@ -117,6 +112,8 @@ main(int argc, char **argv)
|
||||||
/* Signal handling */
|
/* Signal handling */
|
||||||
struct sigaction sigAction;
|
struct sigaction sigAction;
|
||||||
|
|
||||||
|
MatrixHttpHandlerArgs *matrixArgs;
|
||||||
|
|
||||||
lc = LogConfigCreate();
|
lc = LogConfigCreate();
|
||||||
|
|
||||||
if (!lc)
|
if (!lc)
|
||||||
|
@ -296,9 +293,19 @@ main(int argc, char **argv)
|
||||||
Log(lc, LOG_DEBUG, "Found user/group information using getpwnam() and getgrnam().");
|
Log(lc, LOG_DEBUG, "Found user/group information using getpwnam() and getgrnam().");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
matrixArgs = malloc(sizeof(MatrixHttpHandlerArgs));
|
||||||
|
if (!matrixArgs)
|
||||||
|
{
|
||||||
|
Log(lc, LOG_ERROR, "Unable to allocate memory for HTTP handler arguments.");
|
||||||
|
exit = EXIT_FAILURE;
|
||||||
|
goto finish;
|
||||||
|
}
|
||||||
|
|
||||||
|
matrixArgs->lc = lc;
|
||||||
|
|
||||||
/* Bind the socket before possibly dropping permissions */
|
/* Bind the socket before possibly dropping permissions */
|
||||||
httpServer = HttpServerCreate(tConfig->listenPort, tConfig->threads, tConfig->maxConnections,
|
httpServer = HttpServerCreate(tConfig->listenPort, tConfig->threads, tConfig->maxConnections,
|
||||||
TelodendriaHttpHandler, NULL);
|
MatrixHttpHandler, matrixArgs);
|
||||||
if (!httpServer)
|
if (!httpServer)
|
||||||
{
|
{
|
||||||
Log(lc, LOG_ERROR, "Unable to create HTTP server on port %d: %s",
|
Log(lc, LOG_ERROR, "Unable to create HTTP server on port %d: %s",
|
||||||
|
|
|
@ -59,8 +59,11 @@ extern HttpRequestMethod
|
||||||
extern char *
|
extern char *
|
||||||
HttpRequestPath(HttpServerContext *);
|
HttpRequestPath(HttpServerContext *);
|
||||||
|
|
||||||
extern void
|
extern HashMap *
|
||||||
HttpResponseHeader(HttpServerContext *, const char *, const char *);
|
HttpRequestParams(HttpServerContext *);
|
||||||
|
|
||||||
|
extern char *
|
||||||
|
HttpResponseHeader(HttpServerContext *, char *, char *);
|
||||||
|
|
||||||
extern void
|
extern void
|
||||||
HttpResponseStatus(HttpServerContext *, HttpStatus);
|
HttpResponseStatus(HttpServerContext *, HttpStatus);
|
||||||
|
|
Loading…
Reference in a new issue