1*4882a593SmuzhiyunFrom 3dc630ae5b9dc6cda1ba318de2cd654aaba7b4a2 Mon Sep 17 00:00:00 2001 2*4882a593SmuzhiyunFrom: Carlos Garcia Campos <cgarcia@igalia.com> 3*4882a593SmuzhiyunDate: Tue, 8 Jun 2021 17:44:04 +0200 4*4882a593SmuzhiyunSubject: [PATCH 2/2] Port to libsoup3 5*4882a593Smuzhiyun 6*4882a593SmuzhiyunUpstream-Status: Submitted [https://gitlab.gnome.org/GNOME/librest/-/merge_requests/6] 7*4882a593Smuzhiyun--- 8*4882a593Smuzhiyun configure.ac | 39 ++++- 9*4882a593Smuzhiyun rest-extras.pc.in | 2 +- 10*4882a593Smuzhiyun rest-extras/youtube-proxy.c | 110 +++++++++++--- 11*4882a593Smuzhiyun rest.pc.in | 2 +- 12*4882a593Smuzhiyun rest/rest-private.h | 22 ++- 13*4882a593Smuzhiyun rest/rest-proxy-auth.c | 16 ++ 14*4882a593Smuzhiyun rest/rest-proxy-call.c | 296 +++++++++++++++++++++++++++++------- 15*4882a593Smuzhiyun rest/rest-proxy.c | 209 ++++++++++++++++++++++--- 16*4882a593Smuzhiyun tests/custom-serialize.c | 18 +++ 17*4882a593Smuzhiyun tests/proxy-continuous.c | 37 ++++- 18*4882a593Smuzhiyun tests/proxy.c | 63 +++++++- 19*4882a593Smuzhiyun tests/threaded.c | 17 +++ 20*4882a593Smuzhiyun 12 files changed, 719 insertions(+), 112 deletions(-) 21*4882a593Smuzhiyun 22*4882a593Smuzhiyundiff --git a/configure.ac b/configure.ac 23*4882a593Smuzhiyunindex d586e69..75c02fe 100644 24*4882a593Smuzhiyun--- a/configure.ac 25*4882a593Smuzhiyun+++ b/configure.ac 26*4882a593Smuzhiyun@@ -20,12 +20,6 @@ AM_INIT_AUTOMAKE([1.11 foreign -Wno-portability no-define dist-xz]) 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun AM_SILENT_RULES([yes]) 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun-API_MAJOR=1 31*4882a593Smuzhiyun-API_MINOR=0 32*4882a593Smuzhiyun-AC_SUBST([API_VERSION],[$API_MAJOR.$API_MINOR]) 33*4882a593Smuzhiyun-AC_SUBST([API_VERSION_AM],[$API_MAJOR\_$API_MINOR]) 34*4882a593Smuzhiyun-AC_DEFINE_UNQUOTED(API_VERSION, [$API_VERSION], [API version]) 35*4882a593Smuzhiyun- 36*4882a593Smuzhiyun AC_CANONICAL_HOST 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun AC_PROG_CC 39*4882a593Smuzhiyun@@ -41,7 +35,6 @@ LT_PREREQ([2.2.6]) 40*4882a593Smuzhiyun LT_INIT([disable-static]) 41*4882a593Smuzhiyun 42*4882a593Smuzhiyun PKG_CHECK_MODULES(GLIB, glib-2.0 >= 2.67.4) 43*4882a593Smuzhiyun-PKG_CHECK_MODULES(SOUP, libsoup-2.4 >= 2.42) 44*4882a593Smuzhiyun PKG_CHECK_MODULES(XML, libxml-2.0) 45*4882a593Smuzhiyun PKG_CHECK_MODULES(GTHREAD, gthread-2.0) 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun@@ -58,6 +51,37 @@ AC_PATH_PROG([GLIB_MKENUMS],[glib-mkenums]) 48*4882a593Smuzhiyun localedir=${datadir}/locale 49*4882a593Smuzhiyun AC_SUBST(localedir) 50*4882a593Smuzhiyun 51*4882a593Smuzhiyun+AC_MSG_CHECKING([for libsoup version to use]) 52*4882a593Smuzhiyun+AC_ARG_WITH(soup, 53*4882a593Smuzhiyun+ [AC_HELP_STRING([--soup=2|3], 54*4882a593Smuzhiyun+ [version of libsoup library to use (default: 2)])], 55*4882a593Smuzhiyun+ [case "$withval" in 56*4882a593Smuzhiyun+ 2|3) ;; 57*4882a593Smuzhiyun+ *) AC_MSG_ERROR([invalid argument "$withval" for --with-soup]) ;; 58*4882a593Smuzhiyun+ esac], 59*4882a593Smuzhiyun+ [with_soup=2]) 60*4882a593Smuzhiyun+AC_MSG_RESULT([$with_soup]) 61*4882a593Smuzhiyun+ 62*4882a593Smuzhiyun+API_MAJOR=1 63*4882a593Smuzhiyun+ 64*4882a593Smuzhiyun+if test "$with_soup" = "2"; then 65*4882a593Smuzhiyun+ PKG_CHECK_MODULES(SOUP, libsoup-2.4 >= 2.42) 66*4882a593Smuzhiyun+ SOUP_API_VERSION=2.4 67*4882a593Smuzhiyun+ API_MINOR=0 68*4882a593Smuzhiyun+ AC_DEFINE([WITH_SOUP_2],[1],[Define if libsoup version used is 2]) 69*4882a593Smuzhiyun+else 70*4882a593Smuzhiyun+ PKG_CHECK_MODULES(SOUP, libsoup-3.0 >= 2.99.8) 71*4882a593Smuzhiyun+ SOUP_API_VERSION=3.0 72*4882a593Smuzhiyun+ API_MINOR=1 73*4882a593Smuzhiyun+fi 74*4882a593Smuzhiyun+ 75*4882a593Smuzhiyun+AM_CONDITIONAL([WITH_SOUP_2],[test "$with_soup" = "2"]) 76*4882a593Smuzhiyun+AC_SUBST(SOUP_API_VERSION) 77*4882a593Smuzhiyun+ 78*4882a593Smuzhiyun+AC_SUBST([API_VERSION],[$API_MAJOR.$API_MINOR]) 79*4882a593Smuzhiyun+AC_SUBST([API_VERSION_AM],[$API_MAJOR\_$API_MINOR]) 80*4882a593Smuzhiyun+AC_DEFINE_UNQUOTED(API_VERSION, [$API_VERSION], [API version]) 81*4882a593Smuzhiyun+ 82*4882a593Smuzhiyun dnl === Coverage report ======================================================= 83*4882a593Smuzhiyun AC_PATH_PROG([GCOV], [lcov], [enable_gcov=no]) 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun@@ -130,6 +154,7 @@ echo " LibRest $VERSION" 86*4882a593Smuzhiyun echo " ================" 87*4882a593Smuzhiyun echo "" 88*4882a593Smuzhiyun echo " prefix: ${prefix}" 89*4882a593Smuzhiyun+echo " libsoup version: ${with_soup}" 90*4882a593Smuzhiyun echo "" 91*4882a593Smuzhiyun echo " Documentation: ${enable_gtk_doc}" 92*4882a593Smuzhiyun echo " Introspection data: ${enable_introspection}" 93*4882a593Smuzhiyundiff --git a/rest-extras.pc.in b/rest-extras.pc.in 94*4882a593Smuzhiyunindex 39f21bf..3723d6d 100644 95*4882a593Smuzhiyun--- a/rest-extras.pc.in 96*4882a593Smuzhiyun+++ b/rest-extras.pc.in 97*4882a593Smuzhiyun@@ -9,4 +9,4 @@ Description: RESTful web api query library 98*4882a593Smuzhiyun Version: @VERSION@ 99*4882a593Smuzhiyun Libs: -L${libdir} -lrest-extras-${apiversion} 100*4882a593Smuzhiyun Cflags: -I${includedir}/rest-${apiversion} 101*4882a593Smuzhiyun-Requires: glib-2.0 libsoup-2.4 libxml-2.0 102*4882a593Smuzhiyun+Requires: glib-2.0 libsoup-@SOUP_API_VERSION@ libxml-2.0 103*4882a593Smuzhiyundiff --git a/rest-extras/youtube-proxy.c b/rest-extras/youtube-proxy.c 104*4882a593Smuzhiyunindex be0cf08..cd598f4 100644 105*4882a593Smuzhiyun--- a/rest-extras/youtube-proxy.c 106*4882a593Smuzhiyun+++ b/rest-extras/youtube-proxy.c 107*4882a593Smuzhiyun@@ -246,6 +246,9 @@ typedef struct { 108*4882a593Smuzhiyun GObject *weak_object; 109*4882a593Smuzhiyun gpointer user_data; 110*4882a593Smuzhiyun gsize uploaded; 111*4882a593Smuzhiyun+#ifndef WITH_SOUP_2 112*4882a593Smuzhiyun+ GCancellable *cancellable; 113*4882a593Smuzhiyun+#endif 114*4882a593Smuzhiyun } YoutubeProxyUploadClosure; 115*4882a593Smuzhiyun 116*4882a593Smuzhiyun static void 117*4882a593Smuzhiyun@@ -255,7 +258,11 @@ _upload_async_weak_notify_cb (gpointer *data, 118*4882a593Smuzhiyun YoutubeProxyUploadClosure *closure = 119*4882a593Smuzhiyun (YoutubeProxyUploadClosure *) data; 120*4882a593Smuzhiyun 121*4882a593Smuzhiyun+#ifdef WITH_SOUP_2 122*4882a593Smuzhiyun _rest_proxy_cancel_message (REST_PROXY (closure->proxy), closure->message); 123*4882a593Smuzhiyun+#else 124*4882a593Smuzhiyun+ g_cancellable_cancel (closure->cancellable); 125*4882a593Smuzhiyun+#endif 126*4882a593Smuzhiyun } 127*4882a593Smuzhiyun 128*4882a593Smuzhiyun static void 129*4882a593Smuzhiyun@@ -267,6 +274,9 @@ _upload_async_closure_free (YoutubeProxyUploadClosure *closure) 130*4882a593Smuzhiyun closure); 131*4882a593Smuzhiyun 132*4882a593Smuzhiyun g_object_unref (closure->proxy); 133*4882a593Smuzhiyun+#ifndef WITH_SOUP_2 134*4882a593Smuzhiyun+ g_object_unref (closure->cancellable); 135*4882a593Smuzhiyun+#endif 136*4882a593Smuzhiyun 137*4882a593Smuzhiyun g_slice_free (YoutubeProxyUploadClosure, closure); 138*4882a593Smuzhiyun } 139*4882a593Smuzhiyun@@ -286,6 +296,9 @@ _upload_async_closure_new (YoutubeProxy *self, 140*4882a593Smuzhiyun closure->message = message; 141*4882a593Smuzhiyun closure->weak_object = weak_object; 142*4882a593Smuzhiyun closure->user_data = user_data; 143*4882a593Smuzhiyun+#ifndef WITH_SOUP_2 144*4882a593Smuzhiyun+ closure->cancellable = g_cancellable_new (); 145*4882a593Smuzhiyun+#endif 146*4882a593Smuzhiyun 147*4882a593Smuzhiyun if (weak_object != NULL) 148*4882a593Smuzhiyun g_object_weak_ref (weak_object, 149*4882a593Smuzhiyun@@ -295,41 +308,67 @@ _upload_async_closure_new (YoutubeProxy *self, 150*4882a593Smuzhiyun } 151*4882a593Smuzhiyun 152*4882a593Smuzhiyun static void 153*4882a593Smuzhiyun-_upload_completed_cb (SoupSession *session, 154*4882a593Smuzhiyun- SoupMessage *message, 155*4882a593Smuzhiyun+_upload_completed_cb (SoupMessage *message, 156*4882a593Smuzhiyun+ GBytes *payload, 157*4882a593Smuzhiyun+ GError *error, 158*4882a593Smuzhiyun gpointer user_data) 159*4882a593Smuzhiyun { 160*4882a593Smuzhiyun YoutubeProxyUploadClosure *closure = 161*4882a593Smuzhiyun (YoutubeProxyUploadClosure *) user_data; 162*4882a593Smuzhiyun- GError *error = NULL; 163*4882a593Smuzhiyun+ gsize length; 164*4882a593Smuzhiyun+ gconstpointer data; 165*4882a593Smuzhiyun+ guint status_code; 166*4882a593Smuzhiyun+ const char *reason_phrase; 167*4882a593Smuzhiyun 168*4882a593Smuzhiyun if (closure->callback == NULL) 169*4882a593Smuzhiyun return; 170*4882a593Smuzhiyun 171*4882a593Smuzhiyun- if (message->status_code < 200 || message->status_code >= 300) 172*4882a593Smuzhiyun- error = g_error_new_literal (REST_PROXY_ERROR, 173*4882a593Smuzhiyun- message->status_code, 174*4882a593Smuzhiyun- message->reason_phrase); 175*4882a593Smuzhiyun- 176*4882a593Smuzhiyun- closure->callback (closure->proxy, message->response_body->data, 177*4882a593Smuzhiyun- message->request_body->length, 178*4882a593Smuzhiyun- message->request_body->length, 179*4882a593Smuzhiyun+#ifdef WITH_SOUP_2 180*4882a593Smuzhiyun+ status_code = message->status_code; 181*4882a593Smuzhiyun+ reason_phrase = message->reason_phrase; 182*4882a593Smuzhiyun+#else 183*4882a593Smuzhiyun+ status_code = soup_message_get_status (message); 184*4882a593Smuzhiyun+ reason_phrase = soup_message_get_reason_phrase (message); 185*4882a593Smuzhiyun+#endif 186*4882a593Smuzhiyun+ 187*4882a593Smuzhiyun+ if (status_code < 200 || status_code >= 300) 188*4882a593Smuzhiyun+ { 189*4882a593Smuzhiyun+ g_clear_error (&error); 190*4882a593Smuzhiyun+ error = g_error_new_literal (REST_PROXY_ERROR, 191*4882a593Smuzhiyun+ status_code, 192*4882a593Smuzhiyun+ reason_phrase); 193*4882a593Smuzhiyun+ } 194*4882a593Smuzhiyun+ 195*4882a593Smuzhiyun+ data = g_bytes_get_data (payload, &length); 196*4882a593Smuzhiyun+ closure->callback (closure->proxy, data, length, length, 197*4882a593Smuzhiyun error, closure->weak_object, closure->user_data); 198*4882a593Smuzhiyun+ g_bytes_unref (payload); 199*4882a593Smuzhiyun 200*4882a593Smuzhiyun _upload_async_closure_free (closure); 201*4882a593Smuzhiyun } 202*4882a593Smuzhiyun 203*4882a593Smuzhiyun static void 204*4882a593Smuzhiyun _message_wrote_data_cb (SoupMessage *msg, 205*4882a593Smuzhiyun+#ifdef WITH_SOUP_2 206*4882a593Smuzhiyun SoupBuffer *chunk, 207*4882a593Smuzhiyun+#else 208*4882a593Smuzhiyun+ gsize chunk_size, 209*4882a593Smuzhiyun+#endif 210*4882a593Smuzhiyun YoutubeProxyUploadClosure *closure) 211*4882a593Smuzhiyun { 212*4882a593Smuzhiyun- closure->uploaded = closure->uploaded + chunk->length; 213*4882a593Smuzhiyun+#ifdef WITH_SOUP_2 214*4882a593Smuzhiyun+ gsize chunk_size = chunk->length; 215*4882a593Smuzhiyun+ goffset content_length = msg->request_body->length; 216*4882a593Smuzhiyun+#else 217*4882a593Smuzhiyun+ goffset content_length = soup_message_headers_get_content_length (soup_message_get_request_headers (msg)); 218*4882a593Smuzhiyun+#endif 219*4882a593Smuzhiyun+ 220*4882a593Smuzhiyun+ closure->uploaded = closure->uploaded + chunk_size; 221*4882a593Smuzhiyun 222*4882a593Smuzhiyun- if (closure->uploaded < msg->request_body->length) 223*4882a593Smuzhiyun+ if (closure->uploaded < content_length) 224*4882a593Smuzhiyun closure->callback (closure->proxy, 225*4882a593Smuzhiyun NULL, 226*4882a593Smuzhiyun- msg->request_body->length, 227*4882a593Smuzhiyun+ content_length, 228*4882a593Smuzhiyun closure->uploaded, 229*4882a593Smuzhiyun NULL, 230*4882a593Smuzhiyun closure->weak_object, 231*4882a593Smuzhiyun@@ -364,7 +403,12 @@ youtube_proxy_upload_async (YoutubeProxy *self, 232*4882a593Smuzhiyun SoupMultipart *mp; 233*4882a593Smuzhiyun SoupMessage *message; 234*4882a593Smuzhiyun SoupMessageHeaders *part_headers; 235*4882a593Smuzhiyun+ SoupMessageHeaders *request_headers; 236*4882a593Smuzhiyun+#ifdef WITH_SOUP_2 237*4882a593Smuzhiyun SoupBuffer *sb; 238*4882a593Smuzhiyun+#else 239*4882a593Smuzhiyun+ GBytes *sb; 240*4882a593Smuzhiyun+#endif 241*4882a593Smuzhiyun gchar *content_type; 242*4882a593Smuzhiyun gchar *atom_xml; 243*4882a593Smuzhiyun GMappedFile *map; 244*4882a593Smuzhiyun@@ -380,10 +424,17 @@ youtube_proxy_upload_async (YoutubeProxy *self, 245*4882a593Smuzhiyun 246*4882a593Smuzhiyun atom_xml = _construct_upload_atom_xml (fields, incomplete); 247*4882a593Smuzhiyun 248*4882a593Smuzhiyun+#ifdef WITH_SOUP_2 249*4882a593Smuzhiyun sb = soup_buffer_new_with_owner (atom_xml, 250*4882a593Smuzhiyun strlen(atom_xml), 251*4882a593Smuzhiyun atom_xml, 252*4882a593Smuzhiyun (GDestroyNotify) g_free); 253*4882a593Smuzhiyun+#else 254*4882a593Smuzhiyun+ sb = g_bytes_new_with_free_func (atom_xml, 255*4882a593Smuzhiyun+ strlen (atom_xml), 256*4882a593Smuzhiyun+ (GDestroyNotify) g_free, 257*4882a593Smuzhiyun+ atom_xml); 258*4882a593Smuzhiyun+#endif 259*4882a593Smuzhiyun 260*4882a593Smuzhiyun part_headers = soup_message_headers_new (SOUP_MESSAGE_HEADERS_MULTIPART); 261*4882a593Smuzhiyun 262*4882a593Smuzhiyun@@ -393,7 +444,11 @@ youtube_proxy_upload_async (YoutubeProxy *self, 263*4882a593Smuzhiyun 264*4882a593Smuzhiyun soup_multipart_append_part (mp, part_headers, sb); 265*4882a593Smuzhiyun 266*4882a593Smuzhiyun+#ifdef WITH_SOUP_2 267*4882a593Smuzhiyun soup_buffer_free (sb); 268*4882a593Smuzhiyun+#else 269*4882a593Smuzhiyun+ g_bytes_unref (sb); 270*4882a593Smuzhiyun+#endif 271*4882a593Smuzhiyun 272*4882a593Smuzhiyun content_type = g_content_type_guess ( 273*4882a593Smuzhiyun filename, 274*4882a593Smuzhiyun@@ -401,24 +456,37 @@ youtube_proxy_upload_async (YoutubeProxy *self, 275*4882a593Smuzhiyun g_mapped_file_get_length (map), 276*4882a593Smuzhiyun NULL); 277*4882a593Smuzhiyun 278*4882a593Smuzhiyun+#ifdef WITH_SOUP_2 279*4882a593Smuzhiyun sb = soup_buffer_new_with_owner (g_mapped_file_get_contents (map), 280*4882a593Smuzhiyun g_mapped_file_get_length (map), 281*4882a593Smuzhiyun map, 282*4882a593Smuzhiyun (GDestroyNotify) g_mapped_file_unref); 283*4882a593Smuzhiyun+#else 284*4882a593Smuzhiyun+ sb = g_bytes_new_with_free_func (g_mapped_file_get_contents (map), 285*4882a593Smuzhiyun+ g_mapped_file_get_length (map), 286*4882a593Smuzhiyun+ (GDestroyNotify) g_mapped_file_unref, 287*4882a593Smuzhiyun+ map); 288*4882a593Smuzhiyun+#endif 289*4882a593Smuzhiyun 290*4882a593Smuzhiyun soup_message_headers_replace (part_headers, "Content-Type", content_type); 291*4882a593Smuzhiyun 292*4882a593Smuzhiyun soup_multipart_append_part (mp, part_headers, sb); 293*4882a593Smuzhiyun 294*4882a593Smuzhiyun+#ifdef WITH_SOUP_2 295*4882a593Smuzhiyun soup_buffer_free (sb); 296*4882a593Smuzhiyun- 297*4882a593Smuzhiyun soup_message_headers_free (part_headers); 298*4882a593Smuzhiyun- 299*4882a593Smuzhiyun message = soup_form_request_new_from_multipart (UPLOAD_URL, mp); 300*4882a593Smuzhiyun+ request_headers = message->request_headers; 301*4882a593Smuzhiyun+#else 302*4882a593Smuzhiyun+ g_bytes_unref (sb); 303*4882a593Smuzhiyun+ soup_message_headers_unref (part_headers); 304*4882a593Smuzhiyun+ message = soup_message_new_from_multipart (UPLOAD_URL, mp); 305*4882a593Smuzhiyun+ request_headers = soup_message_get_request_headers (message); 306*4882a593Smuzhiyun+#endif 307*4882a593Smuzhiyun 308*4882a593Smuzhiyun soup_multipart_free (mp); 309*4882a593Smuzhiyun 310*4882a593Smuzhiyun- _set_upload_headers (self, message->request_headers, filename); 311*4882a593Smuzhiyun+ _set_upload_headers (self, request_headers, filename); 312*4882a593Smuzhiyun 313*4882a593Smuzhiyun closure = _upload_async_closure_new (self, callback, message, weak_object, 314*4882a593Smuzhiyun user_data); 315*4882a593Smuzhiyun@@ -429,7 +497,13 @@ youtube_proxy_upload_async (YoutubeProxy *self, 316*4882a593Smuzhiyun closure); 317*4882a593Smuzhiyun 318*4882a593Smuzhiyun 319*4882a593Smuzhiyun- _rest_proxy_queue_message (REST_PROXY (self), message, _upload_completed_cb, 320*4882a593Smuzhiyun+ _rest_proxy_queue_message (REST_PROXY (self), message, 321*4882a593Smuzhiyun+#ifdef WITH_SOUP_2 322*4882a593Smuzhiyun+ NULL, 323*4882a593Smuzhiyun+#else 324*4882a593Smuzhiyun+ closure->cancellable, 325*4882a593Smuzhiyun+#endif 326*4882a593Smuzhiyun+ _upload_completed_cb, 327*4882a593Smuzhiyun closure); 328*4882a593Smuzhiyun 329*4882a593Smuzhiyun return TRUE; 330*4882a593Smuzhiyundiff --git a/rest.pc.in b/rest.pc.in 331*4882a593Smuzhiyunindex 94c384b..e6bae3e 100644 332*4882a593Smuzhiyun--- a/rest.pc.in 333*4882a593Smuzhiyun+++ b/rest.pc.in 334*4882a593Smuzhiyun@@ -9,4 +9,4 @@ Description: RESTful web api query library 335*4882a593Smuzhiyun Version: @VERSION@ 336*4882a593Smuzhiyun Libs: -L${libdir} -lrest-${apiversion} 337*4882a593Smuzhiyun Cflags: -I${includedir}/rest-${apiversion} 338*4882a593Smuzhiyun-Requires: glib-2.0 libsoup-2.4 libxml-2.0 339*4882a593Smuzhiyun+Requires: glib-2.0 libsoup-@SOUP_API_VERSION@ libxml-2.0 340*4882a593Smuzhiyundiff --git a/rest/rest-private.h b/rest/rest-private.h 341*4882a593Smuzhiyunindex 9e91fa0..6e71322 100644 342*4882a593Smuzhiyun--- a/rest/rest-private.h 343*4882a593Smuzhiyun+++ b/rest/rest-private.h 344*4882a593Smuzhiyun@@ -31,6 +31,11 @@ 345*4882a593Smuzhiyun 346*4882a593Smuzhiyun G_BEGIN_DECLS 347*4882a593Smuzhiyun 348*4882a593Smuzhiyun+typedef void (*RestMessageFinishedCallback) (SoupMessage *msg, 349*4882a593Smuzhiyun+ GBytes *body, 350*4882a593Smuzhiyun+ GError *error, 351*4882a593Smuzhiyun+ gpointer user_data); 352*4882a593Smuzhiyun+ 353*4882a593Smuzhiyun typedef enum 354*4882a593Smuzhiyun { 355*4882a593Smuzhiyun REST_DEBUG_XML_PARSER = 1 << 0, 356*4882a593Smuzhiyun@@ -53,12 +58,23 @@ gboolean _rest_proxy_get_binding_required (RestProxy *proxy); 357*4882a593Smuzhiyun const gchar *_rest_proxy_get_bound_url (RestProxy *proxy); 358*4882a593Smuzhiyun void _rest_proxy_queue_message (RestProxy *proxy, 359*4882a593Smuzhiyun SoupMessage *message, 360*4882a593Smuzhiyun- SoupSessionCallback callback, 361*4882a593Smuzhiyun+ GCancellable *cancellable, 362*4882a593Smuzhiyun+ RestMessageFinishedCallback callback, 363*4882a593Smuzhiyun gpointer user_data); 364*4882a593Smuzhiyun void _rest_proxy_cancel_message (RestProxy *proxy, 365*4882a593Smuzhiyun SoupMessage *message); 366*4882a593Smuzhiyun-guint _rest_proxy_send_message (RestProxy *proxy, 367*4882a593Smuzhiyun- SoupMessage *message); 368*4882a593Smuzhiyun+GBytes *_rest_proxy_send_message (RestProxy *proxy, 369*4882a593Smuzhiyun+ SoupMessage *message, 370*4882a593Smuzhiyun+ GCancellable *cancellable, 371*4882a593Smuzhiyun+ GError **error); 372*4882a593Smuzhiyun+void _rest_proxy_send_message_async (RestProxy *proxy, 373*4882a593Smuzhiyun+ SoupMessage *message, 374*4882a593Smuzhiyun+ GCancellable *cancellable, 375*4882a593Smuzhiyun+ GAsyncReadyCallback callback, 376*4882a593Smuzhiyun+ gpointer user_data); 377*4882a593Smuzhiyun+GInputStream *_rest_proxy_send_message_finish (RestProxy *proxy, 378*4882a593Smuzhiyun+ GAsyncResult *result, 379*4882a593Smuzhiyun+ GError **error); 380*4882a593Smuzhiyun 381*4882a593Smuzhiyun RestXmlNode *_rest_xml_node_new (void); 382*4882a593Smuzhiyun void _rest_xml_node_reverse_children_siblings (RestXmlNode *node); 383*4882a593Smuzhiyundiff --git a/rest/rest-proxy-auth.c b/rest/rest-proxy-auth.c 384*4882a593Smuzhiyunindex b96e443..0b2ec9f 100644 385*4882a593Smuzhiyun--- a/rest/rest-proxy-auth.c 386*4882a593Smuzhiyun+++ b/rest/rest-proxy-auth.c 387*4882a593Smuzhiyun@@ -29,7 +29,9 @@ 388*4882a593Smuzhiyun struct _RestProxyAuthPrivate { 389*4882a593Smuzhiyun /* used to hold state during async authentication */ 390*4882a593Smuzhiyun RestProxy *proxy; 391*4882a593Smuzhiyun+#ifdef WITH_SOUP_2 392*4882a593Smuzhiyun SoupSession *session; 393*4882a593Smuzhiyun+#endif 394*4882a593Smuzhiyun SoupMessage *message; 395*4882a593Smuzhiyun SoupAuth *auth; 396*4882a593Smuzhiyun gboolean paused; 397*4882a593Smuzhiyun@@ -43,7 +45,9 @@ rest_proxy_auth_dispose (GObject *object) 398*4882a593Smuzhiyun RestProxyAuthPrivate *priv = ((RestProxyAuth*)object)->priv; 399*4882a593Smuzhiyun 400*4882a593Smuzhiyun g_clear_object (&priv->proxy); 401*4882a593Smuzhiyun+#ifdef WITH_SOUP_2 402*4882a593Smuzhiyun g_clear_object (&priv->session); 403*4882a593Smuzhiyun+#endif 404*4882a593Smuzhiyun g_clear_object (&priv->message); 405*4882a593Smuzhiyun g_clear_object (&priv->auth); 406*4882a593Smuzhiyun 407*4882a593Smuzhiyun@@ -73,13 +77,17 @@ rest_proxy_auth_new (RestProxy *proxy, 408*4882a593Smuzhiyun RestProxyAuth *rest_auth; 409*4882a593Smuzhiyun 410*4882a593Smuzhiyun g_return_val_if_fail (REST_IS_PROXY (proxy), NULL); 411*4882a593Smuzhiyun+#ifdef WITH_SOUP_2 412*4882a593Smuzhiyun g_return_val_if_fail (SOUP_IS_SESSION (session), NULL); 413*4882a593Smuzhiyun+#endif 414*4882a593Smuzhiyun g_return_val_if_fail (SOUP_IS_MESSAGE (message), NULL); 415*4882a593Smuzhiyun g_return_val_if_fail (SOUP_IS_AUTH (soup_auth), NULL); 416*4882a593Smuzhiyun 417*4882a593Smuzhiyun rest_auth = REST_PROXY_AUTH (g_object_new (REST_TYPE_PROXY_AUTH, NULL)); 418*4882a593Smuzhiyun rest_auth->priv->proxy = g_object_ref(proxy); 419*4882a593Smuzhiyun+#ifdef WITH_SOUP_2 420*4882a593Smuzhiyun rest_auth->priv->session = g_object_ref(session); 421*4882a593Smuzhiyun+#endif 422*4882a593Smuzhiyun rest_auth->priv->message = g_object_ref(message); 423*4882a593Smuzhiyun rest_auth->priv->auth = g_object_ref(soup_auth); 424*4882a593Smuzhiyun 425*4882a593Smuzhiyun@@ -104,7 +112,9 @@ rest_proxy_auth_pause (RestProxyAuth *auth) 426*4882a593Smuzhiyun return; 427*4882a593Smuzhiyun 428*4882a593Smuzhiyun auth->priv->paused = TRUE; 429*4882a593Smuzhiyun+#ifdef WITH_SOUP_2 430*4882a593Smuzhiyun soup_session_pause_message (auth->priv->session, auth->priv->message); 431*4882a593Smuzhiyun+#endif 432*4882a593Smuzhiyun } 433*4882a593Smuzhiyun 434*4882a593Smuzhiyun /** 435*4882a593Smuzhiyun@@ -128,7 +138,9 @@ rest_proxy_auth_unpause (RestProxyAuth *auth) 436*4882a593Smuzhiyun soup_auth_authenticate (auth->priv->auth, username, password); 437*4882a593Smuzhiyun g_free (username); 438*4882a593Smuzhiyun g_free (password); 439*4882a593Smuzhiyun+#ifdef WITH_SOUP_2 440*4882a593Smuzhiyun soup_session_unpause_message (auth->priv->session, auth->priv->message); 441*4882a593Smuzhiyun+#endif 442*4882a593Smuzhiyun auth->priv->paused = FALSE; 443*4882a593Smuzhiyun } 444*4882a593Smuzhiyun 445*4882a593Smuzhiyun@@ -146,7 +158,11 @@ rest_proxy_auth_cancel (RestProxyAuth *auth) 446*4882a593Smuzhiyun { 447*4882a593Smuzhiyun g_return_if_fail (REST_IS_PROXY_AUTH (auth)); 448*4882a593Smuzhiyun 449*4882a593Smuzhiyun+#ifdef WITH_SOUP_2 450*4882a593Smuzhiyun soup_session_cancel_message (auth->priv->session, auth->priv->message, SOUP_STATUS_CANCELLED); 451*4882a593Smuzhiyun+#else 452*4882a593Smuzhiyun+ soup_auth_cancel (auth->priv->auth); 453*4882a593Smuzhiyun+#endif 454*4882a593Smuzhiyun } 455*4882a593Smuzhiyun 456*4882a593Smuzhiyun G_GNUC_INTERNAL gboolean rest_proxy_auth_is_paused (RestProxyAuth *auth) 457*4882a593Smuzhiyundiff --git a/rest/rest-proxy-call.c b/rest/rest-proxy-call.c 458*4882a593Smuzhiyunindex 2ab722f..62b00da 100644 459*4882a593Smuzhiyun--- a/rest/rest-proxy-call.c 460*4882a593Smuzhiyun+++ b/rest/rest-proxy-call.c 461*4882a593Smuzhiyun@@ -20,12 +20,14 @@ 462*4882a593Smuzhiyun * 463*4882a593Smuzhiyun */ 464*4882a593Smuzhiyun 465*4882a593Smuzhiyun+#include <config.h> 466*4882a593Smuzhiyun #include <rest/rest-proxy.h> 467*4882a593Smuzhiyun #include <rest/rest-proxy-call.h> 468*4882a593Smuzhiyun #include <rest/rest-params.h> 469*4882a593Smuzhiyun #include <libsoup/soup.h> 470*4882a593Smuzhiyun 471*4882a593Smuzhiyun #include "rest-private.h" 472*4882a593Smuzhiyun+#include "rest-proxy-auth-private.h" 473*4882a593Smuzhiyun #include "rest-proxy-call-private.h" 474*4882a593Smuzhiyun 475*4882a593Smuzhiyun 476*4882a593Smuzhiyun@@ -38,12 +40,15 @@ struct _RestProxyCallAsyncClosure { 477*4882a593Smuzhiyun }; 478*4882a593Smuzhiyun typedef struct _RestProxyCallAsyncClosure RestProxyCallAsyncClosure; 479*4882a593Smuzhiyun 480*4882a593Smuzhiyun+#define READ_BUFFER_SIZE 8192 481*4882a593Smuzhiyun+ 482*4882a593Smuzhiyun struct _RestProxyCallContinuousClosure { 483*4882a593Smuzhiyun RestProxyCall *call; 484*4882a593Smuzhiyun RestProxyCallContinuousCallback callback; 485*4882a593Smuzhiyun GObject *weak_object; 486*4882a593Smuzhiyun gpointer userdata; 487*4882a593Smuzhiyun SoupMessage *message; 488*4882a593Smuzhiyun+ guchar buffer[READ_BUFFER_SIZE]; 489*4882a593Smuzhiyun }; 490*4882a593Smuzhiyun typedef struct _RestProxyCallContinuousClosure RestProxyCallContinuousClosure; 491*4882a593Smuzhiyun 492*4882a593Smuzhiyun@@ -70,8 +75,7 @@ struct _RestProxyCallPrivate { 493*4882a593Smuzhiyun gchar *url; 494*4882a593Smuzhiyun 495*4882a593Smuzhiyun GHashTable *response_headers; 496*4882a593Smuzhiyun- goffset length; 497*4882a593Smuzhiyun- gchar *payload; 498*4882a593Smuzhiyun+ GBytes *payload; 499*4882a593Smuzhiyun guint status_code; 500*4882a593Smuzhiyun gchar *status_message; 501*4882a593Smuzhiyun 502*4882a593Smuzhiyun@@ -160,7 +164,7 @@ rest_proxy_call_finalize (GObject *object) 503*4882a593Smuzhiyun g_free (priv->method); 504*4882a593Smuzhiyun g_free (priv->function); 505*4882a593Smuzhiyun 506*4882a593Smuzhiyun- g_free (priv->payload); 507*4882a593Smuzhiyun+ g_clear_pointer (&priv->payload, g_bytes_unref); 508*4882a593Smuzhiyun g_free (priv->status_message); 509*4882a593Smuzhiyun 510*4882a593Smuzhiyun g_free (priv->url); 511*4882a593Smuzhiyun@@ -546,14 +550,23 @@ _populate_headers_hash_table (const gchar *name, 512*4882a593Smuzhiyun g_hash_table_insert (headers, g_strdup (name), g_strdup (value)); 513*4882a593Smuzhiyun } 514*4882a593Smuzhiyun 515*4882a593Smuzhiyun+#ifdef WITH_SOUP_2 516*4882a593Smuzhiyun /* I apologise for this macro, but it saves typing ;-) */ 517*4882a593Smuzhiyun #define error_helper(x) g_set_error_literal(error, REST_PROXY_ERROR, x, message->reason_phrase) 518*4882a593Smuzhiyun+#endif 519*4882a593Smuzhiyun static gboolean 520*4882a593Smuzhiyun _handle_error_from_message (SoupMessage *message, GError **error) 521*4882a593Smuzhiyun { 522*4882a593Smuzhiyun- if (message->status_code < 100) 523*4882a593Smuzhiyun+ guint status_code; 524*4882a593Smuzhiyun+ const char *reason_phrase; 525*4882a593Smuzhiyun+ 526*4882a593Smuzhiyun+#ifdef WITH_SOUP_2 527*4882a593Smuzhiyun+ status_code = message->status_code; 528*4882a593Smuzhiyun+ 529*4882a593Smuzhiyun+ if (status_code < 100) 530*4882a593Smuzhiyun { 531*4882a593Smuzhiyun- switch (message->status_code) 532*4882a593Smuzhiyun+ g_clear_error (error); 533*4882a593Smuzhiyun+ switch (status_code) 534*4882a593Smuzhiyun { 535*4882a593Smuzhiyun case SOUP_STATUS_CANCELLED: 536*4882a593Smuzhiyun error_helper (REST_PROXY_ERROR_CANCELLED); 537*4882a593Smuzhiyun@@ -580,61 +593,84 @@ _handle_error_from_message (SoupMessage *message, GError **error) 538*4882a593Smuzhiyun } 539*4882a593Smuzhiyun return FALSE; 540*4882a593Smuzhiyun } 541*4882a593Smuzhiyun+ reason_phrase = message->reason_phrase; 542*4882a593Smuzhiyun+#else 543*4882a593Smuzhiyun+ status_code = soup_message_get_status (message); 544*4882a593Smuzhiyun+ reason_phrase = soup_message_get_reason_phrase (message); 545*4882a593Smuzhiyun+#endif 546*4882a593Smuzhiyun 547*4882a593Smuzhiyun- if (message->status_code >= 200 && message->status_code < 300) 548*4882a593Smuzhiyun+ if (status_code >= 200 && status_code < 300) 549*4882a593Smuzhiyun { 550*4882a593Smuzhiyun return TRUE; 551*4882a593Smuzhiyun } 552*4882a593Smuzhiyun 553*4882a593Smuzhiyun+ if (*error != NULL) 554*4882a593Smuzhiyun+ return FALSE; 555*4882a593Smuzhiyun+ 556*4882a593Smuzhiyun /* If we are here we must be in some kind of HTTP error, lets try */ 557*4882a593Smuzhiyun g_set_error_literal (error, 558*4882a593Smuzhiyun REST_PROXY_ERROR, 559*4882a593Smuzhiyun- message->status_code, 560*4882a593Smuzhiyun- message->reason_phrase); 561*4882a593Smuzhiyun+ status_code, 562*4882a593Smuzhiyun+ reason_phrase); 563*4882a593Smuzhiyun return FALSE; 564*4882a593Smuzhiyun } 565*4882a593Smuzhiyun 566*4882a593Smuzhiyun static gboolean 567*4882a593Smuzhiyun-finish_call (RestProxyCall *call, SoupMessage *message, GError **error) 568*4882a593Smuzhiyun+finish_call (RestProxyCall *call, SoupMessage *message, GBytes *payload, GError **error) 569*4882a593Smuzhiyun { 570*4882a593Smuzhiyun RestProxyCallPrivate *priv = GET_PRIVATE (call); 571*4882a593Smuzhiyun+ SoupMessageHeaders *response_headers; 572*4882a593Smuzhiyun 573*4882a593Smuzhiyun g_assert (call); 574*4882a593Smuzhiyun g_assert (message); 575*4882a593Smuzhiyun+ g_assert (payload); 576*4882a593Smuzhiyun+ 577*4882a593Smuzhiyun+#ifdef WITH_SOUP_2 578*4882a593Smuzhiyun+ response_headers = message->response_headers; 579*4882a593Smuzhiyun+#else 580*4882a593Smuzhiyun+ response_headers = soup_message_get_response_headers (message); 581*4882a593Smuzhiyun+#endif 582*4882a593Smuzhiyun 583*4882a593Smuzhiyun /* Convert the soup headers in to hash */ 584*4882a593Smuzhiyun /* FIXME: Eeek..are you allowed duplicate headers? ... */ 585*4882a593Smuzhiyun g_hash_table_remove_all (priv->response_headers); 586*4882a593Smuzhiyun- soup_message_headers_foreach (message->response_headers, 587*4882a593Smuzhiyun+ soup_message_headers_foreach (response_headers, 588*4882a593Smuzhiyun (SoupMessageHeadersForeachFunc)_populate_headers_hash_table, 589*4882a593Smuzhiyun priv->response_headers); 590*4882a593Smuzhiyun 591*4882a593Smuzhiyun- priv->payload = g_memdup (message->response_body->data, 592*4882a593Smuzhiyun- message->response_body->length + 1); 593*4882a593Smuzhiyun- priv->length = message->response_body->length; 594*4882a593Smuzhiyun+ priv->payload = payload; 595*4882a593Smuzhiyun 596*4882a593Smuzhiyun+#ifdef WITH_SOUP_2 597*4882a593Smuzhiyun priv->status_code = message->status_code; 598*4882a593Smuzhiyun priv->status_message = g_strdup (message->reason_phrase); 599*4882a593Smuzhiyun+#else 600*4882a593Smuzhiyun+ priv->status_code = soup_message_get_status (message); 601*4882a593Smuzhiyun+ priv->status_message = g_strdup (soup_message_get_reason_phrase (message)); 602*4882a593Smuzhiyun+#endif 603*4882a593Smuzhiyun 604*4882a593Smuzhiyun return _handle_error_from_message (message, error); 605*4882a593Smuzhiyun } 606*4882a593Smuzhiyun 607*4882a593Smuzhiyun static void 608*4882a593Smuzhiyun-_continuous_call_message_completed_cb (SoupSession *session, 609*4882a593Smuzhiyun- SoupMessage *message, 610*4882a593Smuzhiyun- gpointer userdata) 611*4882a593Smuzhiyun+_continuous_call_message_completed (SoupMessage *message, 612*4882a593Smuzhiyun+ GError *error, 613*4882a593Smuzhiyun+ gpointer userdata) 614*4882a593Smuzhiyun { 615*4882a593Smuzhiyun RestProxyCallContinuousClosure *closure; 616*4882a593Smuzhiyun RestProxyCall *call; 617*4882a593Smuzhiyun RestProxyCallPrivate *priv; 618*4882a593Smuzhiyun- GError *error = NULL; 619*4882a593Smuzhiyun 620*4882a593Smuzhiyun closure = (RestProxyCallContinuousClosure *)userdata; 621*4882a593Smuzhiyun call = closure->call; 622*4882a593Smuzhiyun priv = GET_PRIVATE (call); 623*4882a593Smuzhiyun 624*4882a593Smuzhiyun+#ifdef WITH_SOUP_2 625*4882a593Smuzhiyun priv->status_code = message->status_code; 626*4882a593Smuzhiyun priv->status_message = g_strdup (message->reason_phrase); 627*4882a593Smuzhiyun+#else 628*4882a593Smuzhiyun+ priv->status_code = soup_message_get_status (message); 629*4882a593Smuzhiyun+ priv->status_message = g_strdup (soup_message_get_reason_phrase (message)); 630*4882a593Smuzhiyun+#endif 631*4882a593Smuzhiyun 632*4882a593Smuzhiyun _handle_error_from_message (message, &error); 633*4882a593Smuzhiyun 634*4882a593Smuzhiyun@@ -657,6 +693,7 @@ _continuous_call_message_completed_cb (SoupSession *session, 635*4882a593Smuzhiyun 636*4882a593Smuzhiyun priv->cur_call_closure = NULL; 637*4882a593Smuzhiyun g_object_unref (closure->call); 638*4882a593Smuzhiyun+ g_object_unref (message); 639*4882a593Smuzhiyun g_slice_free (RestProxyCallContinuousClosure, closure); 640*4882a593Smuzhiyun } 641*4882a593Smuzhiyun 642*4882a593Smuzhiyun@@ -715,6 +752,49 @@ set_url (RestProxyCall *call) 643*4882a593Smuzhiyun return TRUE; 644*4882a593Smuzhiyun } 645*4882a593Smuzhiyun 646*4882a593Smuzhiyun+#ifndef WITH_SOUP_2 647*4882a593Smuzhiyun+static gboolean 648*4882a593Smuzhiyun+authenticate (RestProxyCall *call, 649*4882a593Smuzhiyun+ SoupAuth *soup_auth, 650*4882a593Smuzhiyun+ gboolean retrying, 651*4882a593Smuzhiyun+ SoupMessage *message) 652*4882a593Smuzhiyun+{ 653*4882a593Smuzhiyun+ RestProxyCallPrivate *priv = GET_PRIVATE (call); 654*4882a593Smuzhiyun+ RestProxyAuth *rest_auth; 655*4882a593Smuzhiyun+ gboolean try_auth; 656*4882a593Smuzhiyun+ 657*4882a593Smuzhiyun+ rest_auth = rest_proxy_auth_new (priv->proxy, NULL, message, soup_auth); 658*4882a593Smuzhiyun+ g_signal_emit_by_name (priv->proxy, "authenticate", rest_auth, retrying, &try_auth); 659*4882a593Smuzhiyun+ if (try_auth && !rest_proxy_auth_is_paused (rest_auth)) { 660*4882a593Smuzhiyun+ char *username, *password; 661*4882a593Smuzhiyun+ 662*4882a593Smuzhiyun+ g_object_get (priv->proxy, "username", &username, "password", &password, NULL); 663*4882a593Smuzhiyun+ soup_auth_authenticate (soup_auth, username, password); 664*4882a593Smuzhiyun+ g_free (username); 665*4882a593Smuzhiyun+ g_free (password); 666*4882a593Smuzhiyun+ } 667*4882a593Smuzhiyun+ g_object_unref (rest_auth); 668*4882a593Smuzhiyun+ 669*4882a593Smuzhiyun+ return try_auth; 670*4882a593Smuzhiyun+} 671*4882a593Smuzhiyun+ 672*4882a593Smuzhiyun+static gboolean 673*4882a593Smuzhiyun+accept_certificate (RestProxyCall *call, 674*4882a593Smuzhiyun+ GTlsCertificate *tls_certificate, 675*4882a593Smuzhiyun+ GTlsCertificateFlags *tls_errors, 676*4882a593Smuzhiyun+ SoupMessage *message) 677*4882a593Smuzhiyun+{ 678*4882a593Smuzhiyun+ RestProxyCallPrivate *priv = GET_PRIVATE (call); 679*4882a593Smuzhiyun+ gboolean ssl_strict; 680*4882a593Smuzhiyun+ 681*4882a593Smuzhiyun+ if (tls_errors == 0) 682*4882a593Smuzhiyun+ return TRUE; 683*4882a593Smuzhiyun+ 684*4882a593Smuzhiyun+ g_object_get (priv->proxy, "ssl-strict", &ssl_strict, NULL); 685*4882a593Smuzhiyun+ return !ssl_strict; 686*4882a593Smuzhiyun+} 687*4882a593Smuzhiyun+#endif 688*4882a593Smuzhiyun+ 689*4882a593Smuzhiyun static SoupMessage * 690*4882a593Smuzhiyun prepare_message (RestProxyCall *call, GError **error_out) 691*4882a593Smuzhiyun { 692*4882a593Smuzhiyun@@ -722,6 +802,7 @@ prepare_message (RestProxyCall *call, GError **error_out) 693*4882a593Smuzhiyun RestProxyCallClass *call_class; 694*4882a593Smuzhiyun const gchar *user_agent; 695*4882a593Smuzhiyun SoupMessage *message; 696*4882a593Smuzhiyun+ SoupMessageHeaders *request_headers; 697*4882a593Smuzhiyun GError *error = NULL; 698*4882a593Smuzhiyun 699*4882a593Smuzhiyun call_class = REST_PROXY_CALL_GET_CLASS (call); 700*4882a593Smuzhiyun@@ -748,6 +829,9 @@ prepare_message (RestProxyCall *call, GError **error_out) 701*4882a593Smuzhiyun gchar *content; 702*4882a593Smuzhiyun gchar *content_type; 703*4882a593Smuzhiyun gsize content_len; 704*4882a593Smuzhiyun+#ifndef WITH_SOUP_2 705*4882a593Smuzhiyun+ GBytes *body; 706*4882a593Smuzhiyun+#endif 707*4882a593Smuzhiyun 708*4882a593Smuzhiyun if (!call_class->serialize_params (call, &content_type, 709*4882a593Smuzhiyun &content, &content_len, &error)) 710*4882a593Smuzhiyun@@ -780,8 +864,14 @@ prepare_message (RestProxyCall *call, GError **error_out) 711*4882a593Smuzhiyun "Could not parse URI"); 712*4882a593Smuzhiyun return NULL; 713*4882a593Smuzhiyun } 714*4882a593Smuzhiyun+#ifdef WITH_SOUP_2 715*4882a593Smuzhiyun soup_message_set_request (message, content_type, 716*4882a593Smuzhiyun SOUP_MEMORY_TAKE, content, content_len); 717*4882a593Smuzhiyun+#else 718*4882a593Smuzhiyun+ body = g_bytes_new_take (content, content_len); 719*4882a593Smuzhiyun+ soup_message_set_request_body_from_bytes (message, content_type, body); 720*4882a593Smuzhiyun+ g_bytes_unref (body); 721*4882a593Smuzhiyun+#endif 722*4882a593Smuzhiyun 723*4882a593Smuzhiyun g_free (content_type); 724*4882a593Smuzhiyun } else if (rest_params_are_strings (priv->params)) { 725*4882a593Smuzhiyun@@ -798,9 +888,15 @@ prepare_message (RestProxyCall *call, GError **error_out) 726*4882a593Smuzhiyun 727*4882a593Smuzhiyun hash = rest_params_as_string_hash_table (priv->params); 728*4882a593Smuzhiyun 729*4882a593Smuzhiyun+#ifdef WITH_SOUP_2 730*4882a593Smuzhiyun message = soup_form_request_new_from_hash (priv->method, 731*4882a593Smuzhiyun priv->url, 732*4882a593Smuzhiyun hash); 733*4882a593Smuzhiyun+#else 734*4882a593Smuzhiyun+ message = soup_message_new_from_encoded_form (priv->method, 735*4882a593Smuzhiyun+ priv->url, 736*4882a593Smuzhiyun+ soup_form_encode_hash (hash)); 737*4882a593Smuzhiyun+#endif 738*4882a593Smuzhiyun 739*4882a593Smuzhiyun g_hash_table_unref (hash); 740*4882a593Smuzhiyun 741*4882a593Smuzhiyun@@ -827,19 +923,28 @@ prepare_message (RestProxyCall *call, GError **error_out) 742*4882a593Smuzhiyun if (rest_param_is_string (param)) { 743*4882a593Smuzhiyun soup_multipart_append_form_string (mp, name, rest_param_get_content (param)); 744*4882a593Smuzhiyun } else { 745*4882a593Smuzhiyun- SoupBuffer *sb; 746*4882a593Smuzhiyun- 747*4882a593Smuzhiyun- sb = soup_buffer_new_with_owner (rest_param_get_content (param), 748*4882a593Smuzhiyun- rest_param_get_content_length (param), 749*4882a593Smuzhiyun- rest_param_ref (param), 750*4882a593Smuzhiyun- (GDestroyNotify)rest_param_unref); 751*4882a593Smuzhiyun+#ifdef WITH_SOUP_2 752*4882a593Smuzhiyun+ SoupBuffer *sb = soup_buffer_new_with_owner (rest_param_get_content (param), 753*4882a593Smuzhiyun+ rest_param_get_content_length (param), 754*4882a593Smuzhiyun+ rest_param_ref (param), 755*4882a593Smuzhiyun+ (GDestroyNotify)rest_param_unref); 756*4882a593Smuzhiyun+#else 757*4882a593Smuzhiyun+ GBytes *sb = g_bytes_new_with_free_func (rest_param_get_content (param), 758*4882a593Smuzhiyun+ rest_param_get_content_length (param), 759*4882a593Smuzhiyun+ (GDestroyNotify)rest_param_unref, 760*4882a593Smuzhiyun+ rest_param_ref (param)); 761*4882a593Smuzhiyun+#endif 762*4882a593Smuzhiyun 763*4882a593Smuzhiyun soup_multipart_append_form_file (mp, name, 764*4882a593Smuzhiyun rest_param_get_file_name (param), 765*4882a593Smuzhiyun rest_param_get_content_type (param), 766*4882a593Smuzhiyun sb); 767*4882a593Smuzhiyun 768*4882a593Smuzhiyun+#ifdef WITH_SOUP_2 769*4882a593Smuzhiyun soup_buffer_free (sb); 770*4882a593Smuzhiyun+#else 771*4882a593Smuzhiyun+ g_bytes_unref (sb); 772*4882a593Smuzhiyun+#endif 773*4882a593Smuzhiyun } 774*4882a593Smuzhiyun } 775*4882a593Smuzhiyun 776*4882a593Smuzhiyun@@ -853,19 +958,36 @@ prepare_message (RestProxyCall *call, GError **error_out) 777*4882a593Smuzhiyun return NULL; 778*4882a593Smuzhiyun } 779*4882a593Smuzhiyun 780*4882a593Smuzhiyun+#ifdef WITH_SOUP_2 781*4882a593Smuzhiyun message = soup_form_request_new_from_multipart (priv->url, mp); 782*4882a593Smuzhiyun+#else 783*4882a593Smuzhiyun+ message = soup_message_new_from_multipart (priv->url, mp); 784*4882a593Smuzhiyun+#endif 785*4882a593Smuzhiyun 786*4882a593Smuzhiyun soup_multipart_free (mp); 787*4882a593Smuzhiyun } 788*4882a593Smuzhiyun 789*4882a593Smuzhiyun+#ifdef WITH_SOUP_2 790*4882a593Smuzhiyun+ request_headers = message->request_headers; 791*4882a593Smuzhiyun+#else 792*4882a593Smuzhiyun+ request_headers = soup_message_get_request_headers (message); 793*4882a593Smuzhiyun+ g_signal_connect_swapped (message, "authenticate", 794*4882a593Smuzhiyun+ G_CALLBACK (authenticate), 795*4882a593Smuzhiyun+ call); 796*4882a593Smuzhiyun+ g_signal_connect_swapped (message, "accept-certificate", 797*4882a593Smuzhiyun+ G_CALLBACK (accept_certificate), 798*4882a593Smuzhiyun+ call); 799*4882a593Smuzhiyun+#endif 800*4882a593Smuzhiyun+ 801*4882a593Smuzhiyun+ 802*4882a593Smuzhiyun /* Set the user agent, if one was set in the proxy */ 803*4882a593Smuzhiyun user_agent = rest_proxy_get_user_agent (priv->proxy); 804*4882a593Smuzhiyun if (user_agent) { 805*4882a593Smuzhiyun- soup_message_headers_append (message->request_headers, "User-Agent", user_agent); 806*4882a593Smuzhiyun+ soup_message_headers_append (request_headers, "User-Agent", user_agent); 807*4882a593Smuzhiyun } 808*4882a593Smuzhiyun 809*4882a593Smuzhiyun /* Set the headers */ 810*4882a593Smuzhiyun- g_hash_table_foreach (priv->headers, set_header, message->request_headers); 811*4882a593Smuzhiyun+ g_hash_table_foreach (priv->headers, set_header, request_headers); 812*4882a593Smuzhiyun 813*4882a593Smuzhiyun return message; 814*4882a593Smuzhiyun } 815*4882a593Smuzhiyun@@ -878,17 +1000,17 @@ _call_message_call_cancelled_cb (GCancellable *cancellable, 816*4882a593Smuzhiyun } 817*4882a593Smuzhiyun 818*4882a593Smuzhiyun static void 819*4882a593Smuzhiyun-_call_message_call_completed_cb (SoupSession *session, 820*4882a593Smuzhiyun- SoupMessage *message, 821*4882a593Smuzhiyun+_call_message_call_completed_cb (SoupMessage *message, 822*4882a593Smuzhiyun+ GBytes *payload, 823*4882a593Smuzhiyun+ GError *error, 824*4882a593Smuzhiyun gpointer user_data) 825*4882a593Smuzhiyun { 826*4882a593Smuzhiyun GTask *task = user_data; 827*4882a593Smuzhiyun RestProxyCall *call; 828*4882a593Smuzhiyun- GError *error = NULL; 829*4882a593Smuzhiyun 830*4882a593Smuzhiyun call = REST_PROXY_CALL (g_task_get_source_object (task)); 831*4882a593Smuzhiyun 832*4882a593Smuzhiyun- finish_call (call, message, &error); 833*4882a593Smuzhiyun+ finish_call (call, message, payload, &error); 834*4882a593Smuzhiyun 835*4882a593Smuzhiyun if (error != NULL) 836*4882a593Smuzhiyun g_task_return_error (task, error); 837*4882a593Smuzhiyun@@ -938,6 +1060,7 @@ rest_proxy_call_invoke_async (RestProxyCall *call, 838*4882a593Smuzhiyun 839*4882a593Smuzhiyun _rest_proxy_queue_message (priv->proxy, 840*4882a593Smuzhiyun message, 841*4882a593Smuzhiyun+ priv->cancellable, 842*4882a593Smuzhiyun _call_message_call_completed_cb, 843*4882a593Smuzhiyun task); 844*4882a593Smuzhiyun } 845*4882a593Smuzhiyun@@ -962,16 +1085,55 @@ rest_proxy_call_invoke_finish (RestProxyCall *call, 846*4882a593Smuzhiyun } 847*4882a593Smuzhiyun 848*4882a593Smuzhiyun static void 849*4882a593Smuzhiyun-_continuous_call_message_got_chunk_cb (SoupMessage *msg, 850*4882a593Smuzhiyun- SoupBuffer *chunk, 851*4882a593Smuzhiyun- RestProxyCallContinuousClosure *closure) 852*4882a593Smuzhiyun+_continuous_call_read_cb (GObject *source, 853*4882a593Smuzhiyun+ GAsyncResult *result, 854*4882a593Smuzhiyun+ gpointer user_data) 855*4882a593Smuzhiyun { 856*4882a593Smuzhiyun+ GInputStream *stream = G_INPUT_STREAM (source); 857*4882a593Smuzhiyun+ RestProxyCallContinuousClosure *closure = user_data; 858*4882a593Smuzhiyun+ RestProxyCallPrivate *priv = GET_PRIVATE (closure->call); 859*4882a593Smuzhiyun+ gssize bytes_read; 860*4882a593Smuzhiyun+ GError *error = NULL; 861*4882a593Smuzhiyun+ 862*4882a593Smuzhiyun+ bytes_read = g_input_stream_read_finish (stream, result, &error); 863*4882a593Smuzhiyun+ if (bytes_read <= 0) 864*4882a593Smuzhiyun+ { 865*4882a593Smuzhiyun+ _continuous_call_message_completed (closure->message, error, user_data); 866*4882a593Smuzhiyun+ return; 867*4882a593Smuzhiyun+ } 868*4882a593Smuzhiyun+ 869*4882a593Smuzhiyun closure->callback (closure->call, 870*4882a593Smuzhiyun- chunk->data, 871*4882a593Smuzhiyun- chunk->length, 872*4882a593Smuzhiyun+ (gconstpointer)closure->buffer, 873*4882a593Smuzhiyun+ bytes_read, 874*4882a593Smuzhiyun NULL, 875*4882a593Smuzhiyun closure->weak_object, 876*4882a593Smuzhiyun closure->userdata); 877*4882a593Smuzhiyun+ 878*4882a593Smuzhiyun+ g_input_stream_read_async (stream, closure->buffer, READ_BUFFER_SIZE, G_PRIORITY_DEFAULT, 879*4882a593Smuzhiyun+ priv->cancellable, _continuous_call_read_cb, closure); 880*4882a593Smuzhiyun+} 881*4882a593Smuzhiyun+ 882*4882a593Smuzhiyun+static void 883*4882a593Smuzhiyun+_continuous_call_message_sent_cb (GObject *source, 884*4882a593Smuzhiyun+ GAsyncResult *result, 885*4882a593Smuzhiyun+ gpointer user_data) 886*4882a593Smuzhiyun+{ 887*4882a593Smuzhiyun+ RestProxy *proxy = REST_PROXY (source); 888*4882a593Smuzhiyun+ RestProxyCallContinuousClosure *closure = user_data; 889*4882a593Smuzhiyun+ RestProxyCallPrivate *priv = GET_PRIVATE (closure->call); 890*4882a593Smuzhiyun+ GInputStream *stream; 891*4882a593Smuzhiyun+ GError *error = NULL; 892*4882a593Smuzhiyun+ 893*4882a593Smuzhiyun+ stream = _rest_proxy_send_message_finish (proxy, result, &error); 894*4882a593Smuzhiyun+ if (!stream) 895*4882a593Smuzhiyun+ { 896*4882a593Smuzhiyun+ _continuous_call_message_completed (closure->message, error, user_data); 897*4882a593Smuzhiyun+ return; 898*4882a593Smuzhiyun+ } 899*4882a593Smuzhiyun+ 900*4882a593Smuzhiyun+ g_input_stream_read_async (stream, closure->buffer, READ_BUFFER_SIZE, G_PRIORITY_DEFAULT, 901*4882a593Smuzhiyun+ priv->cancellable, _continuous_call_read_cb, closure); 902*4882a593Smuzhiyun+ g_object_unref (stream); 903*4882a593Smuzhiyun } 904*4882a593Smuzhiyun 905*4882a593Smuzhiyun 906*4882a593Smuzhiyun@@ -1021,9 +1183,6 @@ rest_proxy_call_continuous (RestProxyCall *call, 907*4882a593Smuzhiyun if (message == NULL) 908*4882a593Smuzhiyun return FALSE; 909*4882a593Smuzhiyun 910*4882a593Smuzhiyun- /* Must turn off accumulation */ 911*4882a593Smuzhiyun- soup_message_body_set_accumulate (message->response_body, FALSE); 912*4882a593Smuzhiyun- 913*4882a593Smuzhiyun closure = g_slice_new0 (RestProxyCallContinuousClosure); 914*4882a593Smuzhiyun closure->call = g_object_ref (call); 915*4882a593Smuzhiyun closure->callback = callback; 916*4882a593Smuzhiyun@@ -1041,33 +1200,29 @@ rest_proxy_call_continuous (RestProxyCall *call, 917*4882a593Smuzhiyun closure); 918*4882a593Smuzhiyun } 919*4882a593Smuzhiyun 920*4882a593Smuzhiyun- g_signal_connect (message, 921*4882a593Smuzhiyun- "got-chunk", 922*4882a593Smuzhiyun- (GCallback)_continuous_call_message_got_chunk_cb, 923*4882a593Smuzhiyun- closure); 924*4882a593Smuzhiyun- 925*4882a593Smuzhiyun- _rest_proxy_queue_message (priv->proxy, 926*4882a593Smuzhiyun- message, 927*4882a593Smuzhiyun- _continuous_call_message_completed_cb, 928*4882a593Smuzhiyun- closure); 929*4882a593Smuzhiyun+ _rest_proxy_send_message_async (priv->proxy, 930*4882a593Smuzhiyun+ message, 931*4882a593Smuzhiyun+ priv->cancellable, 932*4882a593Smuzhiyun+ _continuous_call_message_sent_cb, 933*4882a593Smuzhiyun+ closure); 934*4882a593Smuzhiyun return TRUE; 935*4882a593Smuzhiyun } 936*4882a593Smuzhiyun 937*4882a593Smuzhiyun static void 938*4882a593Smuzhiyun-_upload_call_message_completed_cb (SoupSession *session, 939*4882a593Smuzhiyun- SoupMessage *message, 940*4882a593Smuzhiyun+_upload_call_message_completed_cb (SoupMessage *message, 941*4882a593Smuzhiyun+ GBytes *payload, 942*4882a593Smuzhiyun+ GError *error, 943*4882a593Smuzhiyun gpointer user_data) 944*4882a593Smuzhiyun { 945*4882a593Smuzhiyun RestProxyCall *call; 946*4882a593Smuzhiyun RestProxyCallPrivate *priv; 947*4882a593Smuzhiyun- GError *error = NULL; 948*4882a593Smuzhiyun RestProxyCallUploadClosure *closure; 949*4882a593Smuzhiyun 950*4882a593Smuzhiyun closure = (RestProxyCallUploadClosure *) user_data; 951*4882a593Smuzhiyun call = closure->call; 952*4882a593Smuzhiyun priv = GET_PRIVATE (call); 953*4882a593Smuzhiyun 954*4882a593Smuzhiyun- finish_call (call, message, &error); 955*4882a593Smuzhiyun+ finish_call (call, message, payload, &error); 956*4882a593Smuzhiyun 957*4882a593Smuzhiyun closure->callback (closure->call, 958*4882a593Smuzhiyun closure->uploaded, 959*4882a593Smuzhiyun@@ -1093,14 +1248,25 @@ _upload_call_message_completed_cb (SoupSession *session, 960*4882a593Smuzhiyun 961*4882a593Smuzhiyun static void 962*4882a593Smuzhiyun _upload_call_message_wrote_data_cb (SoupMessage *msg, 963*4882a593Smuzhiyun+#ifdef WITH_SOUP_2 964*4882a593Smuzhiyun SoupBuffer *chunk, 965*4882a593Smuzhiyun+#else 966*4882a593Smuzhiyun+ gsize chunk_size, 967*4882a593Smuzhiyun+#endif 968*4882a593Smuzhiyun RestProxyCallUploadClosure *closure) 969*4882a593Smuzhiyun { 970*4882a593Smuzhiyun- closure->uploaded = closure->uploaded + chunk->length; 971*4882a593Smuzhiyun+#ifdef WITH_SOUP_2 972*4882a593Smuzhiyun+ gsize chunk_size = chunk->length; 973*4882a593Smuzhiyun+ goffset content_length = msg->request_body->length; 974*4882a593Smuzhiyun+#else 975*4882a593Smuzhiyun+ goffset content_length = soup_message_headers_get_content_length (soup_message_get_request_headers (msg)); 976*4882a593Smuzhiyun+#endif 977*4882a593Smuzhiyun 978*4882a593Smuzhiyun- if (closure->uploaded < msg->request_body->length) 979*4882a593Smuzhiyun+ closure->uploaded = closure->uploaded + chunk_size; 980*4882a593Smuzhiyun+ 981*4882a593Smuzhiyun+ if (closure->uploaded < content_length) 982*4882a593Smuzhiyun closure->callback (closure->call, 983*4882a593Smuzhiyun- msg->request_body->length, 984*4882a593Smuzhiyun+ content_length, 985*4882a593Smuzhiyun closure->uploaded, 986*4882a593Smuzhiyun NULL, 987*4882a593Smuzhiyun closure->weak_object, 988*4882a593Smuzhiyun@@ -1178,6 +1344,7 @@ rest_proxy_call_upload (RestProxyCall *call, 989*4882a593Smuzhiyun 990*4882a593Smuzhiyun _rest_proxy_queue_message (priv->proxy, 991*4882a593Smuzhiyun message, 992*4882a593Smuzhiyun+ priv->cancellable, 993*4882a593Smuzhiyun _upload_call_message_completed_cb, 994*4882a593Smuzhiyun closure); 995*4882a593Smuzhiyun return TRUE; 996*4882a593Smuzhiyun@@ -1206,6 +1373,10 @@ rest_proxy_call_cancel (RestProxyCall *call) 997*4882a593Smuzhiyun if (priv->cancellable) 998*4882a593Smuzhiyun { 999*4882a593Smuzhiyun g_signal_handler_disconnect (priv->cancellable, priv->cancel_sig); 1000*4882a593Smuzhiyun+#ifndef WITH_SOUP_2 1001*4882a593Smuzhiyun+ if (!g_cancellable_is_cancelled (priv->cancellable)) 1002*4882a593Smuzhiyun+ g_cancellable_cancel (priv->cancellable); 1003*4882a593Smuzhiyun+#endif 1004*4882a593Smuzhiyun g_clear_object (&priv->cancellable); 1005*4882a593Smuzhiyun } 1006*4882a593Smuzhiyun 1007*4882a593Smuzhiyun@@ -1240,6 +1411,7 @@ rest_proxy_call_sync (RestProxyCall *call, 1008*4882a593Smuzhiyun RestProxyCallPrivate *priv = GET_PRIVATE (call); 1009*4882a593Smuzhiyun SoupMessage *message; 1010*4882a593Smuzhiyun gboolean ret; 1011*4882a593Smuzhiyun+ GBytes *payload; 1012*4882a593Smuzhiyun 1013*4882a593Smuzhiyun g_return_val_if_fail (REST_IS_PROXY_CALL (call), FALSE); 1014*4882a593Smuzhiyun 1015*4882a593Smuzhiyun@@ -1247,9 +1419,9 @@ rest_proxy_call_sync (RestProxyCall *call, 1016*4882a593Smuzhiyun if (!message) 1017*4882a593Smuzhiyun return FALSE; 1018*4882a593Smuzhiyun 1019*4882a593Smuzhiyun- _rest_proxy_send_message (priv->proxy, message); 1020*4882a593Smuzhiyun+ payload = _rest_proxy_send_message (priv->proxy, message, priv->cancellable, error_out); 1021*4882a593Smuzhiyun 1022*4882a593Smuzhiyun- ret = finish_call (call, message, error_out); 1023*4882a593Smuzhiyun+ ret = finish_call (call, message, payload, error_out); 1024*4882a593Smuzhiyun 1025*4882a593Smuzhiyun g_object_unref (message); 1026*4882a593Smuzhiyun 1027*4882a593Smuzhiyun@@ -1314,9 +1486,16 @@ rest_proxy_call_get_response_headers (RestProxyCall *call) 1028*4882a593Smuzhiyun goffset 1029*4882a593Smuzhiyun rest_proxy_call_get_payload_length (RestProxyCall *call) 1030*4882a593Smuzhiyun { 1031*4882a593Smuzhiyun+ GBytes *payload; 1032*4882a593Smuzhiyun+ 1033*4882a593Smuzhiyun g_return_val_if_fail (REST_IS_PROXY_CALL (call), 0); 1034*4882a593Smuzhiyun 1035*4882a593Smuzhiyun- return GET_PRIVATE (call)->length; 1036*4882a593Smuzhiyun+ payload = GET_PRIVATE (call)->payload; 1037*4882a593Smuzhiyun+#ifdef WITH_SOUP_2 1038*4882a593Smuzhiyun+ return payload ? g_bytes_get_size (payload) - 1 : 0; 1039*4882a593Smuzhiyun+#else 1040*4882a593Smuzhiyun+ return payload ? g_bytes_get_size (payload) : 0; 1041*4882a593Smuzhiyun+#endif 1042*4882a593Smuzhiyun } 1043*4882a593Smuzhiyun 1044*4882a593Smuzhiyun /** 1045*4882a593Smuzhiyun@@ -1331,9 +1510,12 @@ rest_proxy_call_get_payload_length (RestProxyCall *call) 1046*4882a593Smuzhiyun const gchar * 1047*4882a593Smuzhiyun rest_proxy_call_get_payload (RestProxyCall *call) 1048*4882a593Smuzhiyun { 1049*4882a593Smuzhiyun+ GBytes *payload; 1050*4882a593Smuzhiyun+ 1051*4882a593Smuzhiyun g_return_val_if_fail (REST_IS_PROXY_CALL (call), NULL); 1052*4882a593Smuzhiyun 1053*4882a593Smuzhiyun- return GET_PRIVATE (call)->payload; 1054*4882a593Smuzhiyun+ payload = GET_PRIVATE (call)->payload; 1055*4882a593Smuzhiyun+ return payload ? g_bytes_get_data (payload, NULL) : NULL; 1056*4882a593Smuzhiyun } 1057*4882a593Smuzhiyun 1058*4882a593Smuzhiyun /** 1059*4882a593Smuzhiyundiff --git a/rest/rest-proxy.c b/rest/rest-proxy.c 1060*4882a593Smuzhiyunindex 80972a3..171f6cb 100644 1061*4882a593Smuzhiyun--- a/rest/rest-proxy.c 1062*4882a593Smuzhiyun+++ b/rest/rest-proxy.c 1063*4882a593Smuzhiyun@@ -45,6 +45,9 @@ struct _RestProxyPrivate { 1064*4882a593Smuzhiyun SoupSession *session; 1065*4882a593Smuzhiyun gboolean disable_cookies; 1066*4882a593Smuzhiyun char *ssl_ca_file; 1067*4882a593Smuzhiyun+#ifndef WITH_SOUP_2 1068*4882a593Smuzhiyun+ gboolean ssl_strict; 1069*4882a593Smuzhiyun+#endif 1070*4882a593Smuzhiyun }; 1071*4882a593Smuzhiyun 1072*4882a593Smuzhiyun 1073*4882a593Smuzhiyun@@ -116,11 +119,15 @@ rest_proxy_get_property (GObject *object, 1074*4882a593Smuzhiyun g_value_set_string (value, priv->password); 1075*4882a593Smuzhiyun break; 1076*4882a593Smuzhiyun case PROP_SSL_STRICT: { 1077*4882a593Smuzhiyun+#ifdef WITH_SOUP_2 1078*4882a593Smuzhiyun gboolean ssl_strict; 1079*4882a593Smuzhiyun g_object_get (G_OBJECT(priv->session), 1080*4882a593Smuzhiyun "ssl-strict", &ssl_strict, 1081*4882a593Smuzhiyun NULL); 1082*4882a593Smuzhiyun g_value_set_boolean (value, ssl_strict); 1083*4882a593Smuzhiyun+#else 1084*4882a593Smuzhiyun+ g_value_set_boolean (value, priv->ssl_strict); 1085*4882a593Smuzhiyun+#endif 1086*4882a593Smuzhiyun break; 1087*4882a593Smuzhiyun } 1088*4882a593Smuzhiyun case PROP_SSL_CA_FILE: 1089*4882a593Smuzhiyun@@ -172,9 +179,13 @@ rest_proxy_set_property (GObject *object, 1090*4882a593Smuzhiyun priv->password = g_value_dup_string (value); 1091*4882a593Smuzhiyun break; 1092*4882a593Smuzhiyun case PROP_SSL_STRICT: 1093*4882a593Smuzhiyun+#ifdef WITH_SOUP_2 1094*4882a593Smuzhiyun g_object_set (G_OBJECT(priv->session), 1095*4882a593Smuzhiyun "ssl-strict", g_value_get_boolean (value), 1096*4882a593Smuzhiyun NULL); 1097*4882a593Smuzhiyun+#else 1098*4882a593Smuzhiyun+ priv->ssl_strict = g_value_get_boolean (value); 1099*4882a593Smuzhiyun+#endif 1100*4882a593Smuzhiyun break; 1101*4882a593Smuzhiyun case PROP_SSL_CA_FILE: 1102*4882a593Smuzhiyun g_free(priv->ssl_ca_file); 1103*4882a593Smuzhiyun@@ -207,6 +218,7 @@ default_authenticate_cb (RestProxy *self, 1104*4882a593Smuzhiyun return !retrying; 1105*4882a593Smuzhiyun } 1106*4882a593Smuzhiyun 1107*4882a593Smuzhiyun+#ifdef WITH_SOUP_2 1108*4882a593Smuzhiyun static void 1109*4882a593Smuzhiyun authenticate (RestProxy *self, 1110*4882a593Smuzhiyun SoupMessage *msg, 1111*4882a593Smuzhiyun@@ -224,6 +236,7 @@ authenticate (RestProxy *self, 1112*4882a593Smuzhiyun soup_auth_authenticate (soup_auth, priv->username, priv->password); 1113*4882a593Smuzhiyun g_object_unref (G_OBJECT (rest_auth)); 1114*4882a593Smuzhiyun } 1115*4882a593Smuzhiyun+#endif 1116*4882a593Smuzhiyun 1117*4882a593Smuzhiyun static void 1118*4882a593Smuzhiyun rest_proxy_constructed (GObject *object) 1119*4882a593Smuzhiyun@@ -238,14 +251,20 @@ rest_proxy_constructed (GObject *object) 1120*4882a593Smuzhiyun } 1121*4882a593Smuzhiyun 1122*4882a593Smuzhiyun if (REST_DEBUG_ENABLED(PROXY)) { 1123*4882a593Smuzhiyun+#ifdef WITH_SOUP_2 1124*4882a593Smuzhiyun SoupSessionFeature *logger = (SoupSessionFeature*)soup_logger_new (SOUP_LOGGER_LOG_BODY, 0); 1125*4882a593Smuzhiyun+#else 1126*4882a593Smuzhiyun+ SoupSessionFeature *logger = (SoupSessionFeature*)soup_logger_new (SOUP_LOGGER_LOG_HEADERS); 1127*4882a593Smuzhiyun+#endif 1128*4882a593Smuzhiyun soup_session_add_feature (priv->session, logger); 1129*4882a593Smuzhiyun g_object_unref (logger); 1130*4882a593Smuzhiyun } 1131*4882a593Smuzhiyun 1132*4882a593Smuzhiyun+#ifdef WITH_SOUP_2 1133*4882a593Smuzhiyun /* session lifetime is same as self, no need to keep signalid */ 1134*4882a593Smuzhiyun g_signal_connect_swapped (priv->session, "authenticate", 1135*4882a593Smuzhiyun G_CALLBACK(authenticate), object); 1136*4882a593Smuzhiyun+#endif 1137*4882a593Smuzhiyun } 1138*4882a593Smuzhiyun 1139*4882a593Smuzhiyun static void 1140*4882a593Smuzhiyun@@ -391,23 +410,62 @@ rest_proxy_class_init (RestProxyClass *klass) 1141*4882a593Smuzhiyun proxy_class->authenticate = default_authenticate_cb; 1142*4882a593Smuzhiyun } 1143*4882a593Smuzhiyun 1144*4882a593Smuzhiyun+static gboolean 1145*4882a593Smuzhiyun+transform_ssl_ca_file_to_tls_database (GBinding *binding, 1146*4882a593Smuzhiyun+ const GValue *from_value, 1147*4882a593Smuzhiyun+ GValue *to_value, 1148*4882a593Smuzhiyun+ gpointer user_data) 1149*4882a593Smuzhiyun+{ 1150*4882a593Smuzhiyun+ g_value_take_object (to_value, 1151*4882a593Smuzhiyun+ g_tls_file_database_new (g_value_get_string (from_value), NULL)); 1152*4882a593Smuzhiyun+ return TRUE; 1153*4882a593Smuzhiyun+} 1154*4882a593Smuzhiyun+ 1155*4882a593Smuzhiyun+static gboolean 1156*4882a593Smuzhiyun+transform_tls_database_to_ssl_ca_file (GBinding *binding, 1157*4882a593Smuzhiyun+ const GValue *from_value, 1158*4882a593Smuzhiyun+ GValue *to_value, 1159*4882a593Smuzhiyun+ gpointer user_data) 1160*4882a593Smuzhiyun+{ 1161*4882a593Smuzhiyun+ GTlsDatabase *tls_database; 1162*4882a593Smuzhiyun+ char *path = NULL; 1163*4882a593Smuzhiyun+ 1164*4882a593Smuzhiyun+ tls_database = g_value_get_object (from_value); 1165*4882a593Smuzhiyun+ if (tls_database) 1166*4882a593Smuzhiyun+ g_object_get (tls_database, "anchors", &path, NULL); 1167*4882a593Smuzhiyun+ g_value_take_string (to_value, path); 1168*4882a593Smuzhiyun+ return TRUE; 1169*4882a593Smuzhiyun+} 1170*4882a593Smuzhiyun+ 1171*4882a593Smuzhiyun static void 1172*4882a593Smuzhiyun rest_proxy_init (RestProxy *self) 1173*4882a593Smuzhiyun { 1174*4882a593Smuzhiyun RestProxyPrivate *priv = GET_PRIVATE (self); 1175*4882a593Smuzhiyun+ GTlsDatabase *tls_database; 1176*4882a593Smuzhiyun+ 1177*4882a593Smuzhiyun+#ifndef WITH_SOUP_2 1178*4882a593Smuzhiyun+ priv->ssl_strict = TRUE; 1179*4882a593Smuzhiyun+#endif 1180*4882a593Smuzhiyun 1181*4882a593Smuzhiyun priv->session = soup_session_new (); 1182*4882a593Smuzhiyun 1183*4882a593Smuzhiyun #ifdef REST_SYSTEM_CA_FILE 1184*4882a593Smuzhiyun /* with ssl-strict (defaults TRUE) setting ssl-ca-file forces all 1185*4882a593Smuzhiyun * certificates to be trusted */ 1186*4882a593Smuzhiyun- g_object_set (priv->session, 1187*4882a593Smuzhiyun- "ssl-ca-file", REST_SYSTEM_CA_FILE, 1188*4882a593Smuzhiyun- NULL); 1189*4882a593Smuzhiyun+ tls_database = g_tls_file_database_new (REST_SYSTEM_CA_FILE, NULL); 1190*4882a593Smuzhiyun+ if (tls_database) { 1191*4882a593Smuzhiyun+ g_object_set (priv->session, 1192*4882a593Smuzhiyun+ "tls-database", tls_database, 1193*4882a593Smuzhiyun+ NULL); 1194*4882a593Smuzhiyun+ g_object_unref (tls_database); 1195*4882a593Smuzhiyun+ } 1196*4882a593Smuzhiyun #endif 1197*4882a593Smuzhiyun- g_object_bind_property (self, "ssl-ca-file", 1198*4882a593Smuzhiyun- priv->session, "ssl-ca-file", 1199*4882a593Smuzhiyun- G_BINDING_BIDIRECTIONAL); 1200*4882a593Smuzhiyun+ g_object_bind_property_full (self, "ssl-ca-file", 1201*4882a593Smuzhiyun+ priv->session, "tls-database", 1202*4882a593Smuzhiyun+ G_BINDING_BIDIRECTIONAL, 1203*4882a593Smuzhiyun+ transform_ssl_ca_file_to_tls_database, 1204*4882a593Smuzhiyun+ transform_tls_database_to_ssl_ca_file, 1205*4882a593Smuzhiyun+ NULL, NULL); 1206*4882a593Smuzhiyun } 1207*4882a593Smuzhiyun 1208*4882a593Smuzhiyun /** 1209*4882a593Smuzhiyun@@ -689,27 +747,127 @@ rest_proxy_simple_run (RestProxy *proxy, 1210*4882a593Smuzhiyun return ret; 1211*4882a593Smuzhiyun } 1212*4882a593Smuzhiyun 1213*4882a593Smuzhiyun+typedef struct { 1214*4882a593Smuzhiyun+ RestMessageFinishedCallback callback; 1215*4882a593Smuzhiyun+ gpointer user_data; 1216*4882a593Smuzhiyun+} RestMessageQueueData; 1217*4882a593Smuzhiyun+ 1218*4882a593Smuzhiyun+#ifdef WITH_SOUP_2 1219*4882a593Smuzhiyun+static void 1220*4882a593Smuzhiyun+message_finished_cb (SoupSession *session, 1221*4882a593Smuzhiyun+ SoupMessage *message, 1222*4882a593Smuzhiyun+ gpointer user_data) 1223*4882a593Smuzhiyun+{ 1224*4882a593Smuzhiyun+ RestMessageQueueData *data = user_data; 1225*4882a593Smuzhiyun+ GBytes *body; 1226*4882a593Smuzhiyun+ GError *error = NULL; 1227*4882a593Smuzhiyun+ 1228*4882a593Smuzhiyun+ body = g_bytes_new (message->response_body->data, 1229*4882a593Smuzhiyun+ message->response_body->length + 1); 1230*4882a593Smuzhiyun+ data->callback (message, body, error, data->user_data); 1231*4882a593Smuzhiyun+ g_free (data); 1232*4882a593Smuzhiyun+} 1233*4882a593Smuzhiyun+#else 1234*4882a593Smuzhiyun+static void 1235*4882a593Smuzhiyun+message_send_and_read_ready_cb (GObject *source, 1236*4882a593Smuzhiyun+ GAsyncResult *result, 1237*4882a593Smuzhiyun+ gpointer user_data) 1238*4882a593Smuzhiyun+{ 1239*4882a593Smuzhiyun+ SoupSession *session = SOUP_SESSION (source); 1240*4882a593Smuzhiyun+ RestMessageQueueData *data = user_data; 1241*4882a593Smuzhiyun+ GBytes *body; 1242*4882a593Smuzhiyun+ GError *error = NULL; 1243*4882a593Smuzhiyun+ 1244*4882a593Smuzhiyun+ body = soup_session_send_and_read_finish (session, result, &error); 1245*4882a593Smuzhiyun+ data->callback (soup_session_get_async_result_message (session, result), body, error, data->user_data); 1246*4882a593Smuzhiyun+ g_free (data); 1247*4882a593Smuzhiyun+} 1248*4882a593Smuzhiyun+#endif 1249*4882a593Smuzhiyun+ 1250*4882a593Smuzhiyun void 1251*4882a593Smuzhiyun-_rest_proxy_queue_message (RestProxy *proxy, 1252*4882a593Smuzhiyun- SoupMessage *message, 1253*4882a593Smuzhiyun- SoupSessionCallback callback, 1254*4882a593Smuzhiyun- gpointer user_data) 1255*4882a593Smuzhiyun+_rest_proxy_queue_message (RestProxy *proxy, 1256*4882a593Smuzhiyun+ SoupMessage *message, 1257*4882a593Smuzhiyun+ GCancellable *cancellable, 1258*4882a593Smuzhiyun+ RestMessageFinishedCallback callback, 1259*4882a593Smuzhiyun+ gpointer user_data) 1260*4882a593Smuzhiyun { 1261*4882a593Smuzhiyun RestProxyPrivate *priv = GET_PRIVATE (proxy); 1262*4882a593Smuzhiyun+ RestMessageQueueData *data; 1263*4882a593Smuzhiyun 1264*4882a593Smuzhiyun g_return_if_fail (REST_IS_PROXY (proxy)); 1265*4882a593Smuzhiyun g_return_if_fail (SOUP_IS_MESSAGE (message)); 1266*4882a593Smuzhiyun 1267*4882a593Smuzhiyun+ data = g_new0 (RestMessageQueueData, 1); 1268*4882a593Smuzhiyun+ data->callback = callback; 1269*4882a593Smuzhiyun+ data->user_data = user_data; 1270*4882a593Smuzhiyun+ 1271*4882a593Smuzhiyun+#ifdef WITH_SOUP_2 1272*4882a593Smuzhiyun soup_session_queue_message (priv->session, 1273*4882a593Smuzhiyun message, 1274*4882a593Smuzhiyun- callback, 1275*4882a593Smuzhiyun- user_data); 1276*4882a593Smuzhiyun+ message_finished_cb, 1277*4882a593Smuzhiyun+ data); 1278*4882a593Smuzhiyun+#else 1279*4882a593Smuzhiyun+ soup_session_send_and_read_async (priv->session, 1280*4882a593Smuzhiyun+ message, 1281*4882a593Smuzhiyun+ G_PRIORITY_DEFAULT, 1282*4882a593Smuzhiyun+ cancellable, 1283*4882a593Smuzhiyun+ message_send_and_read_ready_cb, 1284*4882a593Smuzhiyun+ data); 1285*4882a593Smuzhiyun+#endif 1286*4882a593Smuzhiyun+} 1287*4882a593Smuzhiyun+ 1288*4882a593Smuzhiyun+static void 1289*4882a593Smuzhiyun+message_send_ready_cb (GObject *source, 1290*4882a593Smuzhiyun+ GAsyncResult *result, 1291*4882a593Smuzhiyun+ gpointer user_data) 1292*4882a593Smuzhiyun+{ 1293*4882a593Smuzhiyun+ SoupSession *session = SOUP_SESSION (source); 1294*4882a593Smuzhiyun+ GTask *task = user_data; 1295*4882a593Smuzhiyun+ GInputStream *stream; 1296*4882a593Smuzhiyun+ GError *error = NULL; 1297*4882a593Smuzhiyun+ 1298*4882a593Smuzhiyun+ stream = soup_session_send_finish (session, result, &error); 1299*4882a593Smuzhiyun+ if (stream) 1300*4882a593Smuzhiyun+ g_task_return_pointer (task, stream, g_object_unref); 1301*4882a593Smuzhiyun+ else 1302*4882a593Smuzhiyun+ g_task_return_error (task, error); 1303*4882a593Smuzhiyun+ g_object_unref (task); 1304*4882a593Smuzhiyun+} 1305*4882a593Smuzhiyun+ 1306*4882a593Smuzhiyun+void 1307*4882a593Smuzhiyun+_rest_proxy_send_message_async (RestProxy *proxy, 1308*4882a593Smuzhiyun+ SoupMessage *message, 1309*4882a593Smuzhiyun+ GCancellable *cancellable, 1310*4882a593Smuzhiyun+ GAsyncReadyCallback callback, 1311*4882a593Smuzhiyun+ gpointer user_data) 1312*4882a593Smuzhiyun+{ 1313*4882a593Smuzhiyun+ RestProxyPrivate *priv = GET_PRIVATE (proxy); 1314*4882a593Smuzhiyun+ GTask *task; 1315*4882a593Smuzhiyun+ 1316*4882a593Smuzhiyun+ task = g_task_new (proxy, cancellable, callback, user_data); 1317*4882a593Smuzhiyun+ soup_session_send_async (priv->session, 1318*4882a593Smuzhiyun+ message, 1319*4882a593Smuzhiyun+#ifndef WITH_SOUP_2 1320*4882a593Smuzhiyun+ G_PRIORITY_DEFAULT, 1321*4882a593Smuzhiyun+#endif 1322*4882a593Smuzhiyun+ cancellable, 1323*4882a593Smuzhiyun+ message_send_ready_cb, 1324*4882a593Smuzhiyun+ task); 1325*4882a593Smuzhiyun+} 1326*4882a593Smuzhiyun+ 1327*4882a593Smuzhiyun+GInputStream * 1328*4882a593Smuzhiyun+_rest_proxy_send_message_finish (RestProxy *proxy, 1329*4882a593Smuzhiyun+ GAsyncResult *result, 1330*4882a593Smuzhiyun+ GError **error) 1331*4882a593Smuzhiyun+{ 1332*4882a593Smuzhiyun+ return g_task_propagate_pointer (G_TASK (result), error); 1333*4882a593Smuzhiyun } 1334*4882a593Smuzhiyun 1335*4882a593Smuzhiyun void 1336*4882a593Smuzhiyun _rest_proxy_cancel_message (RestProxy *proxy, 1337*4882a593Smuzhiyun SoupMessage *message) 1338*4882a593Smuzhiyun { 1339*4882a593Smuzhiyun+#ifdef WITH_SOUP_2 1340*4882a593Smuzhiyun RestProxyPrivate *priv = GET_PRIVATE (proxy); 1341*4882a593Smuzhiyun 1342*4882a593Smuzhiyun g_return_if_fail (REST_IS_PROXY (proxy)); 1343*4882a593Smuzhiyun@@ -718,16 +876,31 @@ _rest_proxy_cancel_message (RestProxy *proxy, 1344*4882a593Smuzhiyun soup_session_cancel_message (priv->session, 1345*4882a593Smuzhiyun message, 1346*4882a593Smuzhiyun SOUP_STATUS_CANCELLED); 1347*4882a593Smuzhiyun+#endif 1348*4882a593Smuzhiyun } 1349*4882a593Smuzhiyun 1350*4882a593Smuzhiyun-guint 1351*4882a593Smuzhiyun-_rest_proxy_send_message (RestProxy *proxy, 1352*4882a593Smuzhiyun- SoupMessage *message) 1353*4882a593Smuzhiyun+GBytes * 1354*4882a593Smuzhiyun+_rest_proxy_send_message (RestProxy *proxy, 1355*4882a593Smuzhiyun+ SoupMessage *message, 1356*4882a593Smuzhiyun+ GCancellable *cancellable, 1357*4882a593Smuzhiyun+ GError **error) 1358*4882a593Smuzhiyun { 1359*4882a593Smuzhiyun RestProxyPrivate *priv = GET_PRIVATE (proxy); 1360*4882a593Smuzhiyun+ GBytes *body; 1361*4882a593Smuzhiyun 1362*4882a593Smuzhiyun- g_return_val_if_fail (REST_IS_PROXY (proxy), 0); 1363*4882a593Smuzhiyun- g_return_val_if_fail (SOUP_IS_MESSAGE (message), 0); 1364*4882a593Smuzhiyun+ g_return_val_if_fail (REST_IS_PROXY (proxy), NULL); 1365*4882a593Smuzhiyun+ g_return_val_if_fail (SOUP_IS_MESSAGE (message), NULL); 1366*4882a593Smuzhiyun+ 1367*4882a593Smuzhiyun+#ifdef WITH_SOUP_2 1368*4882a593Smuzhiyun+ soup_session_send_message (priv->session, message); 1369*4882a593Smuzhiyun+ body = g_bytes_new (message->response_body->data, 1370*4882a593Smuzhiyun+ message->response_body->length + 1); 1371*4882a593Smuzhiyun+#else 1372*4882a593Smuzhiyun+ body = soup_session_send_and_read (priv->session, 1373*4882a593Smuzhiyun+ message, 1374*4882a593Smuzhiyun+ cancellable, 1375*4882a593Smuzhiyun+ error); 1376*4882a593Smuzhiyun+#endif 1377*4882a593Smuzhiyun 1378*4882a593Smuzhiyun- return soup_session_send_message (priv->session, message); 1379*4882a593Smuzhiyun+ return body; 1380*4882a593Smuzhiyun } 1381*4882a593Smuzhiyundiff --git a/tests/custom-serialize.c b/tests/custom-serialize.c 1382*4882a593Smuzhiyunindex c3fde93..01b3a56 100644 1383*4882a593Smuzhiyun--- a/tests/custom-serialize.c 1384*4882a593Smuzhiyun+++ b/tests/custom-serialize.c 1385*4882a593Smuzhiyun@@ -88,22 +88,40 @@ custom_proxy_call_init (CustomProxyCall *self) 1386*4882a593Smuzhiyun } 1387*4882a593Smuzhiyun 1388*4882a593Smuzhiyun static void 1389*4882a593Smuzhiyun+#ifdef WITH_SOUP_2 1390*4882a593Smuzhiyun server_callback (SoupServer *server, SoupMessage *msg, 1391*4882a593Smuzhiyun const char *path, GHashTable *query, 1392*4882a593Smuzhiyun SoupClientContext *client, gpointer user_data) 1393*4882a593Smuzhiyun+#else 1394*4882a593Smuzhiyun+server_callback (SoupServer *server, SoupServerMessage *msg, 1395*4882a593Smuzhiyun+ const char *path, GHashTable *query, gpointer user_data) 1396*4882a593Smuzhiyun+#endif 1397*4882a593Smuzhiyun { 1398*4882a593Smuzhiyun if (g_str_equal (path, "/ping")) { 1399*4882a593Smuzhiyun const char *content_type = NULL; 1400*4882a593Smuzhiyun+#ifdef WITH_SOUP_2 1401*4882a593Smuzhiyun SoupMessageHeaders *headers = msg->request_headers; 1402*4882a593Smuzhiyun SoupMessageBody *body = msg->request_body; 1403*4882a593Smuzhiyun+#else 1404*4882a593Smuzhiyun+ SoupMessageHeaders *headers = soup_server_message_get_request_headers (msg); 1405*4882a593Smuzhiyun+ SoupMessageBody *body = soup_server_message_get_request_body (msg); 1406*4882a593Smuzhiyun+#endif 1407*4882a593Smuzhiyun content_type = soup_message_headers_get_content_type (headers, NULL); 1408*4882a593Smuzhiyun g_assert_cmpstr (content_type, ==, "application/json"); 1409*4882a593Smuzhiyun 1410*4882a593Smuzhiyun g_assert_cmpstr (body->data, ==, "{}"); 1411*4882a593Smuzhiyun 1412*4882a593Smuzhiyun+#ifdef WITH_SOUP_2 1413*4882a593Smuzhiyun soup_message_set_status (msg, SOUP_STATUS_OK); 1414*4882a593Smuzhiyun+#else 1415*4882a593Smuzhiyun+ soup_server_message_set_status (msg, SOUP_STATUS_OK, NULL); 1416*4882a593Smuzhiyun+#endif 1417*4882a593Smuzhiyun } else { 1418*4882a593Smuzhiyun+#ifdef WITH_SOUP_2 1419*4882a593Smuzhiyun soup_message_set_status (msg, SOUP_STATUS_NOT_IMPLEMENTED); 1420*4882a593Smuzhiyun+#else 1421*4882a593Smuzhiyun+ soup_server_message_set_status (msg, SOUP_STATUS_NOT_IMPLEMENTED, NULL); 1422*4882a593Smuzhiyun+#endif 1423*4882a593Smuzhiyun } 1424*4882a593Smuzhiyun } 1425*4882a593Smuzhiyun 1426*4882a593Smuzhiyundiff --git a/tests/proxy-continuous.c b/tests/proxy-continuous.c 1427*4882a593Smuzhiyunindex 8f4b7a8..7967bbd 100644 1428*4882a593Smuzhiyun--- a/tests/proxy-continuous.c 1429*4882a593Smuzhiyun+++ b/tests/proxy-continuous.c 1430*4882a593Smuzhiyun@@ -39,9 +39,15 @@ static SoupServer *server; 1431*4882a593Smuzhiyun static gboolean 1432*4882a593Smuzhiyun send_chunks (gpointer user_data) 1433*4882a593Smuzhiyun { 1434*4882a593Smuzhiyun- SoupMessage *msg = SOUP_MESSAGE (user_data); 1435*4882a593Smuzhiyun guint i; 1436*4882a593Smuzhiyun guint8 data[SIZE_CHUNK]; 1437*4882a593Smuzhiyun+#ifdef WITH_SOUP_2 1438*4882a593Smuzhiyun+ SoupMessage *msg = SOUP_MESSAGE (user_data); 1439*4882a593Smuzhiyun+ SoupMessageBody *response_body = msg->response_body; 1440*4882a593Smuzhiyun+#else 1441*4882a593Smuzhiyun+ SoupServerMessage *msg = SOUP_SERVER_MESSAGE (user_data); 1442*4882a593Smuzhiyun+ SoupMessageBody *response_body = soup_server_message_get_response_body (msg); 1443*4882a593Smuzhiyun+#endif 1444*4882a593Smuzhiyun 1445*4882a593Smuzhiyun for (i = 0; i < SIZE_CHUNK; i++) 1446*4882a593Smuzhiyun { 1447*4882a593Smuzhiyun@@ -49,12 +55,12 @@ send_chunks (gpointer user_data) 1448*4882a593Smuzhiyun server_count++; 1449*4882a593Smuzhiyun } 1450*4882a593Smuzhiyun 1451*4882a593Smuzhiyun- soup_message_body_append (msg->response_body, SOUP_MEMORY_COPY, data, SIZE_CHUNK); 1452*4882a593Smuzhiyun+ soup_message_body_append (response_body, SOUP_MEMORY_COPY, data, SIZE_CHUNK); 1453*4882a593Smuzhiyun soup_server_unpause_message (server, msg); 1454*4882a593Smuzhiyun 1455*4882a593Smuzhiyun if (server_count == NUM_CHUNKS * SIZE_CHUNK) 1456*4882a593Smuzhiyun { 1457*4882a593Smuzhiyun- soup_message_body_complete (msg->response_body); 1458*4882a593Smuzhiyun+ soup_message_body_complete (response_body); 1459*4882a593Smuzhiyun return FALSE; 1460*4882a593Smuzhiyun } else { 1461*4882a593Smuzhiyun return TRUE; 1462*4882a593Smuzhiyun@@ -62,13 +68,28 @@ send_chunks (gpointer user_data) 1463*4882a593Smuzhiyun } 1464*4882a593Smuzhiyun 1465*4882a593Smuzhiyun static void 1466*4882a593Smuzhiyun+#ifdef WITH_SOUP_2 1467*4882a593Smuzhiyun server_callback (SoupServer *server, SoupMessage *msg, 1468*4882a593Smuzhiyun const char *path, GHashTable *query, 1469*4882a593Smuzhiyun SoupClientContext *client, gpointer user_data) 1470*4882a593Smuzhiyun+#else 1471*4882a593Smuzhiyun+server_callback (SoupServer *server, SoupServerMessage *msg, 1472*4882a593Smuzhiyun+ const char *path, GHashTable *query, gpointer user_data) 1473*4882a593Smuzhiyun+#endif 1474*4882a593Smuzhiyun { 1475*4882a593Smuzhiyun+#ifdef WITH_SOUP_2 1476*4882a593Smuzhiyun+ SoupMessageHeaders *response_headers = msg->response_headers; 1477*4882a593Smuzhiyun+#else 1478*4882a593Smuzhiyun+ SoupMessageHeaders *response_headers = soup_server_message_get_response_headers (msg); 1479*4882a593Smuzhiyun+#endif 1480*4882a593Smuzhiyun+ 1481*4882a593Smuzhiyun g_assert_cmpstr (path, ==, "/stream"); 1482*4882a593Smuzhiyun+#ifdef WITH_SOUP_2 1483*4882a593Smuzhiyun soup_message_set_status (msg, SOUP_STATUS_OK); 1484*4882a593Smuzhiyun- soup_message_headers_set_encoding (msg->response_headers, 1485*4882a593Smuzhiyun+#else 1486*4882a593Smuzhiyun+ soup_server_message_set_status (msg, SOUP_STATUS_OK, NULL); 1487*4882a593Smuzhiyun+#endif 1488*4882a593Smuzhiyun+ soup_message_headers_set_encoding (response_headers, 1489*4882a593Smuzhiyun SOUP_ENCODING_CHUNKED); 1490*4882a593Smuzhiyun soup_server_pause_message (server, msg); 1491*4882a593Smuzhiyun 1492*4882a593Smuzhiyun@@ -142,13 +163,21 @@ continuous () 1493*4882a593Smuzhiyun uris = soup_server_get_uris (server); 1494*4882a593Smuzhiyun g_assert (g_slist_length (uris) > 0); 1495*4882a593Smuzhiyun 1496*4882a593Smuzhiyun+#ifdef WITH_SOUP_2 1497*4882a593Smuzhiyun url = soup_uri_to_string (uris->data, FALSE); 1498*4882a593Smuzhiyun+#else 1499*4882a593Smuzhiyun+ url = g_uri_to_string (uris->data); 1500*4882a593Smuzhiyun+#endif 1501*4882a593Smuzhiyun 1502*4882a593Smuzhiyun loop = g_main_loop_new (NULL, FALSE); 1503*4882a593Smuzhiyun 1504*4882a593Smuzhiyun proxy = rest_proxy_new (url, FALSE); 1505*4882a593Smuzhiyun stream_test (proxy); 1506*4882a593Smuzhiyun+#ifdef WITH_SOUP_2 1507*4882a593Smuzhiyun g_slist_free_full (uris, (GDestroyNotify)soup_uri_free); 1508*4882a593Smuzhiyun+#else 1509*4882a593Smuzhiyun+ g_slist_free_full (uris, (GDestroyNotify)g_uri_unref); 1510*4882a593Smuzhiyun+#endif 1511*4882a593Smuzhiyun 1512*4882a593Smuzhiyun g_main_loop_run (loop); 1513*4882a593Smuzhiyun g_free (url); 1514*4882a593Smuzhiyundiff --git a/tests/proxy.c b/tests/proxy.c 1515*4882a593Smuzhiyunindex 89a9325..652c600 100644 1516*4882a593Smuzhiyun--- a/tests/proxy.c 1517*4882a593Smuzhiyun+++ b/tests/proxy.c 1518*4882a593Smuzhiyun@@ -49,20 +49,35 @@ SoupServer *server; 1519*4882a593Smuzhiyun GMainLoop *server_loop; 1520*4882a593Smuzhiyun 1521*4882a593Smuzhiyun static void 1522*4882a593Smuzhiyun+#ifdef WITH_SOUP_2 1523*4882a593Smuzhiyun server_callback (SoupServer *server, SoupMessage *msg, 1524*4882a593Smuzhiyun const char *path, GHashTable *query, 1525*4882a593Smuzhiyun SoupClientContext *client, gpointer user_data) 1526*4882a593Smuzhiyun+#else 1527*4882a593Smuzhiyun+server_callback (SoupServer *server, SoupServerMessage *msg, 1528*4882a593Smuzhiyun+ const char *path, GHashTable *query, gpointer user_data) 1529*4882a593Smuzhiyun+#endif 1530*4882a593Smuzhiyun { 1531*4882a593Smuzhiyun if (g_str_equal (path, "/ping")) { 1532*4882a593Smuzhiyun+#ifdef WITH_SOUP_2 1533*4882a593Smuzhiyun soup_message_set_status (msg, SOUP_STATUS_OK); 1534*4882a593Smuzhiyun+#else 1535*4882a593Smuzhiyun+ soup_server_message_set_status (msg, SOUP_STATUS_OK, NULL); 1536*4882a593Smuzhiyun+#endif 1537*4882a593Smuzhiyun } 1538*4882a593Smuzhiyun else if (g_str_equal (path, "/echo")) { 1539*4882a593Smuzhiyun const char *value; 1540*4882a593Smuzhiyun 1541*4882a593Smuzhiyun value = g_hash_table_lookup (query, "value"); 1542*4882a593Smuzhiyun+#ifdef WITH_SOUP_2 1543*4882a593Smuzhiyun soup_message_set_response (msg, "text/plain", SOUP_MEMORY_COPY, 1544*4882a593Smuzhiyun value, strlen (value)); 1545*4882a593Smuzhiyun soup_message_set_status (msg, SOUP_STATUS_OK); 1546*4882a593Smuzhiyun+#else 1547*4882a593Smuzhiyun+ soup_server_message_set_response (msg, "text/plain", SOUP_MEMORY_COPY, 1548*4882a593Smuzhiyun+ value, strlen (value)); 1549*4882a593Smuzhiyun+ soup_server_message_set_status (msg, SOUP_STATUS_OK, NULL); 1550*4882a593Smuzhiyun+#endif 1551*4882a593Smuzhiyun } 1552*4882a593Smuzhiyun else if (g_str_equal (path, "/reverse")) { 1553*4882a593Smuzhiyun char *value; 1554*4882a593Smuzhiyun@@ -70,9 +85,15 @@ server_callback (SoupServer *server, SoupMessage *msg, 1555*4882a593Smuzhiyun value = g_strdup (g_hash_table_lookup (query, "value")); 1556*4882a593Smuzhiyun g_strreverse (value); 1557*4882a593Smuzhiyun 1558*4882a593Smuzhiyun+#ifdef WITH_SOUP_2 1559*4882a593Smuzhiyun soup_message_set_response (msg, "text/plain", SOUP_MEMORY_TAKE, 1560*4882a593Smuzhiyun value, strlen (value)); 1561*4882a593Smuzhiyun soup_message_set_status (msg, SOUP_STATUS_OK); 1562*4882a593Smuzhiyun+#else 1563*4882a593Smuzhiyun+ soup_server_message_set_response (msg, "text/plain", SOUP_MEMORY_TAKE, 1564*4882a593Smuzhiyun+ value, strlen (value)); 1565*4882a593Smuzhiyun+ soup_server_message_set_status (msg, SOUP_STATUS_OK, NULL); 1566*4882a593Smuzhiyun+#endif 1567*4882a593Smuzhiyun } 1568*4882a593Smuzhiyun else if (g_str_equal (path, "/status")) { 1569*4882a593Smuzhiyun const char *value; 1570*4882a593Smuzhiyun@@ -81,25 +102,61 @@ server_callback (SoupServer *server, SoupMessage *msg, 1571*4882a593Smuzhiyun value = g_hash_table_lookup (query, "status"); 1572*4882a593Smuzhiyun if (value) { 1573*4882a593Smuzhiyun status = atoi (value); 1574*4882a593Smuzhiyun+#ifdef WITH_SOUP_2 1575*4882a593Smuzhiyun soup_message_set_status (msg, status ?: SOUP_STATUS_INTERNAL_SERVER_ERROR); 1576*4882a593Smuzhiyun+#else 1577*4882a593Smuzhiyun+ soup_server_message_set_status (msg, status ?: SOUP_STATUS_INTERNAL_SERVER_ERROR, NULL); 1578*4882a593Smuzhiyun+#endif 1579*4882a593Smuzhiyun } else { 1580*4882a593Smuzhiyun+#ifdef WITH_SOUP_2 1581*4882a593Smuzhiyun soup_message_set_status (msg, SOUP_STATUS_INTERNAL_SERVER_ERROR); 1582*4882a593Smuzhiyun+#else 1583*4882a593Smuzhiyun+ soup_server_message_set_status (msg, SOUP_STATUS_INTERNAL_SERVER_ERROR, NULL); 1584*4882a593Smuzhiyun+#endif 1585*4882a593Smuzhiyun } 1586*4882a593Smuzhiyun } 1587*4882a593Smuzhiyun else if (g_str_equal (path, "/useragent/none")) { 1588*4882a593Smuzhiyun- if (soup_message_headers_get (msg->request_headers, "User-Agent") == NULL) { 1589*4882a593Smuzhiyun+#ifdef WITH_SOUP_2 1590*4882a593Smuzhiyun+ SoupMessageHeaders *request_headers = msg->request_headers; 1591*4882a593Smuzhiyun+#else 1592*4882a593Smuzhiyun+ SoupMessageHeaders *request_headers = soup_server_message_get_request_headers (msg); 1593*4882a593Smuzhiyun+#endif 1594*4882a593Smuzhiyun+ 1595*4882a593Smuzhiyun+ if (soup_message_headers_get (request_headers, "User-Agent") == NULL) { 1596*4882a593Smuzhiyun+#ifdef WITH_SOUP_2 1597*4882a593Smuzhiyun soup_message_set_status (msg, SOUP_STATUS_OK); 1598*4882a593Smuzhiyun+#else 1599*4882a593Smuzhiyun+ soup_server_message_set_status (msg, SOUP_STATUS_OK, NULL); 1600*4882a593Smuzhiyun+#endif 1601*4882a593Smuzhiyun } else { 1602*4882a593Smuzhiyun+#ifdef WITH_SOUP_2 1603*4882a593Smuzhiyun soup_message_set_status (msg, SOUP_STATUS_EXPECTATION_FAILED); 1604*4882a593Smuzhiyun+#else 1605*4882a593Smuzhiyun+ soup_server_message_set_status (msg, SOUP_STATUS_EXPECTATION_FAILED, NULL); 1606*4882a593Smuzhiyun+#endif 1607*4882a593Smuzhiyun } 1608*4882a593Smuzhiyun } 1609*4882a593Smuzhiyun else if (g_str_equal (path, "/useragent/testsuite")) { 1610*4882a593Smuzhiyun+#ifdef WITH_SOUP_2 1611*4882a593Smuzhiyun+ SoupMessageHeaders *request_headers = msg->request_headers; 1612*4882a593Smuzhiyun+#else 1613*4882a593Smuzhiyun+ SoupMessageHeaders *request_headers = soup_server_message_get_request_headers (msg); 1614*4882a593Smuzhiyun+#endif 1615*4882a593Smuzhiyun const char *value; 1616*4882a593Smuzhiyun- value = soup_message_headers_get (msg->request_headers, "User-Agent"); 1617*4882a593Smuzhiyun+ value = soup_message_headers_get (request_headers, "User-Agent"); 1618*4882a593Smuzhiyun if (g_strcmp0 (value, "TestSuite-1.0") == 0) { 1619*4882a593Smuzhiyun+#ifdef WITH_SOUP_2 1620*4882a593Smuzhiyun soup_message_set_status (msg, SOUP_STATUS_OK); 1621*4882a593Smuzhiyun+#else 1622*4882a593Smuzhiyun+ soup_server_message_set_status (msg, SOUP_STATUS_OK, NULL); 1623*4882a593Smuzhiyun+#endif 1624*4882a593Smuzhiyun } else { 1625*4882a593Smuzhiyun+#ifdef WITH_SOUP_2 1626*4882a593Smuzhiyun soup_message_set_status (msg, SOUP_STATUS_EXPECTATION_FAILED); 1627*4882a593Smuzhiyun+#else 1628*4882a593Smuzhiyun+ soup_server_message_set_status (msg, SOUP_STATUS_EXPECTATION_FAILED, NULL); 1629*4882a593Smuzhiyun+#endif 1630*4882a593Smuzhiyun+ 1631*4882a593Smuzhiyun } 1632*4882a593Smuzhiyun } 1633*4882a593Smuzhiyun } 1634*4882a593Smuzhiyun@@ -325,7 +382,7 @@ main (int argc, char **argv) 1635*4882a593Smuzhiyun char *url; 1636*4882a593Smuzhiyun RestProxy *proxy; 1637*4882a593Smuzhiyun 1638*4882a593Smuzhiyun- server = soup_server_new ("", NULL); 1639*4882a593Smuzhiyun+ server = soup_server_new (NULL); 1640*4882a593Smuzhiyun g_thread_new ("Server Thread", server_thread_func, NULL); 1641*4882a593Smuzhiyun 1642*4882a593Smuzhiyun url = g_strdup_printf ("http://127.0.0.1:%d/", PORT); 1643*4882a593Smuzhiyundiff --git a/tests/threaded.c b/tests/threaded.c 1644*4882a593Smuzhiyunindex a251900..411361c 100644 1645*4882a593Smuzhiyun--- a/tests/threaded.c 1646*4882a593Smuzhiyun+++ b/tests/threaded.c 1647*4882a593Smuzhiyun@@ -36,13 +36,22 @@ GMainLoop *main_loop; 1648*4882a593Smuzhiyun SoupServer *server; 1649*4882a593Smuzhiyun 1650*4882a593Smuzhiyun static void 1651*4882a593Smuzhiyun+#ifdef WITH_SOUP_2 1652*4882a593Smuzhiyun server_callback (SoupServer *server, SoupMessage *msg, 1653*4882a593Smuzhiyun const char *path, GHashTable *query, 1654*4882a593Smuzhiyun SoupClientContext *client, gpointer user_data) 1655*4882a593Smuzhiyun+#else 1656*4882a593Smuzhiyun+server_callback (SoupServer *server, SoupServerMessage *msg, 1657*4882a593Smuzhiyun+ const char *path, GHashTable *query, gpointer user_data) 1658*4882a593Smuzhiyun+#endif 1659*4882a593Smuzhiyun { 1660*4882a593Smuzhiyun g_assert_cmpstr (path, ==, "/ping"); 1661*4882a593Smuzhiyun 1662*4882a593Smuzhiyun+#ifdef WITH_SOUP_2 1663*4882a593Smuzhiyun soup_message_set_status (msg, SOUP_STATUS_OK); 1664*4882a593Smuzhiyun+#else 1665*4882a593Smuzhiyun+ soup_server_message_set_status (msg, SOUP_STATUS_OK, NULL); 1666*4882a593Smuzhiyun+#endif 1667*4882a593Smuzhiyun g_atomic_int_add (&threads_done, 1); 1668*4882a593Smuzhiyun 1669*4882a593Smuzhiyun if (threads_done == N_THREADS) { 1670*4882a593Smuzhiyun@@ -96,7 +105,11 @@ static void ping () 1671*4882a593Smuzhiyun uris = soup_server_get_uris (server); 1672*4882a593Smuzhiyun g_assert (g_slist_length (uris) > 0); 1673*4882a593Smuzhiyun 1674*4882a593Smuzhiyun+#ifdef WITH_SOUP_2 1675*4882a593Smuzhiyun url = soup_uri_to_string (uris->data, FALSE); 1676*4882a593Smuzhiyun+#else 1677*4882a593Smuzhiyun+ url = g_uri_to_string (uris->data); 1678*4882a593Smuzhiyun+#endif 1679*4882a593Smuzhiyun 1680*4882a593Smuzhiyun main_loop = g_main_loop_new (NULL, TRUE); 1681*4882a593Smuzhiyun 1682*4882a593Smuzhiyun@@ -109,7 +122,11 @@ static void ping () 1683*4882a593Smuzhiyun g_main_loop_run (main_loop); 1684*4882a593Smuzhiyun 1685*4882a593Smuzhiyun g_free (url); 1686*4882a593Smuzhiyun+#ifdef WITH_SOUP_2 1687*4882a593Smuzhiyun g_slist_free_full (uris, (GDestroyNotify)soup_uri_free); 1688*4882a593Smuzhiyun+#else 1689*4882a593Smuzhiyun+ g_slist_free_full (uris, (GDestroyNotify)g_uri_unref); 1690*4882a593Smuzhiyun+#endif 1691*4882a593Smuzhiyun g_object_unref (server); 1692*4882a593Smuzhiyun g_main_loop_unref (main_loop); 1693*4882a593Smuzhiyun } 1694*4882a593Smuzhiyun-- 1695*4882a593Smuzhiyun2.33.1 1696*4882a593Smuzhiyun 1697