summaryrefslogtreecommitdiff
path: root/request.h
diff options
context:
space:
mode:
authorꦌꦫꦶꦏ꧀ꦦꦿꦧꦮꦑꦩꦭ꧀ <erik@darapsa.co.id>2022-09-18 21:14:36 +0800
committerꦌꦫꦶꦏ꧀ꦦꦿꦧꦮꦑꦩꦭ꧀ <erik@darapsa.co.id>2022-09-18 21:14:36 +0800
commit7a47bb74f8cf5780200126deb010df77f0090a37 (patch)
treecf86e156f0d5b0fa1742a0e7b443a562f87d9d8a /request.h
parent20232131dbb00468fa55df70916db1abc5a720fb (diff)
Move MHD access handler to the library
so the code on the app side is much simpler. Also prepare for accessing the GraphQL Admin API.
Diffstat (limited to 'request.h')
-rw-r--r--request.h42
1 files changed, 36 insertions, 6 deletions
diff --git a/request.h b/request.h
index 7c8fe99..75bfa65 100644
--- a/request.h
+++ b/request.h
@@ -6,22 +6,28 @@
#define TOKEN_POST "client_id=%s&client_secret=%s&code=%s"
#define TOKEN_POST_LEN strlen(TOKEN_POST) - strlen("%s") * 3
+#define TOKEN_HEADER "X-Shopify-Access-Token: %s"
+#define TOKEN_HEADER_LEN strlen(TOKEN_HEADER) - strlen("%s")
+
+#define GRAPHQL_URL "https://%s/admin/api/2022-07/graphql.json"
+#define GRAPHQL_URL_LEN strlen(GRAPHQL_URL) - strlen("%s")
+
static inline void request_init()
{
curl_global_init(CURL_GLOBAL_DEFAULT);
}
-static size_t append(char *data, size_t size, size_t nmemb, char **tok)
+static size_t append(char *data, size_t size, size_t nmemb, char **json)
{
size_t realsize = size * nmemb;
- size_t tok_len = *tok ? strlen(*tok) : 0;
- *tok = realloc(*tok, tok_len + realsize + 1);
- strlcpy(&(*tok)[tok_len], data, realsize + 1);
+ size_t json_len = *json ? strlen(*json) : 0;
+ *json = realloc(*json, json_len + realsize + 1);
+ strlcpy(&(*json)[json_len], data, realsize + 1);
return realsize;
}
static inline void request_token(const char *host, const char *key,
- const char *secret_key, const char *code, char **tok)
+ const char *secret_key, const char *code, char **json)
{
CURL *curl = curl_easy_init();
char url[TOKEN_URL_LEN + strlen(host) + 1];
@@ -31,12 +37,36 @@ static inline void request_token(const char *host, const char *key,
+ strlen(code) + 1];
sprintf(post, TOKEN_POST, key, secret_key, code);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, post);
- curl_easy_setopt(curl, CURLOPT_WRITEDATA, tok);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, append);
+ curl_easy_setopt(curl, CURLOPT_WRITEDATA, json);
+#ifdef DEBUG
+ curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
+#endif
+ curl_easy_perform(curl);
+ curl_easy_cleanup(curl);
+}
+
+static inline void request_graphql(const char *query,
+ const struct shopify_session *session, char **json)
+{
+ CURL *curl = curl_easy_init();
+ char url[GRAPHQL_URL_LEN + strlen(session->shop) + 1];
+ sprintf(url, GRAPHQL_URL, session->shop);
+ curl_easy_setopt(curl, CURLOPT_URL, url);
+ struct curl_slist *list = NULL;
+ curl_slist_append(list, "Content-Type: application/json");
+ char header[TOKEN_HEADER_LEN + strlen(session->token) + 1];
+ sprintf(header, TOKEN_HEADER, session->token);
+ curl_slist_append(list, header);
+ curl_easy_setopt(curl, CURLOPT_HTTPHEADER, list);
+ curl_easy_setopt(curl, CURLOPT_POSTFIELDS, query);
+ curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, append);
+ curl_easy_setopt(curl, CURLOPT_WRITEDATA, json);
#ifdef DEBUG
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
#endif
curl_easy_perform(curl);
+ curl_slist_free_all(list);
curl_easy_cleanup(curl);
}