From faf3d1f0b16b553f1d80d3b68be907fbd22c5cee Mon Sep 17 00:00:00 2001 From: Yen-chi Chen Date: Thu, 19 May 2016 11:36:46 +0800 Subject: [PATCH 1/3] Route: add basic routing --- include/route.h | 26 ++++++++++++++++++++++++++ src/route.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+) create mode 100644 include/route.h create mode 100644 src/route.c diff --git a/include/route.h b/include/route.h new file mode 100644 index 0000000..1a4d468 --- /dev/null +++ b/include/route.h @@ -0,0 +1,26 @@ +#ifndef ROUTE_H +#define ROUTE_H + +#include "response.h" +#include "request.h" + +typedef enum ROUTE_MATCH { + NONE, EXACT, NORMAL +} ROUTE_MATCH; + +typedef Response *(*Handler)(Request *); +typedef Response *(**HandlerP)(Request *); + +typedef struct Route { + const char * path; + ROUTE_MATCH match; + + Handler handler; +} Route; + +Route *routeNew(Handler handler); +void routeDel(Route *); +Response *routeHandle(Route *, Request *); +void routeAddPath(Route *, ROUTE_MATCH match, const char *); + +#endif diff --git a/src/route.c b/src/route.c new file mode 100644 index 0000000..717fd5e --- /dev/null +++ b/src/route.c @@ -0,0 +1,47 @@ +#include +#include +#include +#include + +#include "route.h" + +Route *routeNew(Handler handler) +{ + Route *route = malloc(sizeof(Route)); + route->path = NULL; + route->match = NONE; + route->handler = handler; + return route; +} + +void routeDel(Route *route) +{ + free(route); +} + +Response *routeHandle(Route *route, Request * req) +{ + if (route->path) { + switch (route->match) { + case EXACT: + if (strcmp(req->uri, route->path) != 0) + return NULL; + break; + case NORMAL: + if (strncmp(req->uri, route->path, strlen(route->path)) != 0) + return NULL; + break; + default: + break; + } + } + + return route->handler(req); +} + +void routeAddPath(Route *route, ROUTE_MATCH match, const char *path) +{ + route->path = path; + route->match = match; +} + From 1c170ad41616ac556e87f6e6d66ff54bb1e998b5 Mon Sep 17 00:00:00 2001 From: Yen-chi Chen Date: Thu, 19 May 2016 11:37:40 +0800 Subject: [PATCH 2/3] Route: integrate route with server and handler --- Makefile | 3 ++- include/server.h | 7 ++++--- src/main.c | 52 ++++++++++++++---------------------------------- src/server.c | 26 ++++++++++++++---------- 4 files changed, 36 insertions(+), 52 deletions(-) diff --git a/Makefile b/Makefile index 752891d..ee61934 100644 --- a/Makefile +++ b/Makefile @@ -28,7 +28,8 @@ OBJS = \ src/models/connection.o \ src/models/session.o \ src/models/post.o \ - src/server.o + src/server.o \ + src/route.o deps := $(OBJS:%.o=%.o.d) diff --git a/include/server.h b/include/server.h index d03efe3..2615b6c 100644 --- a/include/server.h +++ b/include/server.h @@ -4,11 +4,12 @@ #include "list.h" #include "request.h" #include "response.h" +#include "route.h" typedef struct Server { unsigned int port; - ListCell *handlers; + ListCell *routes; } Server; typedef Response *(*Handler)(Request *); @@ -16,8 +17,8 @@ typedef Response *(**HandlerP)(Request *); Server *serverNew(unsigned int); void serverDel(Server *); -void serverAddHandler(Server *, Handler); -void serverAddStaticHandler(Server *); +Route *serverAddRoute(Server *, ROUTE_MATCH, const char *, Handler); +void serverAddStaticRoute(Server *, ROUTE_MATCH, const char *); void serverServe(Server *); #endif diff --git a/src/main.c b/src/main.c index e6042a6..e363dfc 100644 --- a/src/main.c +++ b/src/main.c @@ -119,21 +119,21 @@ int main(int argc, char *argv[]) } } Server *server = serverNew(server_port); - serverAddHandler(server, notFound); - serverAddStaticHandler(server); - serverAddHandler(server, about); - serverAddHandler(server, signup); - serverAddHandler(server, logout); - serverAddHandler(server, login); - serverAddHandler(server, search); - serverAddHandler(server, connect); - serverAddHandler(server, like); - serverAddHandler(server, unlike); - serverAddHandler(server, post); - serverAddHandler(server, profile); - serverAddHandler(server, dashboard); - serverAddHandler(server, home); - serverAddHandler(server, session); + serverAddRoute(server, NONE, NULL, notFound); + serverAddStaticRoute(server, NORMAL, "/static/"); + serverAddRoute(server, EXACT, "/about/", about); + serverAddRoute(server, EXACT, "/signup/", signup); + serverAddRoute(server, EXACT, "/logout/", logout); + serverAddRoute(server, EXACT, "/login/", login); + serverAddRoute(server, EXACT, "/search/", search); + serverAddRoute(server, NORMAL, "/connect/", connect); + serverAddRoute(server, NORMAL, "/like/", like); + serverAddRoute(server, NORMAL, "/unlike/", unlike); + serverAddRoute(server, EXACT, "/post/", post); + serverAddRoute(server, NORMAL, "/profile/", profile); + serverAddRoute(server, EXACT, "/dashboard/", dashboard); + serverAddRoute(server, EXACT, "/", home); + serverAddRoute(server, NONE, NULL, session); serverServe(server); return 0; @@ -158,8 +158,6 @@ static Response *session(Request *req) static Response *home(Request *req) { - EXACT_ROUTE(req, "/"); - if (req->account) return responseNewRedirect("/dashboard/"); @@ -175,8 +173,6 @@ static Response *home(Request *req) static Response *dashboard(Request *req) { - EXACT_ROUTE(req, "/dashboard/"); - if (!req->account) return responseNewRedirect("/login/"); @@ -256,8 +252,6 @@ static Response *dashboard(Request *req) static Response *profile(Request *req) { - ROUTE(req, "/profile/"); - if (!req->account) return NULL; int id = -1; @@ -360,8 +354,6 @@ static Response *profile(Request *req) static Response *post(Request *req) { - EXACT_ROUTE(req, "/post/"); - if (req->method != POST) return NULL; char *postStr = kvFindList(req->postBody, "post"); @@ -376,8 +368,6 @@ static Response *post(Request *req) static Response *unlike(Request *req) { - ROUTE(req, "/unlike/"); - if (!req->account) return NULL; int id = -1; @@ -405,8 +395,6 @@ static Response *unlike(Request *req) static Response *like(Request *req) { - ROUTE(req, "/like/"); - if (!req->account) return NULL; int id = -1; @@ -434,7 +422,6 @@ static Response *like(Request *req) static Response *connect(Request *req) { - ROUTE(req, "/connect/"); if (!req->account) return NULL; int id = -1; @@ -460,8 +447,6 @@ static Response *connect(Request *req) static Response *search(Request *req) { - EXACT_ROUTE(req, "/search/"); - if (!req->account) return responseNewRedirect("/login/"); @@ -521,8 +506,6 @@ static Response *search(Request *req) static Response *login(Request *req) { - EXACT_ROUTE(req, "/login/"); - if (req->account) return responseNewRedirect("/dashboard/"); @@ -571,7 +554,6 @@ static Response *login(Request *req) static Response *logout(Request *req) { - EXACT_ROUTE(req, "/logout/"); if (!req->account) return responseNewRedirect("/"); @@ -582,8 +564,6 @@ static Response *logout(Request *req) static Response *signup(Request *req) { - EXACT_ROUTE(req, "/signup/"); - if (req->account) return responseNewRedirect("/dashboard/"); @@ -672,8 +652,6 @@ static Response *signup(Request *req) static Response *about(Request *req) { - EXACT_ROUTE(req, "/about/"); - Response *response = responseNew(); Template *template = templateNew("templates/about.html"); templateSet(template, "active", "about"); diff --git a/src/server.c b/src/server.c index 4db5f7b..f9f79a1 100644 --- a/src/server.c +++ b/src/server.c @@ -64,13 +64,13 @@ Server *serverNew(unsigned int port) { Server *server = malloc(sizeof(Server)); server->port = port; - server->handlers = NULL; + server->routes = NULL; return server; } void serverDel(Server *server) { - if (server->handlers) listDel(server->handlers); + if (server->routes) listDel(server->routes); free(server); #ifdef _WIN32 @@ -78,10 +78,14 @@ void serverDel(Server *server) #endif } -void serverAddHandler(Server *server, Handler handler) +Route *serverAddRoute(Server *server, ROUTE_MATCH match, const char *path, Handler handler) { - HandlerP handlerP = &handler; - server->handlers = listCons(handlerP, sizeof(HandlerP), server->handlers); + Route * route = routeNew(handler); + routeAddPath(route, match, path); + + server->routes = listCons(route, sizeof(Route), server->routes); + + return (Route *)(server->routes->value); } static Response *staticHandler(Request *req) @@ -144,9 +148,9 @@ static Response *staticHandler(Request *req) return response; } -void serverAddStaticHandler(Server *server) +void serverAddStaticRoute(Server *server, ROUTE_MATCH match, const char * path) { - serverAddHandler(server, staticHandler); + serverAddRoute(server, match, path, staticHandler); } static inline int makeSocket(unsigned int port) @@ -198,12 +202,12 @@ static inline void handle(Server *server, int fd, fd_set *activeFDs, struct sock send(fd, "HTTP/1.0 400 Bad Request\r\n\r\nBad Request", 39, 0); LOG_400(addr); } else { - ListCell *handler = server->handlers; + ListCell *route = server->routes; Response *response = NULL; - while (handler && !response) { - response = (*(HandlerP)handler->value)(req); - handler = handler->next; + while (route && !response) { + response = routeHandle((Route *)(route->value), req); + route = route->next; } if (!response) { From 002bfeca9841ceb353178b93f05d9ebe8b0baea7 Mon Sep 17 00:00:00 2001 From: Yen-chi Chen Date: Fri, 10 Jun 2016 20:58:24 +0800 Subject: [PATCH 3/3] Route: CS fix --- src/route.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/route.c b/src/route.c index 717fd5e..24f8880 100644 --- a/src/route.c +++ b/src/route.c @@ -44,4 +44,3 @@ void routeAddPath(Route *route, ROUTE_MATCH match, const char *path) route->path = path; route->match = match; } -