int test_scm_convert_to_slist__empty_list (void) { SCM str_list = scm_list_n(SCM_UNDEFINED); struct curl_slist *ret = _scm_convert_to_slist (str_list); printf("test that _scm_convert_to_slist returns NULL when passed an empty list: %d\n", ret == NULL); return ret == NULL; }
int test_scm_convert_to_slist__list_of_integers (void) { SCM str_list = scm_list_2(scm_from_int(1), scm_from_int(2)); struct curl_slist *ret = _scm_convert_to_slist (str_list); printf("test that _scm_convert_to_slist returns NULL when passed a list of integers: %d\n", ret == NULL); return ret == NULL; }
int test_scm_convert_to_slist__slist (void) { SCM str_list = scm_list_2(scm_from_locale_string("foo"), scm_from_locale_string("bar")); struct curl_slist *ret = _scm_convert_to_slist (str_list); printf("test that _scm_convert_to_slist returns an slist when passed a list of strings: %d\n", ret != NULL); return ret != NULL; }
SCM DLL_PUBLIC cl_easy_setopt (SCM handle, SCM option, SCM param, SCM big) { handle_post_t *c_handle; CURLoption c_option; CURLcode code = CURLE_UNSUPPORTED_PROTOCOL; SCM_ASSERT (_scm_is_handle (handle), handle, SCM_ARG1, "curl-easy-setopt"); SCM_ASSERT (scm_is_integer (option), option, SCM_ARG2, "curl-easy-setopt"); c_handle = _scm_to_handle (handle); c_option = (CURLoption) scm_to_int (option); if (c_option == CURLOPT_POSTFIELDS) { if (_scm_can_convert_to_byte_data (param)) { size_t len; uint8_t *m = _scm_convert_to_byte_data (param, &len); free (c_handle->postfields); c_handle->postfields = m; curl_easy_setopt (c_handle->handle, CURLOPT_POSTFIELDSIZE, len); c_handle->postfieldsize = len; code = curl_easy_setopt (c_handle->handle, CURLOPT_POSTFIELDS, (char *) m); } else scm_error (SCM_BOOL_F, "cl-easy-setopt", "CURLOPT_POSTFIELDS requires 8-bit string or bytevector data", SCM_BOOL_F, SCM_BOOL_F); } else if (c_option == CURLOPT_HTTPHEADER) { if (_scm_can_convert_to_slist (param)) { /* slists require special handling to free them properly, so they are stored with the Curl handle. */ struct curl_slist *sl = _scm_convert_to_slist (param); if (c_handle->httpheader) curl_slist_free_all (c_handle->httpheader); c_handle->httpheader = sl; code = curl_easy_setopt (c_handle->handle, CURLOPT_HTTPHEADER, sl); } else scm_error (SCM_BOOL_F, "cl-easy-setopt", "CURLOPT_HTTPHEADER requires a list of strings", SCM_BOOL_F, SCM_BOOL_F); } else if (scm_is_integer (param)) { if (scm_is_true (big)) code = curl_easy_setopt (c_handle->handle, c_option, scm_to_int64 (param)); else code = curl_easy_setopt (c_handle->handle, c_option, scm_to_long (param)); } else if (scm_is_string (param)) { /* Strings are copied by curl, so they can be freed here. */ char *str; str = scm_to_locale_string (param); code = curl_easy_setopt (c_handle->handle, c_option, str); free (str); } else if (_scm_can_convert_to_slist (param)) { /* slists require special handling to free them properly, so they are stored with the Curl handle. */ struct curl_slist *sl = _scm_convert_to_slist (param); int ok = 1; if (c_option == CURLOPT_HTTP200ALIASES) { if (c_handle->http200aliases) curl_slist_free_all (c_handle->http200aliases); c_handle->http200aliases = sl; } else if (c_option == CURLOPT_MAIL_RCPT) { if (c_handle->mail_rcpt) curl_slist_free_all (c_handle->mail_rcpt); c_handle->mail_rcpt = sl; } else if (c_option == CURLOPT_QUOTE) { if (c_handle->quote) curl_slist_free_all (c_handle->quote); c_handle->quote = sl; } else if (c_option == CURLOPT_POSTQUOTE) { if (c_handle->postquote) curl_slist_free_all (c_handle->postquote); c_handle->postquote = sl; } else if (c_option == CURLOPT_PREQUOTE) { if (c_handle->prequote) curl_slist_free_all (c_handle->prequote); c_handle->prequote = sl; } else if (c_option == CURLOPT_RESOLVE) { if (c_handle->resolve) curl_slist_free_all (c_handle->resolve); c_handle->resolve = sl; } else if (c_option == CURLOPT_TELNETOPTIONS) { if (c_handle->telnetoptions) curl_slist_free_all (c_handle->telnetoptions); c_handle->telnetoptions = sl; } else { // Bad slist option ok = 0; } if (ok) code = curl_easy_setopt (c_handle->handle, c_option, sl); } else if (_scm_can_convert_to_httppost (param)) { if (c_option == CURLOPT_HTTPPOST) { struct curl_httppost *p; p = _scm_convert_to_httppost (param); free (c_handle->httppost); c_handle->httppost = p; code = curl_easy_setopt (c_handle, CURLOPT_HTTPPOST, p); } } else if (scm_is_true (scm_input_port_p (param))) { if (c_option == CURLOPT_READDATA) { curl_easy_setopt (c_handle->handle, CURLOPT_READFUNCTION, read_callback); code = curl_easy_setopt (c_handle->handle, CURLOPT_READDATA, SCM2PTR (param)); } } else scm_error (SCM_BOOL_F, "curl-easy-setopt", "unimplemented option type", SCM_BOOL_F, SCM_BOOL_F); if (code != CURLE_OK) scm_error (SCM_BOOL_F, "curl-easy-setopt", "bad handle", SCM_BOOL_F, SCM_BOOL_F); return SCM_UNSPECIFIED; }