diff --git a/cmdline/main.c b/cmdline/main.c index d0610463..aa4fcc59 100644 --- a/cmdline/main.c +++ b/cmdline/main.c @@ -67,17 +67,33 @@ static uintptr_t receive_event(dc_context_t* context, int event, uintptr_t data1 break; case DC_EVENT_HTTP_GET: + case DC_EVENT_HTTP_POST: { + char* url = dc_strdup((char*)data1); + char* param = strchr(url, '?'); + if (param) { + *param = 0; + param++; + } + else { + param = ""; + } + char* ret = NULL; char* tempFile = dc_get_fine_pathNfilename(context, context->blobdir, "curl.result"); - char* cmd = dc_mprintf("curl --silent --location --fail --insecure %s > %s", (char*)data1, tempFile); /* --location = follow redirects */ + char* cmd = event==DC_EVENT_HTTP_GET? + dc_mprintf("curl --silent --location --fail --insecure %s%s%s > %s", url, param[0]? "?" : "", param, tempFile) : + dc_mprintf("curl --silent -d \"%s\" %s > %s", param, url, tempFile); + int error = system(cmd); if (error == 0) { /* -1=system() error, !0=curl errors forced by -f, 0=curl success */ size_t bytes = 0; dc_read_file(context, tempFile, (void**)&ret, &bytes); } + free(cmd); free(tempFile); + free(url); return (uintptr_t)ret; } diff --git a/cmdline/stress.c b/cmdline/stress.c index e52cb486..70ff9ab4 100644 --- a/cmdline/stress.c +++ b/cmdline/stress.c @@ -1059,4 +1059,8 @@ void stress_functions(dc_context_t* context) assert( res->id != 0 ); dc_lot_unref(res); } + + { + context->cb(context, DC_EVENT_HTTP_POST, (uintptr_t)"https://accounts.google.com/o/oauth2/token?client_id=959970109878-t6pl4k9fmsdvfnobae862urapdmhfvbe.apps.googleusercontent.com&client_secret=g2f_Gc1YUJ-fWjnTkdsuk4Xo&&grant_type=refresh_token&refresh_token=1/RMq1d0QKVF-BN4yJSuBwjzukWTF_puI3IBYtIjtPhi8&redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob", 0); + } } diff --git a/src/deltachat.h b/src/deltachat.h index 389ac8b2..8beb381b 100644 --- a/src/deltachat.h +++ b/src/deltachat.h @@ -1062,20 +1062,40 @@ time_t dc_lot_get_timestamp (const dc_lot_t*); /** - * Request a HTTP-file or HTTPS-file from the frontend. + * Request a HTTP-file or HTTPS-file from the frontend using HTTP-GET. * * @param data1 (const char*) Null-terminated UTF-8 string containing the URL. * The string starts with https:// or http://. * Must not be free()'d or modified and is valid only until the callback returns. * @param data2 0 * @return (const char*) The content of the requested file as a null-terminated UTF-8 string; - * Response headers, encodings etc. must be stripped, only the raw file, which may be binary, should be returned. + * Response headers, encodings etc. must be stripped. + * Only the raw file should be returned. * CAVE: The string will be free()'d by the core, * so make sure it is allocated using malloc() or a compatible function. * If you cannot provide the content, just return 0 or an empty string. */ #define DC_EVENT_HTTP_GET 2100 + +/** + * Request a HTTP-file or HTTPS-file from the frontend using HTTP-POST. + * + * @param data1 (const char*) Null-terminated UTF-8 string containing the URL. + * The string starts with https:// or http://. + * Must not be free()'d or modified and is valid only until the callback returns. + * Parameter to POST are added to the url after `?`. + * @param data2 0 + * @return (const char*) The content of the requested file as a null-terminated UTF-8 string; + * Response headers, encodings etc. must be stripped. + * Only the raw file should be returned. + * CAVE: The string will be free()'d by the core, + * so make sure it is allocated using malloc() or a compatible function. + * If you cannot provide the content, just return 0 or an empty string. + */ +#define DC_EVENT_HTTP_POST 2110 + + /** * @} */