From f2ad5c75a80c35bb2fc9023cd0fb09a29d428491 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=A6=8C=EA=A6=AB=EA=A6=B6=EA=A6=8F=EA=A7=80=EA=A6=A6?= =?UTF-8?q?=EA=A6=BF=EA=A6=A7=EA=A6=AE=EA=A6=91=EA=A6=A9=EA=A6=AD=EA=A7=80?= Date: Thu, 22 Sep 2022 15:41:38 +0800 Subject: Merge common.h & graphql.c --- shopify.c | 39 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) (limited to 'shopify.c') diff --git a/shopify.c b/shopify.c index 6ef6678..cad260b 100644 --- a/shopify.c +++ b/shopify.c @@ -10,7 +10,6 @@ #include "shopify.h" #include "regex.h" #include "sessiontoken.h" -#include "common.h" #define AUTH_URL \ "https://%s/oauth/authorize?client_id=%s&scope=%s&redirect_uri=%s%s"\ @@ -120,6 +119,15 @@ static int keycmp(const void *struct1, const void *struct2) return strcmp(*(char **)struct1, *(char **)struct2); } +static size_t append(char *data, size_t size, size_t nmemb, char **res) +{ + size_t realsize = size * nmemb; + size_t res_len = *res ? strlen(*res) : 0; + *res = realloc(*res, res_len + realsize + 1); + strlcpy(&(*res)[res_len], data, realsize + 1); + return realsize; +} + static inline int redirect(const char *host, const char *id, struct MHD_Connection *con, struct MHD_Response **res) { @@ -534,3 +542,32 @@ void shopify_app(const char *api_key, const char *api_secret_key, free(sessions); curl_global_cleanup(); } + +void shopify_graphql(const char *query, const struct shopify_session *session, + char **json) +{ + CURL *curl = curl_easy_init(); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, append); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, json); + curl_easy_setopt(curl, CURLOPT_POSTFIELDS, query); + + static const char *url_tmpl + = "https://%s/admin/api/2022-07/graphql.json"; + char url[strlen(url_tmpl) - strlen("%s") + strlen(session->shop) + 1]; + sprintf(url, url_tmpl, session->shop); + curl_easy_setopt(curl, CURLOPT_URL, url); + + static const char *hdr_tmpl = "X-Shopify-Access-Token: %s"; + char header[strlen(hdr_tmpl) - strlen("%s") + + strlen(session->access_token) + 1]; + sprintf(header, hdr_tmpl, session->access_token); + + struct curl_slist *list = NULL; + list = curl_slist_append(list, header); + list = curl_slist_append(list, "Content-Type: application/graphql"); + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, list); + + curl_easy_perform(curl); + curl_slist_free_all(list); + curl_easy_cleanup(curl); +} -- cgit v1.2.3