# A simple HTTP library built using CURL use -lcurl use struct HTTPResponse(code:Int, body:Text) enum _Method(GET, POST, PUT, PATCH, DELETE) func _send(method:_Method, url:Text, data:Text?, headers:[Text]=[] -> HTTPResponse) chunks : @[Text] save_chunk := func(chunk:CString, size:Int64, n:Int64) chunks.insert(C_code:Text`Text$from_strn(@chunk, @size*@n)`) return n*size C_code ` CURL *curl = curl_easy_init(); struct curl_slist *chunk = NULL; curl_easy_setopt(curl, CURLOPT_URL, @(CString(url))); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, @save_chunk.fn); curl_easy_setopt(curl, CURLOPT_WRITEDATA, @save_chunk.userdata); ` defer C_code ` if (chunk) curl_slist_free_all(chunk); curl_easy_cleanup(curl); ` when method is POST C_code ` curl_easy_setopt(curl, CURLOPT_POST, 1L); ` if posting := data C_code ` curl_easy_setopt(curl, CURLOPT_POSTFIELDS, @(CString(posting))); ` is PUT C_code ` curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "PUT"); ` if putting := data C_code ` curl_easy_setopt(curl, CURLOPT_POSTFIELDS, @(CString(putting))); ` is PATCH C_code ` curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "PATCH"); ` if patching := data C_code ` curl_easy_setopt(curl, CURLOPT_POSTFIELDS, @(CString(patching))); ` is DELETE C_code ` curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "DELETE"); ` else pass for header in headers C_code ` chunk = curl_slist_append(chunk, @(CString(header))); ` C_code ` if (chunk) curl_easy_setopt(curl, CURLOPT_HTTPHEADER, chunk); ` code := Int64(0) C_code ` CURLcode res = curl_easy_perform(curl); if (res != CURLE_OK) fprintf(stderr, "curl_easy_perform() failed: %s\\n", curl_easy_strerror(res)); curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &@code); ` return HTTPResponse(Int(code), "".join(chunks)) func get(url:Text, headers:[Text]=[] -> HTTPResponse) return _send(GET, url, none, headers) func post(url:Text, data="", headers=["Content-Type: application/json", "Accept: application/json"] -> HTTPResponse) return _send(POST, url, data, headers) func put(url:Text, data="", headers=["Content-Type: application/json", "Accept: application/json"] -> HTTPResponse) return _send(PUT, url, data, headers) func patch(url:Text, data="", headers=["Content-Type: application/json", "Accept: application/json"] -> HTTPResponse) return _send(PATCH, url, data, headers) func delete(url:Text, data:Text?=none, headers=["Content-Type: application/json", "Accept: application/json"] -> HTTPResponse) return _send(DELETE, url, data, headers) func main() say("GET:") say(get("https://httpbin.org/get").body) say("Waiting 1sec...") sleep(1) say("POST:") say(post("https://httpbin.org/post", `{"key": "value"}`).body) say("Waiting 1sec...") sleep(1) say("PUT:") say(put("https://httpbin.org/put", `{"key": "value"}`).body) say("Waiting 1sec...") sleep(1) say("DELETE:") say(delete("https://httpbin.org/delete").body)