From: Marc-André Lureau <marcandre.lureau@xxxxxxxxxx> That HTTP proxy code has been added to glib 2.43.92. Signed-off-by: Marc-André Lureau <marcandre.lureau@xxxxxxxxxx> --- doc/reference/Makefile.am | 1 - src/Makefile.am | 2 - src/spice-session.c | 4 - src/wocky-http-proxy.c | 522 ---------------------------------------------- src/wocky-http-proxy.h | 54 ----- 5 files changed, 583 deletions(-) delete mode 100644 src/wocky-http-proxy.c delete mode 100644 src/wocky-http-proxy.h diff --git a/doc/reference/Makefile.am b/doc/reference/Makefile.am index c7d09f0..9fda456 100644 --- a/doc/reference/Makefile.am +++ b/doc/reference/Makefile.am @@ -58,7 +58,6 @@ IGNORE_HFILES= \ vmcstream.h \ vncdisplaykeymap.h \ win-usb-dev.h \ - wocky-http-proxy.h \ $(NULL) # CFLAGS and LDFLAGS for compiling gtkdoc-scangobj with your library. diff --git a/src/Makefile.am b/src/Makefile.am index 4dbc2eb..4b6e46d 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -255,8 +255,6 @@ libspice_client_glib_2_0_la_SOURCES = \ $(USB_ACL_HELPER_SRCS) \ vmcstream.c \ vmcstream.h \ - wocky-http-proxy.c \ - wocky-http-proxy.h \ \ decode.h \ decode-glz.c \ diff --git a/src/spice-session.c b/src/spice-session.c index a729cc3..d236808 100644 --- a/src/spice-session.c +++ b/src/spice-session.c @@ -30,7 +30,6 @@ #include "spice-util-priv.h" #include "spice-session-priv.h" #include "gio-coroutine.h" -#include "wocky-http-proxy.h" #include "spice-uri-priv.h" #include "channel-playback-priv.h" #include "spice-audio-priv.h" @@ -845,9 +844,6 @@ static void spice_session_class_init(SpiceSessionClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS(klass); - _wocky_http_proxy_get_type(); - _wocky_https_proxy_get_type(); - gobject_class->dispose = spice_session_dispose; gobject_class->finalize = spice_session_finalize; gobject_class->get_property = spice_session_get_property; diff --git a/src/wocky-http-proxy.c b/src/wocky-http-proxy.c deleted file mode 100644 index 8120a55..0000000 --- a/src/wocky-http-proxy.c +++ /dev/null @@ -1,522 +0,0 @@ - /* wocky-http-proxy.c: Source for WockyHttpProxy - * - * Copyright (C) 2010 Collabora, Ltd. - * Copyright (C) 2014 Red Hat, Inc. - * @author Nicolas Dufresne <nicolas.dufresne@xxxxxxxxxxxxxxx> - * @author Marc-André Lureau <marcandre.lureau@xxxxxxxxxx> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include "config.h" - -#include "wocky-http-proxy.h" - -#include <string.h> -#include <stdlib.h> - - -struct _WockyHttpProxy -{ - GObject parent; -}; - -struct _WockyHttpProxyClass -{ - GObjectClass parent_class; -}; - -static void wocky_http_proxy_iface_init (GProxyInterface *proxy_iface); - -#define wocky_http_proxy_get_type _wocky_http_proxy_get_type -G_DEFINE_TYPE_WITH_CODE (WockyHttpProxy, wocky_http_proxy, G_TYPE_OBJECT, - G_IMPLEMENT_INTERFACE (G_TYPE_PROXY, - wocky_http_proxy_iface_init) - g_io_extension_point_set_required_type ( - g_io_extension_point_register (G_PROXY_EXTENSION_POINT_NAME), - G_TYPE_PROXY); - g_io_extension_point_implement (G_PROXY_EXTENSION_POINT_NAME, - g_define_type_id, "http", 0)) - -static void -wocky_http_proxy_init (WockyHttpProxy *proxy) -{ -} - -#define HTTP_END_MARKER "\r\n\r\n" - -static gchar * -create_request (GProxyAddress *proxy_address, gboolean *has_cred) -{ - const gchar *hostname; - gint port; - const gchar *username; - const gchar *password; - GString *request; - gchar *ascii_hostname; - - if (has_cred) - *has_cred = FALSE; - - hostname = g_proxy_address_get_destination_hostname (proxy_address); - port = g_proxy_address_get_destination_port (proxy_address); - username = g_proxy_address_get_username (proxy_address); - password = g_proxy_address_get_password (proxy_address); - - request = g_string_new (NULL); - - ascii_hostname = g_hostname_to_ascii (hostname); - g_string_append_printf (request, - "CONNECT %s:%i HTTP/1.0\r\n" - "Host: %s:%i\r\n" - "Proxy-Connection: keep-alive\r\n" - "User-Agent: GLib/%i.%i\r\n", - ascii_hostname, port, - ascii_hostname, port, - GLIB_MAJOR_VERSION, GLIB_MINOR_VERSION); - g_free (ascii_hostname); - - if (username != NULL && password != NULL) - { - gchar *cred; - gchar *base64_cred; - - if (has_cred) - *has_cred = TRUE; - - cred = g_strdup_printf ("%s:%s", username, password); - base64_cred = g_base64_encode ((guchar *) cred, strlen (cred)); - g_free (cred); - g_string_append_printf (request, - "Proxy-Authorization: Basic %s\r\n", - base64_cred); - g_free (base64_cred); - } - - g_string_append (request, "\r\n"); - - return g_string_free (request, FALSE); -} - -static gboolean -check_reply (const gchar *buffer, gboolean has_cred, GError **error) -{ - gint err_code; - const gchar *ptr = buffer + 7; - - if (strncmp (buffer, "HTTP/1.", 7) != 0 - || (*ptr != '0' && *ptr != '1')) - { - g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_PROXY_FAILED, - "Bad HTTP proxy reply"); - return FALSE; - } - - ptr++; - while (*ptr == ' ') ptr++; - - err_code = atoi (ptr); - - if (err_code < 200 || err_code >= 300) - { - const gchar *msg_start; - gchar *msg; - - while (g_ascii_isdigit (*ptr)) - ptr++; - - while (*ptr == ' ') - ptr++; - - msg_start = ptr; - - ptr = strchr (msg_start, '\r'); - - if (ptr == NULL) - ptr = strchr (msg_start, '\0'); - - msg = g_strndup (msg_start, ptr - msg_start); - - if (err_code == 407) - { - if (has_cred) - g_set_error (error, G_IO_ERROR, G_IO_ERROR_PROXY_AUTH_FAILED, - "HTTP proxy authentication failed"); - else - g_set_error (error, G_IO_ERROR, G_IO_ERROR_PROXY_NEED_AUTH, - "HTTP proxy authentication required"); - } - else if (msg[0] == '\0') - g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_PROXY_FAILED, - "Connection failed due to broken HTTP reply"); - else - g_set_error (error, G_IO_ERROR, G_IO_ERROR_PROXY_FAILED, - "HTTP proxy connection failed: %i %s", - err_code, msg); - - g_free (msg); - return FALSE; - } - - return TRUE; -} - -static GIOStream * -wocky_http_proxy_connect (GProxy *proxy, - GIOStream *io_stream, - GProxyAddress *proxy_address, - GCancellable *cancellable, - GError **error) -{ - GInputStream *in; - GOutputStream *out; - GDataInputStream *data_in = NULL; - gchar *buffer = NULL; - gboolean has_cred; - GIOStream *tlsconn = NULL; - - if (WOCKY_IS_HTTPS_PROXY (proxy)) - { - tlsconn = g_tls_client_connection_new (io_stream, - G_SOCKET_CONNECTABLE(proxy_address), - error); - if (!tlsconn) - goto error; - - GTlsCertificateFlags tls_validation_flags = G_TLS_CERTIFICATE_VALIDATE_ALL; -#ifdef DEBUG - tls_validation_flags &= ~(G_TLS_CERTIFICATE_UNKNOWN_CA | G_TLS_CERTIFICATE_BAD_IDENTITY); -#endif - g_tls_client_connection_set_validation_flags (G_TLS_CLIENT_CONNECTION (tlsconn), - tls_validation_flags); - if (!g_tls_connection_handshake (G_TLS_CONNECTION (tlsconn), cancellable, error)) - goto error; - - io_stream = tlsconn; - } - - in = g_io_stream_get_input_stream (io_stream); - out = g_io_stream_get_output_stream (io_stream); - - data_in = g_data_input_stream_new (in); - g_filter_input_stream_set_close_base_stream (G_FILTER_INPUT_STREAM (data_in), - FALSE); - - buffer = create_request (proxy_address, &has_cred); - if (!g_output_stream_write_all (out, buffer, strlen (buffer), NULL, - cancellable, error)) - goto error; - - g_free (buffer); - buffer = g_data_input_stream_read_until (data_in, HTTP_END_MARKER, NULL, - cancellable, error); - g_clear_object(&data_in); - - if (buffer == NULL) - { - if (error && (*error == NULL)) - g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_PROXY_FAILED, - "HTTP proxy server closed connection unexpectedly."); - goto error; - } - - if (!check_reply (buffer, has_cred, error)) - goto error; - - g_free (buffer); - - g_object_ref (io_stream); - g_clear_object (&tlsconn); - - return io_stream; - -error: - g_clear_object (&tlsconn); - g_clear_object (&data_in); - g_free (buffer); - return NULL; -} - - -typedef struct -{ - GIOStream *io_stream; - gchar *buffer; - gssize length; - gssize offset; - GDataInputStream *data_in; - gboolean has_cred; -} ConnectAsyncData; - -static void request_write_cb (GObject *source, - GAsyncResult *res, - gpointer user_data); -static void reply_read_cb (GObject *source, - GAsyncResult *res, - gpointer user_data); - -static void -free_connect_data (ConnectAsyncData *data) -{ - if (data->io_stream != NULL) - g_object_unref (data->io_stream); - - g_free (data->buffer); - - if (data->data_in != NULL) - g_object_unref (data->data_in); - - g_free (data); -} - -static void -complete_async_from_error (GTask *task, GError *error) -{ - if (error == NULL) - g_set_error_literal (&error, G_IO_ERROR, G_IO_ERROR_PROXY_FAILED, - "HTTP proxy server closed connection unexpectedly."); - - g_task_return_error (task, error); - g_object_unref (task); -} - -static void -do_write (GAsyncReadyCallback callback, GTask *task) -{ - GOutputStream *out; - ConnectAsyncData *data = g_task_get_task_data (task); - out = g_io_stream_get_output_stream (data->io_stream); - g_output_stream_write_async (out, - data->buffer + data->offset, - data->length - data->offset, - G_PRIORITY_DEFAULT, g_task_get_cancellable(task), - callback, task); -} - -static void -stream_connected (GTask *task, - GIOStream *io_stream) -{ - GInputStream *in; - ConnectAsyncData *data = g_task_get_task_data (task); - - data->io_stream = g_object_ref (io_stream); - in = g_io_stream_get_input_stream (io_stream); - data->data_in = g_data_input_stream_new (in); - g_filter_input_stream_set_close_base_stream (G_FILTER_INPUT_STREAM (data->data_in), - FALSE); - - do_write (request_write_cb, task); -} - -static void -handshake_completed (GObject *source_object, - GAsyncResult *res, - gpointer user_data) -{ - GTlsConnection *conn = G_TLS_CONNECTION (source_object); - GTask *task = G_TASK (user_data); - GError *error = NULL; - - if (!g_tls_connection_handshake_finish (conn, res, &error)) - { - complete_async_from_error (task, error); - return; - } - - stream_connected (task, G_IO_STREAM (conn)); -} - -static void -wocky_http_proxy_connect_async (GProxy *proxy, - GIOStream *io_stream, - GProxyAddress *proxy_address, - GCancellable *cancellable, - GAsyncReadyCallback callback, - gpointer user_data) -{ - GTask *task; - ConnectAsyncData *data; - - task = g_task_new (proxy, - cancellable, - callback, - user_data); - - data = g_new0 (ConnectAsyncData, 1); - - data->buffer = create_request (proxy_address, &data->has_cred); - data->length = strlen (data->buffer); - data->offset = 0; - - g_task_set_task_data (task, data, (GDestroyNotify)free_connect_data); - - if (WOCKY_IS_HTTPS_PROXY (proxy)) - { - GError *error = NULL; - GIOStream *tlsconn; - - tlsconn = g_tls_client_connection_new (io_stream, - G_SOCKET_CONNECTABLE(proxy_address), - &error); - if (!tlsconn) - { - complete_async_from_error (task, error); - return; - } - - g_return_if_fail (tlsconn != NULL); - - GTlsCertificateFlags tls_validation_flags = G_TLS_CERTIFICATE_VALIDATE_ALL; -#ifdef DEBUG - tls_validation_flags &= ~(G_TLS_CERTIFICATE_UNKNOWN_CA | G_TLS_CERTIFICATE_BAD_IDENTITY); -#endif - g_tls_client_connection_set_validation_flags (G_TLS_CLIENT_CONNECTION (tlsconn), - tls_validation_flags); - g_tls_connection_handshake_async (G_TLS_CONNECTION (tlsconn), - G_PRIORITY_DEFAULT, cancellable, - handshake_completed, task); - } - else - { - stream_connected (task, io_stream); - } -} - -static void -request_write_cb (GObject *source, - GAsyncResult *res, - gpointer user_data) -{ - GError *error = NULL; - GTask *task = G_TASK(user_data); - ConnectAsyncData *data = g_task_get_task_data (task); - gssize written; - - written = g_output_stream_write_finish (G_OUTPUT_STREAM (source), - res, &error); - if (written < 0) - { - complete_async_from_error (task, error); - return; - } - - data->offset += written; - - if (data->offset == data->length) - { - g_clear_pointer(&data->buffer, g_free); - - g_data_input_stream_read_until_async (data->data_in, - HTTP_END_MARKER, - G_PRIORITY_DEFAULT, - g_task_get_cancellable(task), - reply_read_cb, task); - - } - else - { - do_write (request_write_cb, task); - } -} - -static void -reply_read_cb (GObject *source, - GAsyncResult *res, - gpointer user_data) -{ - GError *error = NULL; - GTask *task = G_TASK(user_data); - ConnectAsyncData *data = g_task_get_task_data (task); - - data->buffer = g_data_input_stream_read_until_finish (data->data_in, - res, NULL, &error); - - if (data->buffer == NULL) - { - complete_async_from_error (task, error); - return; - } - - if (!check_reply (data->buffer, data->has_cred, &error)) - { - complete_async_from_error (task, error); - return; - } - - g_task_return_pointer (task, data->io_stream, (GDestroyNotify) g_object_unref); - data->io_stream = NULL; - g_object_unref (task); -} - -static GIOStream * -wocky_http_proxy_connect_finish (GProxy *proxy, - GAsyncResult *result, - GError **error) -{ - GTask *task = G_TASK (result); - - return g_task_propagate_pointer (task, error); -} - -static gboolean -wocky_http_proxy_supports_hostname (GProxy *proxy) -{ - return TRUE; -} - -static void -wocky_http_proxy_class_init (WockyHttpProxyClass *class) -{ -} - -static void -wocky_http_proxy_iface_init (GProxyInterface *proxy_iface) -{ - proxy_iface->connect = wocky_http_proxy_connect; - proxy_iface->connect_async = wocky_http_proxy_connect_async; - proxy_iface->connect_finish = wocky_http_proxy_connect_finish; - proxy_iface->supports_hostname = wocky_http_proxy_supports_hostname; -} - -struct _WockyHttpsProxy -{ - WockyHttpProxy parent; -}; - -struct _WockyHttpsProxyClass -{ - WockyHttpProxyClass parent_class; -}; - -#define wocky_https_proxy_get_type _wocky_https_proxy_get_type -G_DEFINE_TYPE_WITH_CODE (WockyHttpsProxy, wocky_https_proxy, WOCKY_TYPE_HTTP_PROXY, - G_IMPLEMENT_INTERFACE (G_TYPE_PROXY, - wocky_http_proxy_iface_init) - g_io_extension_point_set_required_type ( - g_io_extension_point_register (G_PROXY_EXTENSION_POINT_NAME), - G_TYPE_PROXY); - g_io_extension_point_implement (G_PROXY_EXTENSION_POINT_NAME, - g_define_type_id, "https", 0)) - -static void -wocky_https_proxy_init (WockyHttpsProxy *proxy) -{ -} - -static void -wocky_https_proxy_class_init (WockyHttpsProxyClass *class) -{ -} diff --git a/src/wocky-http-proxy.h b/src/wocky-http-proxy.h deleted file mode 100644 index 38dad78..0000000 --- a/src/wocky-http-proxy.h +++ /dev/null @@ -1,54 +0,0 @@ - /* wocky-http-proxy.h: Header for WockyHttpProxy - * - * Copyright (C) 2010 Collabora, Ltd. - * @author Nicolas Dufresne <nicolas.dufresne@xxxxxxxxxxxxxxx> - * - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ -#ifndef _WOCKY_HTTP_PROXY_H_ -#define _WOCKY_HTTP_PROXY_H_ - -#include <gio/gio.h> - -G_BEGIN_DECLS - -#define WOCKY_TYPE_HTTP_PROXY (_wocky_http_proxy_get_type ()) -#define WOCKY_HTTP_PROXY(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), WOCKY_TYPE_HTTP_PROXY, WockyHttpProxy)) -#define WOCKY_HTTP_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), WOCKY_TYPE_HTTP_PROXY, WockyHttpProxyClass)) -#define WOCKY_IS_HTTP_PROXY(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), WOCKY_TYPE_HTTP_PROXY)) -#define WOCKY_IS_HTTP_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), WOCKY_TYPE_HTTP_PROXY)) -#define WOCKY_HTTP_PROXY_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), WOCKY_TYPE_HTTP_PROXY, WockyHttpProxyClass)) - -typedef struct _WockyHttpProxy WockyHttpProxy; -typedef struct _WockyHttpProxyClass WockyHttpProxyClass; - -GType _wocky_http_proxy_get_type (void); - -#define WOCKY_TYPE_HTTPS_PROXY (_wocky_https_proxy_get_type ()) -#define WOCKY_HTTPS_PROXY(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), WOCKY_TYPE_HTTPS_PROXY, WockyHttpsProxy)) -#define WOCKY_HTTPS_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), WOCKY_TYPE_HTTPS_PROXY, WockyHttpsProxyClass)) -#define WOCKY_IS_HTTPS_PROXY(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), WOCKY_TYPE_HTTPS_PROXY)) -#define WOCKY_IS_HTTPS_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), WOCKY_TYPE_HTTPS_PROXY)) -#define WOCKY_HTTPS_PROXY_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), WOCKY_TYPE_HTTPS_PROXY, WockyHttpsProxyClass)) - -typedef struct _WockyHttpsProxy WockyHttpsProxy; -typedef struct _WockyHttpsProxyClass WockyHttpsProxyClass; - -GType _wocky_https_proxy_get_type (void); - -G_END_DECLS - -#endif /* _WOCKY_HTTP_PROXY_H_ */ -- 2.14.0.rc0.1.g40ca67566 _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/spice-devel