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