Work on request
authorJeroen van der Heijden <jeroen@transceptor.technology>
Wed, 15 Jan 2020 08:38:31 +0000 (09:38 +0100)
committerJeroen van der Heijden <jeroen@transceptor.technology>
Wed, 15 Jan 2020 08:38:31 +0000 (09:38 +0100)
include/siri/service/request.h
src/siri/api.c
src/siri/service/request.c

index f991012ba50baa467a7388f5da9e1a7b997eae9e..cb58fad77bb2a10f847789981cad87f0386b50a4 100644 (file)
@@ -6,10 +6,10 @@
 
 typedef enum
 {
-    SERVICE_NEW_ACCOUNT_,
-    SERVICE_CHANGE_PASSWORD_,
-    SERVICE_DROP_ACCOUNT_,
-    SERVICE_NEW_DATABASE_,
+    SERVICE_NEW_ACCOUNT,
+    SERVICE_CHANGE_PASSWORD,
+    SERVICE_DROP_ACCOUNT,
+    SERVICE_NEW_DATABASE,
     SERVICE_NEW_POOL,
     SERVICE_NEW_REPLICA,
     SERVICE_DROP_DATABASE,
index 93e724fa3b19768d7c92be3f7db1bf83635ad8e5..45f8c2e8015c3d67386af368d89d8f0b7ded39e3 100644 (file)
@@ -210,9 +210,54 @@ static int api__url_cb(http_parser * parser, const char * at, size_t n)
     }
     else if (API__CMP_WITH(at, n, "/new-account"))
     {
-        ar->request_type = SIRI_API_RT_INSERT;
+        ar->request_type = SIRI_APT_RT_SERVICE;
+        ar->service_type = SERVICE_NEW_ACCOUNT;
+    }
+    else if (API__CMP_WITH(at, n, "/change-password"))
+    {
+        ar->request_type = SIRI_APT_RT_SERVICE;
+        ar->service_type = SERVICE_CHANGE_PASSWORD;
+    }
+    else if (API__CMP_WITH(at, n, "/drop-account"))
+    {
+        ar->request_type = SIRI_APT_RT_SERVICE;
+        ar->service_type = SERVICE_DROP_ACCOUNT;
+    }
+    else if (API__CMP_WITH(at, n, "/new-database"))
+    {
+        ar->request_type = SIRI_APT_RT_SERVICE;
+        ar->service_type = SERVICE_NEW_DATABASE;
+    }
+    else if (API__CMP_WITH(at, n, "/new-pool"))
+    {
+        ar->request_type = SIRI_APT_RT_SERVICE;
+        ar->service_type = SERVICE_NEW_POOL;
+    }
+    else if (API__CMP_WITH(at, n, "/new-replica"))
+    {
+        ar->request_type = SIRI_APT_RT_SERVICE;
+        ar->service_type = SERVICE_NEW_REPLICA;
+    }
+    else if (API__CMP_WITH(at, n, "/drop-database"))
+    {
+        ar->request_type = SIRI_APT_RT_SERVICE;
+        ar->service_type = SERVICE_DROP_DATABASE;
+    }
+    else if (API__CMP_WITH(at, n, "/get-version"))
+    {
+        ar->request_type = SIRI_APT_RT_SERVICE;
+        ar->service_type = SERVICE_GET_VERSION;
+    }
+    else if (API__CMP_WITH(at, n, "/get-accounts"))
+    {
+        ar->request_type = SIRI_APT_RT_SERVICE;
+        ar->service_type = SERVICE_GET_ACCOUNTS;
+    }
+    else if (API__CMP_WITH(at, n, "/get-databases"))
+    {
+        ar->request_type = SIRI_APT_RT_SERVICE;
+        ar->service_type = SERVICE_GET_DATABASES;
     }
-
     return 0;
 }
 
@@ -553,9 +598,12 @@ static int api__insert_from_qp(siri_api_request_t * ar)
     return 0;
 }
 
-static int api__insert_cb(siri_api_request_t * ar)
+static int api__insert_cb(http_parser * parser)
 {
-    assert (ar->request_type == SIRI_API_RT_INSERT);
+    siri_api_request_t * ar = parser->data;
+
+    if (parser->method != HTTP_POST)
+        return api__plain_response(ar, E405_METHOD_NOT_ALLOWED);
 
     if (!ar->siridb)
         return api__plain_response(ar, E404_NOT_FOUND);
@@ -597,10 +645,13 @@ static int api__insert_cb(siri_api_request_t * ar)
     return api__plain_response(ar, E415_UNSUPPORTED_MEDIA_TYPE);
 }
 
-static int api__query_cb(siri_api_request_t * ar)
+static int api__query_cb(http_parser * parser)
 {
     api__query_t q;
-    assert (ar->request_type == SIRI_API_RT_QUERY);
+    siri_api_request_t * ar = parser->data;
+
+    if (parser->method != HTTP_POST)
+        return api__plain_response(ar, E405_METHOD_NOT_ALLOWED);
 
     if (!ar->siridb)
         return api__plain_response(ar, E404_NOT_FOUND);
@@ -631,21 +682,49 @@ static int api__query_cb(siri_api_request_t * ar)
     return api__plain_response(ar, E415_UNSUPPORTED_MEDIA_TYPE);
 }
 
-static int api__message_complete_cb(http_parser * parser)
+static int api__service_cb(http_parser * parser)
 {
+    api__query_t q;
     siri_api_request_t * ar = parser->data;
 
-    if (parser->method != HTTP_POST)
-        return api__plain_response(ar, E405_METHOD_NOT_ALLOWED);
+    switch (ar->service_type)
+    {
+    case SERVICE_NEW_ACCOUNT:
+    case SERVICE_CHANGE_PASSWORD:
+    case SERVICE_DROP_ACCOUNT:
+    case SERVICE_NEW_DATABASE:
+    case SERVICE_NEW_POOL:
+    case SERVICE_NEW_REPLICA:
+    case SERVICE_DROP_DATABASE:
+        if (parser->method != HTTP_POST)
+            return api__plain_response(ar, E405_METHOD_NOT_ALLOWED);
+        break;
+
+    case SERVICE_GET_VERSION:
+    case SERVICE_GET_ACCOUNTS:
+    case SERVICE_GET_DATABASES:
+        if (parser->method != HTTP_GET)
+            return api__plain_response(ar, E405_METHOD_NOT_ALLOWED);
+        break;
+    }
+
+
+}
+
+static int api__message_complete_cb(http_parser * parser)
+{
+    siri_api_request_t * ar = parser->data;
 
     switch(ar->request_type)
     {
     case SIRI_API_RT_NONE:
         return api__plain_response(ar, E404_NOT_FOUND);
     case SIRI_API_RT_QUERY:
-        return api__query_cb(ar);
+        return api__query_cb(parser);
     case SIRI_API_RT_INSERT:
-        return api__insert_cb(ar);
+        return api__insert_cb(parser);
+    case SIRI_APT_RT_SERVICE:
+        return api__service_cb(parser);
     }
 
     return api__plain_response(ar, E500_INTERNAL_SERVER_ERROR);
index 1ca029d984f0125b45183c8537e0c2e5325a5ef0..421e29876e37188452c0e0fc84bdbf11c52ed0ee 100644 (file)
@@ -246,13 +246,13 @@ cproto_server_t siri_service_request(
 {
     switch ((service_request_t) tp)
     {
-    case SERVICE_NEW_ACCOUNT_:
+    case SERVICE_NEW_ACCOUNT:
         return SERVICE_on_new_account(qp_unpacker, err_msg);
-    case SERVICE_CHANGE_PASSWORD_:
+    case SERVICE_CHANGE_PASSWORD:
         return SERVICE_on_change_password(qp_unpacker, err_msg);
-    case SERVICE_DROP_ACCOUNT_:
+    case SERVICE_DROP_ACCOUNT:
         return SERVICE_on_drop_account(qp_unpacker, qp_account, err_msg);
-    case SERVICE_NEW_DATABASE_:
+    case SERVICE_NEW_DATABASE:
         return SERVICE_on_new_database(qp_unpacker, err_msg);
     case SERVICE_NEW_POOL:
         return SERVICE_on_new_replica_or_pool(