Add POST method.

Rename `addroute` to `get`.
This commit is contained in:
Sage Vaillancourt 2022-03-15 23:22:28 -04:00
parent 4decbbbe5c
commit 7faf2ebbb3
6 changed files with 41 additions and 13 deletions

View File

@ -278,7 +278,8 @@ struct Environment defaultEnv()
//{"sys", &systemCall},
{"loadfile", &loadFile},
{"inp", &takeInput},
{"addroute", &addRouteO},
{"get", &addGetRoute},
{"post", &addPostRoute},
{"serve", &startServer}
#endif
};

View File

@ -1,6 +1,6 @@
#!/usr/bin/pl
(struct post
(struct Post
(title body))
;(def element (fn (type) (fn (text) (cat "<" type ">" text "</" type ">"))))
@ -22,8 +22,8 @@
(h2 po's title)
(p po's body))))
(def p1 (post "Hey" "This is a post"))
(def p2 (post "This"
(def p1 (Post "Hey" "This is a post"))
(def p2 (Post "This"
"Is ALSO a post. And frankly, what a great post! It's so long and flowing,
and the interpreter won't even instantly crash over it! It's truly astounding
stuff, when you think about it."
@ -36,9 +36,9 @@ stuff, when you think about it."
(htmlize p1)
(htmlize p2)))))) )
(addroute "/" homepage)
(get "/" homepage)
(addroute "/styles.css" (fn () (
(get "/styles.css" (fn () (
"html {
background-color: #ddddff;
}

View File

@ -664,21 +664,30 @@ Object print(Object p, Object ignore, struct Environment* env)
return numberObject(0);
}
Object addRouteO(Object path, Object textFunc, struct Environment* env)
void addRouteO(Object path, Object textFunc, struct Environment* env, enum RouteType type)
{
char* p = malloc(sizeof(char) * strlen(path.string) + 1);
strcpy(p, path.string);
//const char* t = malloc(sizeof(char) * strlen(textFunc.string) + 1);
//strcpy(t, textFunc.string);
struct Route r;
r.path = p;
r.routeAction = cloneObject(textFunc);
r.env = env;
r.type = type;
env->refs += 1;
//r.text = t;
addRoute(r);
}
Object addGetRoute(Object path, Object textFunc, struct Environment* env)
{
addRouteO(path, textFunc, env, GET);
return numberObject(1);
}
Object addPostRoute(Object path, Object textFunc, struct Environment* env)
{
addRouteO(path, textFunc, env, POST);
return numberObject(1);
}

View File

@ -105,7 +105,8 @@ Object systemCall(Object call, Object _, struct Environment* i3);
Object loadFile(Object filename, Object _, struct Environment* env);
Object startServer(Object path, Object textFunc, struct Environment* env);
Object addRouteO(Object path, Object textFunc, struct Environment* env);
Object addGetRoute(Object path, Object textFunc, struct Environment* env);
Object addPostRoute(Object path, Object textFunc, struct Environment* env);
#endif

View File

@ -24,6 +24,18 @@ int addRoute(struct Route route) {
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;
}
}
static enum MHD_Result
answer_to_connection(void *cls, struct MHD_Connection *connection,
const char *url, const char *method,
@ -33,8 +45,8 @@ answer_to_connection(void *cls, struct MHD_Connection *connection,
const char *page = NULL;
printf("%s URL: '%s' :: ", method, url);
for (int i = 0; i < routeCount; i++) {
if (strcmp(url, routes[i].path) == 0) {
printf("route[%d]\n", i);
if (methodMatches(method, &routes[i]) && strcmp(url, routes[i].path) == 0) {
//page = routes[i].routeAction(url);
Object emptyList = listObject();
nf_addToList(&emptyList, numberObject(0));

View File

@ -1,10 +1,15 @@
#include "object.h"
enum RouteType {
GET,
POST,
};
struct Route {
const char* path;
Object routeAction;
struct Environment* env;
//const char* text;
enum RouteType type;
};
int addRoute(struct Route route);