pebblisp/src/web.c

122 lines
3.3 KiB
C
Raw Normal View History

/* Feel free to use this example code in any way
you see fit (Public Domain) */
#include <sys/types.h>
//#ifndef _WIN32
#include <sys/select.h>
#include <sys/socket.h>
//#else
//#include <winsock2.h>
//#endif
#include <string.h>
#include <microhttpd.h>
#include <stdio.h>
#include "web.h"
#include "pebblisp.h"
2022-03-17 16:59:08 -04:00
struct StructDef query = {
.fieldCount = 1,
.name = "",
.names = {""}
};
int routeCount = 0;
struct Route routes[10];
int addRoute(struct Route route) {
routes[routeCount] = route;
routeCount += 1;
return 0;
}
int methodMatches(const char* method, struct Route* route)
{
switch (route->type) {
case GET:
return method[0] == 'G' || method[0] == 'g';
case POST:
return method[0] == 'P' || method[0] == 'p';
default:
return 0;
}
}
2022-03-17 16:59:08 -04:00
static int
print_out_key (void *queryParamsV, enum MHD_ValueKind kind, const char *key,
const char *value)
{
(void) kind; /* Unused. Silent compiler warning. */
Object* queryParams = queryParamsV;
Object pair = startList(stringFromSlice(key, strlen(key)));
nf_addToList(&pair, parseEval(value, NULL));
nf_addToList(queryParams, pair);
return MHD_YES;
}
//static enum MHD_Result
static int
answer_to_connection(void *cls, struct MHD_Connection *connection,
const char *url, const char *method,
const char *version, const char *upload_data,
size_t *upload_data_size, void **con_cls)
{
const char *page = NULL;
printf("%s URL: '%s' :: ", method, url);
2022-03-17 16:59:08 -04:00
printf("version: %s\n", version);
printf("upload_data: %s\n", upload_data);
for (int i = 0; i < routeCount; i++) {
if (methodMatches(method, &routes[i]) && strcmp(url, routes[i].path) == 0) {
2022-03-17 16:59:08 -04:00
Object queryParams = listObject();
MHD_get_connection_values(connection, MHD_GET_ARGUMENT_KIND, print_out_key, &queryParams);
//page = routes[i].routeAction(url);
2022-03-17 16:59:08 -04:00
Object lambdaList = listObject();
nf_addToList(&lambdaList, queryParams);
Object route = cloneObject(routes[i].routeAction);
2022-03-17 16:59:08 -04:00
Object result = listEvalLambda(&route, &lambdaList, routes[i].env);
page = result.string;
break;
}
}
if (!page) {
printf("no route found!\n");
page = "<html><body><h1>404, Dumbass.</h1></body></html>";
}
struct MHD_Response *response;
2022-03-17 16:59:08 -04:00
//enum MHD_Result ret;
int ret;
(void) cls; /* Unused. Silent compiler warning. */
(void) url; /* Unused. Silent compiler warning. */
(void) method; /* Unused. Silent compiler warning. */
(void) version; /* Unused. Silent compiler warning. */
(void) upload_data; /* Unused. Silent compiler warning. */
(void) upload_data_size; /* Unused. Silent compiler warning. */
(void) con_cls; /* Unused. Silent compiler warning. */
response =
MHD_create_response_from_buffer(strlen(page), (void *) page,
MHD_RESPMEM_PERSISTENT);
ret = MHD_queue_response(connection, MHD_HTTP_OK, response);
MHD_destroy_response(response);
return ret;
}
int start(int port)
{
struct MHD_Daemon *daemon = MHD_start_daemon(
MHD_USE_AUTO | MHD_USE_INTERNAL_POLLING_THREAD,
port, NULL, NULL, &answer_to_connection, NULL, MHD_OPTION_END);
if (NULL == daemon)
return 1;
// (void) getchar();
// MHD_stop_daemon(daemon);
return 0;
}