Fix web struct handling.
Typedef to handle different versions of libmicrohttpd. Add getStructIndex(). Fix small print() mem leak.
This commit is contained in:
parent
b4584fa377
commit
ee8eaf2d28
10
src/env.c
10
src/env.c
|
@ -301,3 +301,13 @@ struct Environment defaultEnv()
|
|||
|
||||
return e;
|
||||
}
|
||||
|
||||
int getStructIndex(struct Environment* env, const char* name)
|
||||
{
|
||||
for (int i = 0; i < env->structCount; i++) {
|
||||
if (strcmp(name, env->structDefs[i].name) == 0) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
|
|
@ -39,4 +39,6 @@ struct Environment defaultEnv();
|
|||
|
||||
struct StructDef getStructDef(struct Environment* env, const char* name);
|
||||
|
||||
int getStructIndex(struct Environment* env, const char* name);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -46,7 +46,7 @@ stuff, when you think about it."
|
|||
(htmlize p2)))
|
||||
))))
|
||||
|
||||
(def revealer (fn (x) (cat "x: " x)))
|
||||
(def revealer (fn (x) (cat "" x)))
|
||||
|
||||
(get "/" homepage)
|
||||
(get "/x" revealer)
|
||||
|
|
|
@ -682,9 +682,11 @@ Object charAt(Object string, Object at, struct Environment* ignore)
|
|||
|
||||
Object print(Object p, Object ignore, struct Environment* env)
|
||||
{
|
||||
p = cloneObject(p);
|
||||
p = eval(&p, env);
|
||||
_printObj(&p, 0);
|
||||
Object c = cloneObject(p);
|
||||
Object e = eval(&c, env);
|
||||
_printObj(&e, 0);
|
||||
cleanObject(&c);
|
||||
cleanObject(&e);
|
||||
return numberObject(0);
|
||||
}
|
||||
|
||||
|
|
51
src/web.c
51
src/web.c
|
@ -15,11 +15,14 @@
|
|||
#include "web.h"
|
||||
#include "pebblisp.h"
|
||||
|
||||
struct StructDef query = {
|
||||
.fieldCount = 1,
|
||||
.name = "",
|
||||
.names = {""}
|
||||
};
|
||||
#ifdef _MHD_FLAGS_ENUM
|
||||
typedef enum MHD_Result HttpResult;
|
||||
#else
|
||||
typedef int HttpResult;
|
||||
#endif
|
||||
|
||||
int requestDefinition = -1;
|
||||
|
||||
int routeCount = 0;
|
||||
struct Route routes[10];
|
||||
|
||||
|
@ -41,8 +44,8 @@ int methodMatches(const char* method, struct Route* route)
|
|||
}
|
||||
}
|
||||
|
||||
static int
|
||||
print_out_key (void *queryParamsV, enum MHD_ValueKind kind, const char *key,
|
||||
static HttpResult
|
||||
print_out_key(void *queryParamsV, enum MHD_ValueKind kind, const char *key,
|
||||
const char *value)
|
||||
{
|
||||
(void) kind; /* Unused. Silent compiler warning. */
|
||||
|
@ -55,14 +58,13 @@ print_out_key (void *queryParamsV, enum MHD_ValueKind kind, const char *key,
|
|||
return MHD_YES;
|
||||
}
|
||||
|
||||
//static enum MHD_Result
|
||||
static int
|
||||
static HttpResult
|
||||
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;
|
||||
char *page = NULL;
|
||||
printf("%s URL: '%s' :: ", method, url);
|
||||
printf("version: %s\n", version);
|
||||
printf("upload_data: %s\n", upload_data);
|
||||
|
@ -70,11 +72,13 @@ answer_to_connection(void *cls, struct MHD_Connection *connection,
|
|||
if (methodMatches(method, &routes[i]) && strcmp(url, routes[i].path) == 0) {
|
||||
Object queryParams = listObject();
|
||||
MHD_get_connection_values(connection, MHD_GET_ARGUMENT_KIND, print_out_key, &queryParams);
|
||||
//page = routes[i].routeAction(url);
|
||||
Object lambdaList = listObject();
|
||||
nf_addToList(&lambdaList, queryParams);
|
||||
|
||||
Object res = structObject(requestDefinition);
|
||||
res.structObject->fields[0] = queryParams;
|
||||
Object route = cloneObject(routes[i].routeAction);
|
||||
Object result = listEvalLambda(&route, &lambdaList, routes[i].env);
|
||||
|
||||
Object result = listEvalLambda(&route, &res, routes[i].env);
|
||||
cleanObject(&res);
|
||||
page = result.string;
|
||||
break;
|
||||
}
|
||||
|
@ -86,8 +90,7 @@ answer_to_connection(void *cls, struct MHD_Connection *connection,
|
|||
}
|
||||
|
||||
struct MHD_Response *response;
|
||||
//enum MHD_Result ret;
|
||||
int ret;
|
||||
HttpResult ret;
|
||||
(void) cls; /* Unused. Silent compiler warning. */
|
||||
(void) url; /* Unused. Silent compiler warning. */
|
||||
(void) method; /* Unused. Silent compiler warning. */
|
||||
|
@ -102,11 +105,27 @@ answer_to_connection(void *cls, struct MHD_Connection *connection,
|
|||
ret = MHD_queue_response(connection, MHD_HTTP_OK, response);
|
||||
MHD_destroy_response(response);
|
||||
|
||||
// if (needsFree) {
|
||||
// free(page);
|
||||
// }
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int initialized = 0;
|
||||
void initialize()
|
||||
{
|
||||
if (!initialized) {
|
||||
Object o = parseEval("(struct Request (queryParams))", global());
|
||||
cleanObject(&o);
|
||||
requestDefinition = getStructIndex(global(), "Request");
|
||||
}
|
||||
initialized = 1;
|
||||
}
|
||||
|
||||
int start(int port)
|
||||
{
|
||||
initialize();
|
||||
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);
|
||||
|
|
Loading…
Reference in New Issue