1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
3 * soup-socket.c: Socket networking code.
5 * Copyright (C) 2000-2003, Ximian, Inc.
14 #include <glib/gi18n-lib.h>
15 #include <gio/gnetworking.h>
17 #include "soup-socket.h"
18 #include "soup-socket-private.h"
20 #include "soup-filter-input-stream.h"
21 #include "soup-io-stream.h"
25 * @short_description: A network socket
27 * #SoupSocket is libsoup's TCP socket type. While it is primarily
28 * intended for internal use, #SoupSocket<!-- -->s are exposed in the
29 * API in various places, and some of their methods (eg,
30 * soup_socket_get_remote_address()) may be useful to applications.
42 static guint signals[LAST_SIGNAL] = { 0 };
59 PROP_USE_THREAD_CONTEXT,
61 PROP_TRUSTED_CERTIFICATE,
64 PROP_SOCKET_PROPERTIES,
70 SoupAddress *local_addr, *remote_addr;
71 GIOStream *conn, *iostream;
73 GInputStream *istream;
74 GOutputStream *ostream;
75 GTlsCertificateFlags tls_errors;
76 GTlsInteraction *tls_interaction;
77 GProxyResolver *proxy_resolver;
85 guint clean_dispose:1;
86 guint use_thread_context:1;
89 GMainContext *async_context;
91 GSource *read_src, *write_src;
93 GMutex iolock, addrlock;
96 GCancellable *connect_cancel;
100 static void soup_socket_initable_interface_init (GInitableIface *initable_interface);
102 G_DEFINE_TYPE_WITH_CODE (SoupSocket, soup_socket, G_TYPE_OBJECT,
103 G_ADD_PRIVATE (SoupSocket)
104 G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE,
105 soup_socket_initable_interface_init))
107 static void soup_socket_peer_certificate_changed (GObject *conn,
110 static void finish_socket_setup (SoupSocket *sock);
111 static void finish_listener_setup (SoupSocket *sock);
114 soup_socket_init (SoupSocket *sock)
116 SoupSocketPrivate *priv = soup_socket_get_instance_private (sock);
118 priv->non_blocking = TRUE;
120 g_mutex_init (&priv->addrlock);
121 g_mutex_init (&priv->iolock);
125 soup_socket_initable_init (GInitable *initable,
126 GCancellable *cancellable,
129 SoupSocket *sock = SOUP_SOCKET (initable);
130 SoupSocketPrivate *priv = soup_socket_get_instance_private (sock);
133 g_warn_if_fail (priv->gsock == NULL);
134 g_warn_if_fail (priv->fd == -1);
136 finish_socket_setup (sock);
139 if (priv->fd != -1) {
140 guint type, len = sizeof (type);
142 g_warn_if_fail (priv->gsock == NULL);
144 /* GSocket will g_error() this, so we have to check ourselves. */
145 if (getsockopt (priv->fd, SOL_SOCKET, SO_TYPE,
146 (gpointer)&type, (gpointer)&len) == -1) {
147 g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED,
148 _("Can’t import non-socket as SoupSocket"));
152 priv->gsock = g_socket_new_from_fd (priv->fd, error);
157 if (priv->gsock != NULL) {
160 g_warn_if_fail (priv->local_addr == NULL);
161 g_warn_if_fail (priv->remote_addr == NULL);
163 if (!g_socket_get_option (priv->gsock,
164 SOL_SOCKET, SO_ACCEPTCONN,
165 &listening, error)) {
166 g_prefix_error (error, _("Could not import existing socket: "));
170 finish_socket_setup (sock);
172 finish_listener_setup (sock);
173 else if (!g_socket_is_connected (priv->gsock)) {
174 g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED,
175 _("Can’t import unconnected socket"));
184 disconnect_internal (SoupSocket *sock, gboolean close)
186 SoupSocketPrivate *priv = soup_socket_get_instance_private (sock);
188 g_clear_object (&priv->gsock);
189 if (priv->conn && close) {
190 g_io_stream_close (priv->conn, NULL, NULL);
191 g_signal_handlers_disconnect_by_data (priv->conn, sock);
192 g_clear_object (&priv->conn);
195 if (priv->read_src) {
196 g_source_destroy (priv->read_src);
197 priv->read_src = NULL;
199 if (priv->write_src) {
200 g_source_destroy (priv->write_src);
201 priv->write_src = NULL;
206 soup_socket_finalize (GObject *object)
208 SoupSocket *sock = SOUP_SOCKET (object);
209 SoupSocketPrivate *priv = soup_socket_get_instance_private (sock);
211 if (priv->connect_cancel) {
212 if (priv->clean_dispose)
213 g_warning ("Disposing socket %p during connect", object);
214 g_object_unref (priv->connect_cancel);
217 if (priv->clean_dispose)
218 g_warning ("Disposing socket %p while still connected", object);
219 disconnect_internal (SOUP_SOCKET (object), TRUE);
222 g_clear_object (&priv->conn);
223 g_clear_object (&priv->iostream);
224 g_clear_object (&priv->istream);
225 g_clear_object (&priv->ostream);
227 g_clear_object (&priv->local_addr);
228 g_clear_object (&priv->remote_addr);
230 g_clear_object (&priv->tls_interaction);
231 g_clear_object (&priv->proxy_resolver);
232 g_clear_object (&priv->ssl_creds);
234 if (priv->watch_src) {
235 if (priv->clean_dispose && !priv->is_server)
236 g_warning ("Disposing socket %p during async op", object);
237 g_source_destroy (priv->watch_src);
239 g_clear_pointer (&priv->async_context, g_main_context_unref);
241 g_mutex_clear (&priv->addrlock);
242 g_mutex_clear (&priv->iolock);
244 G_OBJECT_CLASS (soup_socket_parent_class)->finalize (object);
248 finish_socket_setup (SoupSocket *sock)
250 SoupSocketPrivate *priv = soup_socket_get_instance_private (sock);
254 priv->conn = (GIOStream *)g_socket_connection_factory_create_connection (priv->gsock);
256 g_socket_set_timeout (priv->gsock, priv->timeout);
257 g_socket_set_option (priv->gsock, IPPROTO_TCP, TCP_NODELAY, TRUE, NULL);
264 priv->iostream = soup_io_stream_new (priv->conn, FALSE);
266 priv->istream = g_object_ref (g_io_stream_get_input_stream (priv->iostream));
268 priv->ostream = g_object_ref (g_io_stream_get_output_stream (priv->iostream));
272 soup_socket_set_property (GObject *object, guint prop_id,
273 const GValue *value, GParamSpec *pspec)
275 SoupSocket *sock = SOUP_SOCKET (object);
276 SoupSocketPrivate *priv = soup_socket_get_instance_private (sock);
277 SoupSocketProperties *props;
281 priv->fd = g_value_get_int (value);
284 priv->gsock = g_value_dup_object (value);
287 priv->conn = g_value_dup_object (value);
289 case PROP_LOCAL_ADDRESS:
290 priv->local_addr = g_value_dup_object (value);
292 case PROP_REMOTE_ADDRESS:
293 priv->remote_addr = g_value_dup_object (value);
295 case PROP_NON_BLOCKING:
296 priv->non_blocking = g_value_get_boolean (value);
299 priv->ipv6_only = g_value_get_boolean (value);
301 case PROP_SSL_CREDENTIALS:
302 priv->ssl_creds = g_value_get_pointer (value);
304 g_object_ref (priv->ssl_creds);
306 case PROP_SSL_STRICT:
307 priv->ssl_strict = g_value_get_boolean (value);
309 case PROP_SSL_FALLBACK:
310 priv->ssl_fallback = g_value_get_boolean (value);
312 case PROP_ASYNC_CONTEXT:
313 if (!priv->use_thread_context) {
314 priv->async_context = g_value_get_pointer (value);
315 if (priv->async_context)
316 g_main_context_ref (priv->async_context);
319 case PROP_USE_THREAD_CONTEXT:
320 priv->use_thread_context = g_value_get_boolean (value);
321 if (priv->use_thread_context) {
322 g_clear_pointer (&priv->async_context, g_main_context_unref);
323 priv->async_context = g_main_context_ref_thread_default ();
327 priv->timeout = g_value_get_uint (value);
329 g_socket_set_timeout (priv->gsock, priv->timeout);
331 case PROP_SOCKET_PROPERTIES:
332 props = g_value_get_boxed (value);
334 g_clear_pointer (&priv->async_context, g_main_context_unref);
335 if (props->use_thread_context) {
336 priv->use_thread_context = TRUE;
337 priv->async_context = g_main_context_ref_thread_default ();
339 priv->use_thread_context = FALSE;
340 if (props->async_context)
341 priv->async_context = g_main_context_ref (props->async_context);
344 g_clear_object (&priv->proxy_resolver);
345 if (props->proxy_resolver)
346 priv->proxy_resolver = g_object_ref (props->proxy_resolver);
348 g_clear_object (&priv->local_addr);
349 if (props->local_addr)
350 priv->local_addr = g_object_ref (props->local_addr);
352 g_clear_object (&priv->ssl_creds);
354 priv->ssl_creds = g_object_ref (props->tlsdb);
355 g_clear_object (&priv->tls_interaction);
356 if (props->tls_interaction)
357 priv->tls_interaction = g_object_ref (props->tls_interaction);
358 priv->ssl_strict = props->ssl_strict;
360 priv->timeout = props->io_timeout;
362 g_socket_set_timeout (priv->gsock, priv->timeout);
364 priv->clean_dispose = TRUE;
368 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
374 soup_socket_get_property (GObject *object, guint prop_id,
375 GValue *value, GParamSpec *pspec)
377 SoupSocket *sock = SOUP_SOCKET (object);
378 SoupSocketPrivate *priv = soup_socket_get_instance_private (sock);
382 g_value_set_int (value, priv->fd);
384 case PROP_LOCAL_ADDRESS:
385 g_value_set_object (value, soup_socket_get_local_address (SOUP_SOCKET (object)));
387 case PROP_REMOTE_ADDRESS:
388 g_value_set_object (value, soup_socket_get_remote_address (SOUP_SOCKET (object)));
390 case PROP_NON_BLOCKING:
391 g_value_set_boolean (value, priv->non_blocking);
394 g_value_set_boolean (value, priv->ipv6_only);
397 g_value_set_boolean (value, priv->is_server);
399 case PROP_SSL_CREDENTIALS:
400 g_value_set_pointer (value, priv->ssl_creds);
402 case PROP_SSL_STRICT:
403 g_value_set_boolean (value, priv->ssl_strict);
405 case PROP_SSL_FALLBACK:
406 g_value_set_boolean (value, priv->ssl_fallback);
408 case PROP_TRUSTED_CERTIFICATE:
409 g_value_set_boolean (value, priv->tls_errors == 0);
411 case PROP_ASYNC_CONTEXT:
412 g_value_set_pointer (value, priv->async_context ? g_main_context_ref (priv->async_context) : NULL);
414 case PROP_USE_THREAD_CONTEXT:
415 g_value_set_boolean (value, priv->use_thread_context);
418 g_value_set_uint (value, priv->timeout);
420 case PROP_TLS_CERTIFICATE:
421 if (G_IS_TLS_CONNECTION (priv->conn))
422 g_value_set_object (value, g_tls_connection_get_peer_certificate (G_TLS_CONNECTION (priv->conn)));
424 g_value_set_object (value, NULL);
426 case PROP_TLS_ERRORS:
427 g_value_set_flags (value, priv->tls_errors);
430 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
436 soup_socket_class_init (SoupSocketClass *socket_class)
438 GObjectClass *object_class = G_OBJECT_CLASS (socket_class);
440 /* virtual method override */
441 object_class->finalize = soup_socket_finalize;
442 object_class->set_property = soup_socket_set_property;
443 object_class->get_property = soup_socket_get_property;
448 * SoupSocket::readable:
451 * Emitted when an async socket is readable. See
452 * soup_socket_read(), soup_socket_read_until() and
453 * #SoupSocket:non-blocking.
456 g_signal_new ("readable",
457 G_OBJECT_CLASS_TYPE (object_class),
459 G_STRUCT_OFFSET (SoupSocketClass, readable),
465 * SoupSocket::writable:
468 * Emitted when an async socket is writable. See
469 * soup_socket_write() and #SoupSocket:non-blocking.
472 g_signal_new ("writable",
473 G_OBJECT_CLASS_TYPE (object_class),
475 G_STRUCT_OFFSET (SoupSocketClass, writable),
481 * SoupSocket::disconnected:
484 * Emitted when the socket is disconnected, for whatever
487 signals[DISCONNECTED] =
488 g_signal_new ("disconnected",
489 G_OBJECT_CLASS_TYPE (object_class),
491 G_STRUCT_OFFSET (SoupSocketClass, disconnected),
497 * SoupSocket::new-connection:
499 * @new: the new socket
501 * Emitted when a listening socket (set up with
502 * soup_socket_listen()) receives a new connection.
504 * You must ref the @new if you want to keep it; otherwise it
505 * will be destroyed after the signal is emitted.
507 signals[NEW_CONNECTION] =
508 g_signal_new ("new_connection",
509 G_OBJECT_CLASS_TYPE (object_class),
511 G_STRUCT_OFFSET (SoupSocketClass, new_connection),
519 * @event: the event that occurred
520 * @connection: the current connection state
522 * Emitted when a network-related event occurs. See
523 * #GSocketClient::event for more details.
528 g_signal_new ("event",
529 G_OBJECT_CLASS_TYPE (object_class),
535 G_TYPE_SOCKET_CLIENT_EVENT,
540 g_object_class_install_property (
541 object_class, PROP_FD,
542 g_param_spec_int (SOUP_SOCKET_FD,
544 "The socket's file descriptor",
546 G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY |
547 G_PARAM_STATIC_STRINGS));
548 g_object_class_install_property (
549 object_class, PROP_GSOCKET,
550 g_param_spec_object (SOUP_SOCKET_GSOCKET,
552 "The socket's underlying GSocket",
554 G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY |
555 G_PARAM_STATIC_STRINGS));
556 g_object_class_install_property (
557 object_class, PROP_IOSTREAM,
558 g_param_spec_object (SOUP_SOCKET_IOSTREAM,
560 "The socket's underlying GIOStream",
562 G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY |
563 G_PARAM_STATIC_STRINGS));
566 * SOUP_SOCKET_LOCAL_ADDRESS:
568 * Alias for the #SoupSocket:local-address property. (Address
569 * of local end of socket.)
571 g_object_class_install_property (
572 object_class, PROP_LOCAL_ADDRESS,
573 g_param_spec_object (SOUP_SOCKET_LOCAL_ADDRESS,
575 "Address of local end of socket",
577 G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY |
578 G_PARAM_STATIC_STRINGS));
580 * SOUP_SOCKET_REMOTE_ADDRESS:
582 * Alias for the #SoupSocket:remote-address property. (Address
583 * of remote end of socket.)
585 g_object_class_install_property (
586 object_class, PROP_REMOTE_ADDRESS,
587 g_param_spec_object (SOUP_SOCKET_REMOTE_ADDRESS,
589 "Address of remote end of socket",
591 G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY |
592 G_PARAM_STATIC_STRINGS));
594 * SoupSocket:non-blocking:
596 * Whether or not the socket uses non-blocking I/O.
598 * #SoupSocket's I/O methods are designed around the idea of
599 * using a single codepath for both synchronous and
600 * asynchronous I/O. If you want to read off a #SoupSocket,
601 * the "correct" way to do it is to call soup_socket_read() or
602 * soup_socket_read_until() repeatedly until you have read
603 * everything you want. If it returns %SOUP_SOCKET_WOULD_BLOCK
604 * at any point, stop reading and wait for it to emit the
605 * #SoupSocket::readable signal. Then go back to the
606 * reading-as-much-as-you-can loop. Likewise, for writing to a
607 * #SoupSocket, you should call soup_socket_write() either
608 * until you have written everything, or it returns
609 * %SOUP_SOCKET_WOULD_BLOCK (in which case you wait for
610 * #SoupSocket::writable and then go back into the loop).
612 * Code written this way will work correctly with both
613 * blocking and non-blocking sockets; blocking sockets will
614 * simply never return %SOUP_SOCKET_WOULD_BLOCK, and so the
615 * code that handles that case just won't get used for them.
618 * SOUP_SOCKET_FLAG_NONBLOCKING:
620 * Alias for the #SoupSocket:non-blocking property. (Whether
621 * or not the socket uses non-blocking I/O.)
623 g_object_class_install_property (
624 object_class, PROP_NON_BLOCKING,
625 g_param_spec_boolean (SOUP_SOCKET_FLAG_NONBLOCKING,
627 "Whether or not the socket uses non-blocking I/O",
630 G_PARAM_STATIC_STRINGS));
631 g_object_class_install_property (
632 object_class, PROP_IPV6_ONLY,
633 g_param_spec_boolean (SOUP_SOCKET_IPV6_ONLY,
638 G_PARAM_STATIC_STRINGS));
640 * SOUP_SOCKET_IS_SERVER:
642 * Alias for the #SoupSocket:is-server property, qv.
645 * SoupSocket:is-server:
647 * Whether or not the socket is a server socket.
649 * Note that for "ordinary" #SoupSockets this will be set for
650 * both listening sockets and the sockets emitted by
651 * #SoupSocket::new-connection, but for sockets created by
652 * setting #SoupSocket:fd, it will only be set for listening
655 g_object_class_install_property (
656 object_class, PROP_IS_SERVER,
657 g_param_spec_boolean (SOUP_SOCKET_IS_SERVER,
659 "Whether or not the socket is a server socket",
662 G_PARAM_STATIC_STRINGS));
664 * SOUP_SOCKET_SSL_CREDENTIALS:
666 * Alias for the #SoupSocket:ssl-creds property.
667 * (SSL credential information.)
669 /* For historical reasons, there's only a single property
670 * here, which is a GTlsDatabase for client sockets, and
671 * a GTlsCertificate for server sockets. Whee!
673 g_object_class_install_property (
674 object_class, PROP_SSL_CREDENTIALS,
675 g_param_spec_pointer (SOUP_SOCKET_SSL_CREDENTIALS,
677 "SSL credential information, passed from the session to the SSL implementation",
679 G_PARAM_STATIC_STRINGS));
681 * SOUP_SOCKET_SSL_STRICT:
683 * Alias for the #SoupSocket:ssl-strict property.
685 g_object_class_install_property (
686 object_class, PROP_SSL_STRICT,
687 g_param_spec_boolean (SOUP_SOCKET_SSL_STRICT,
688 "Strictly validate SSL certificates",
689 "Whether certificate errors should be considered a connection error",
691 G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY |
692 G_PARAM_STATIC_STRINGS));
694 * SOUP_SOCKET_SSL_FALLBACK:
696 * Alias for the #SoupSocket:ssl-fallback property.
698 g_object_class_install_property (
699 object_class, PROP_SSL_FALLBACK,
700 g_param_spec_boolean (SOUP_SOCKET_SSL_FALLBACK,
702 "Use SSLv3 instead of TLS (client-side only)",
704 G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY |
705 G_PARAM_STATIC_STRINGS));
707 * SOUP_SOCKET_TRUSTED_CERTIFICATE:
709 * Alias for the #SoupSocket:trusted-certificate
712 g_object_class_install_property (
713 object_class, PROP_TRUSTED_CERTIFICATE,
714 g_param_spec_boolean (SOUP_SOCKET_TRUSTED_CERTIFICATE,
715 "Trusted Certificate",
716 "Whether the server certificate is trusted, if this is an SSL socket",
719 G_PARAM_STATIC_STRINGS));
721 * SOUP_SOCKET_ASYNC_CONTEXT:
723 * Alias for the #SoupSocket:async-context property. (The
724 * socket's #GMainContext.)
726 g_object_class_install_property (
727 object_class, PROP_ASYNC_CONTEXT,
728 g_param_spec_pointer (SOUP_SOCKET_ASYNC_CONTEXT,
729 "Async GMainContext",
730 "The GMainContext to dispatch this socket's async I/O in",
731 G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY |
732 G_PARAM_STATIC_STRINGS));
735 * SOUP_SOCKET_USE_THREAD_CONTEXT:
737 * Alias for the #SoupSocket:use-thread-context property. (Use
738 * g_main_context_get_thread_default())
743 * SoupSocket:use-thread-context:
745 * Use g_main_context_get_thread_default().
749 g_object_class_install_property (
750 object_class, PROP_USE_THREAD_CONTEXT,
751 g_param_spec_boolean (SOUP_SOCKET_USE_THREAD_CONTEXT,
752 "Use thread context",
753 "Use g_main_context_get_thread_default",
755 G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY |
756 G_PARAM_STATIC_STRINGS));
759 * SOUP_SOCKET_TIMEOUT:
761 * Alias for the #SoupSocket:timeout property. (The timeout
762 * in seconds for blocking socket I/O operations.)
764 g_object_class_install_property (
765 object_class, PROP_TIMEOUT,
766 g_param_spec_uint (SOUP_SOCKET_TIMEOUT,
768 "Value in seconds to timeout a blocking I/O",
771 G_PARAM_STATIC_STRINGS));
774 * SOUP_SOCKET_TLS_CERTIFICATE:
776 * Alias for the #SoupSocket:tls-certificate
777 * property. Note that this property's value is only useful
778 * if the socket is for a TLS connection, and only reliable
779 * after some data has been transferred to or from it.
783 g_object_class_install_property (
784 object_class, PROP_TLS_CERTIFICATE,
785 g_param_spec_object (SOUP_SOCKET_TLS_CERTIFICATE,
787 "The peer's TLS certificate",
788 G_TYPE_TLS_CERTIFICATE,
790 G_PARAM_STATIC_STRINGS));
792 * SOUP_SOCKET_TLS_ERRORS:
794 * Alias for the #SoupSocket:tls-errors
795 * property. Note that this property's value is only useful
796 * if the socket is for a TLS connection, and only reliable
797 * after some data has been transferred to or from it.
801 g_object_class_install_property (
802 object_class, PROP_TLS_ERRORS,
803 g_param_spec_flags (SOUP_SOCKET_TLS_ERRORS,
805 "Errors with the peer's TLS certificate",
806 G_TYPE_TLS_CERTIFICATE_FLAGS, 0,
808 G_PARAM_STATIC_STRINGS));
810 g_object_class_install_property (
811 object_class, PROP_SOCKET_PROPERTIES,
812 g_param_spec_boxed (SOUP_SOCKET_SOCKET_PROPERTIES,
815 SOUP_TYPE_SOCKET_PROPERTIES,
817 G_PARAM_STATIC_STRINGS));
821 soup_socket_initable_interface_init (GInitableIface *initable_interface)
823 initable_interface->init = soup_socket_initable_init;
829 * @optname1: name of first property to set (or %NULL)
830 * @...: value of @optname1, followed by additional property/value pairs
832 * Creates a new (disconnected) socket
834 * Return value: the new socket
837 soup_socket_new (const char *optname1, ...)
842 va_start (ap, optname1);
843 sock = (SoupSocket *)g_object_new_valist (SOUP_TYPE_SOCKET,
851 soup_socket_event (SoupSocket *sock,
852 GSocketClientEvent event,
853 GIOStream *connection)
855 g_signal_emit (sock, signals[EVENT], 0,
860 re_emit_socket_client_event (GSocketClient *client,
861 GSocketClientEvent event,
862 GSocketConnectable *connectable,
863 GIOStream *connection,
866 SoupSocket *sock = user_data;
868 soup_socket_event (sock, event, connection);
872 socket_connect_finish (SoupSocket *sock, GSocketConnection *conn)
874 SoupSocketPrivate *priv = soup_socket_get_instance_private (sock);
876 g_clear_object (&priv->connect_cancel);
879 priv->conn = (GIOStream *)conn;
880 priv->gsock = g_object_ref (g_socket_connection_get_socket (conn));
881 finish_socket_setup (sock);
888 socket_legacy_error (SoupSocket *sock, GError *error)
892 if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
893 status = SOUP_STATUS_CANCELLED;
894 else if (error->domain == G_RESOLVER_ERROR)
895 status = SOUP_STATUS_CANT_RESOLVE;
897 status = SOUP_STATUS_CANT_CONNECT;
899 g_error_free (error);
903 static GSocketClient *
904 new_socket_client (SoupSocket *sock)
906 SoupSocketPrivate *priv = soup_socket_get_instance_private (sock);
907 GSocketClient *client = g_socket_client_new ();
909 g_signal_connect (client, "event",
910 G_CALLBACK (re_emit_socket_client_event), sock);
911 if (priv->proxy_resolver) {
912 g_socket_client_set_proxy_resolver (client, priv->proxy_resolver);
913 g_socket_client_add_application_proxy (client, "http");
915 g_socket_client_set_enable_proxy (client, FALSE);
917 g_socket_client_set_timeout (client, priv->timeout);
919 if (priv->local_addr) {
920 GSocketAddress *addr;
922 addr = soup_address_get_gsockaddr (priv->local_addr);
923 g_socket_client_set_local_address (client, addr);
924 g_object_unref (addr);
931 async_connected (GObject *client, GAsyncResult *result, gpointer data)
934 SoupSocket *sock = g_task_get_source_object (task);
935 GSocketConnection *conn;
936 GError *error = NULL;
938 conn = g_socket_client_connect_finish (G_SOCKET_CLIENT (client),
940 if (socket_connect_finish (sock, conn))
941 g_task_return_boolean (task, TRUE);
943 g_task_return_error (task, error);
944 g_object_unref (task);
948 soup_socket_connect_finish_internal (SoupSocket *sock,
949 GAsyncResult *result,
952 return g_task_propagate_boolean (G_TASK (result), error);
956 soup_socket_connect_async_internal (SoupSocket *sock,
957 GCancellable *cancellable,
958 GAsyncReadyCallback callback,
961 SoupSocketPrivate *priv;
962 GSocketClient *client;
965 g_return_if_fail (SOUP_IS_SOCKET (sock));
966 priv = soup_socket_get_instance_private (sock);
967 g_return_if_fail (!priv->is_server);
968 g_return_if_fail (priv->gsock == NULL);
969 g_return_if_fail (priv->remote_addr != NULL);
971 priv->connect_cancel = cancellable ? g_object_ref (cancellable) : g_cancellable_new ();
972 task = g_task_new (sock, priv->connect_cancel, callback, user_data);
974 client = new_socket_client (sock);
975 g_socket_client_connect_async (client,
976 G_SOCKET_CONNECTABLE (priv->remote_addr),
977 priv->connect_cancel,
978 async_connected, task);
979 g_object_unref (client);
983 * SoupSocketCallback:
984 * @sock: the #SoupSocket
985 * @status: an HTTP status code indicating success or failure
986 * @user_data: the data passed to soup_socket_connect_async()
988 * The callback function passed to soup_socket_connect_async().
993 SoupSocketCallback callback;
995 } SoupSocketAsyncConnectData;
998 legacy_connect_async_cb (GObject *object,
999 GAsyncResult *result,
1002 SoupSocket *sock = SOUP_SOCKET (object);
1003 SoupSocketAsyncConnectData *sacd = user_data;
1004 GError *error = NULL;
1007 if (soup_socket_connect_finish_internal (sock, result, &error))
1008 status = SOUP_STATUS_OK;
1010 status = socket_legacy_error (sock, error);
1012 sacd->callback (sock, status, sacd->user_data);
1013 g_object_unref (sacd->sock);
1014 g_slice_free (SoupSocketAsyncConnectData, sacd);
1018 * soup_socket_connect_async:
1019 * @sock: a client #SoupSocket (which must not already be connected)
1020 * @cancellable: a #GCancellable, or %NULL
1021 * @callback: (scope async): callback to call after connecting
1022 * @user_data: data to pass to @callback
1024 * Begins asynchronously connecting to @sock's remote address. The
1025 * socket will call @callback when it succeeds or fails (but not
1026 * before returning from this function).
1028 * If @cancellable is non-%NULL, it can be used to cancel the
1029 * connection. @callback will still be invoked in this case, with a
1030 * status of %SOUP_STATUS_CANCELLED.
1033 soup_socket_connect_async (SoupSocket *sock, GCancellable *cancellable,
1034 SoupSocketCallback callback, gpointer user_data)
1036 SoupSocketPrivate *priv;
1037 SoupSocketAsyncConnectData *sacd;
1039 g_return_if_fail (SOUP_IS_SOCKET (sock));
1040 priv = soup_socket_get_instance_private (sock);
1041 g_return_if_fail (!priv->is_server);
1042 g_return_if_fail (priv->gsock == NULL);
1043 g_return_if_fail (priv->remote_addr != NULL);
1045 sacd = g_slice_new0 (SoupSocketAsyncConnectData);
1046 sacd->sock = g_object_ref (sock);
1047 sacd->callback = callback;
1048 sacd->user_data = user_data;
1050 if (priv->async_context && !priv->use_thread_context)
1051 g_main_context_push_thread_default (priv->async_context);
1053 soup_socket_connect_async_internal (sock, cancellable,
1054 legacy_connect_async_cb,
1057 if (priv->async_context && !priv->use_thread_context)
1058 g_main_context_pop_thread_default (priv->async_context);
1062 soup_socket_connect_sync_internal (SoupSocket *sock,
1063 GCancellable *cancellable,
1066 SoupSocketPrivate *priv;
1067 GSocketClient *client;
1068 GSocketConnection *conn;
1070 g_return_val_if_fail (SOUP_IS_SOCKET (sock), SOUP_STATUS_MALFORMED);
1071 priv = soup_socket_get_instance_private (sock);
1072 g_return_val_if_fail (!priv->is_server, SOUP_STATUS_MALFORMED);
1073 g_return_val_if_fail (priv->gsock == NULL, SOUP_STATUS_MALFORMED);
1074 g_return_val_if_fail (priv->remote_addr != NULL, SOUP_STATUS_MALFORMED);
1076 priv->connect_cancel = cancellable ? g_object_ref (cancellable) : g_cancellable_new ();
1078 client = new_socket_client (sock);
1079 conn = g_socket_client_connect (client,
1080 G_SOCKET_CONNECTABLE (priv->remote_addr),
1081 priv->connect_cancel, error);
1082 g_object_unref (client);
1084 return socket_connect_finish (sock, conn);
1088 * soup_socket_connect_sync:
1089 * @sock: a client #SoupSocket (which must not already be connected)
1090 * @cancellable: a #GCancellable, or %NULL
1092 * Attempt to synchronously connect @sock to its remote address.
1094 * If @cancellable is non-%NULL, it can be used to cancel the
1095 * connection, in which case soup_socket_connect_sync() will return
1096 * %SOUP_STATUS_CANCELLED.
1098 * Return value: a success or failure code.
1101 soup_socket_connect_sync (SoupSocket *sock, GCancellable *cancellable)
1103 SoupSocketPrivate *priv;
1104 GError *error = NULL;
1106 g_return_val_if_fail (SOUP_IS_SOCKET (sock), SOUP_STATUS_MALFORMED);
1107 priv = soup_socket_get_instance_private (sock);
1108 g_return_val_if_fail (!priv->is_server, SOUP_STATUS_MALFORMED);
1109 g_return_val_if_fail (priv->gsock == NULL, SOUP_STATUS_MALFORMED);
1110 g_return_val_if_fail (priv->remote_addr != NULL, SOUP_STATUS_MALFORMED);
1112 if (soup_socket_connect_sync_internal (sock, cancellable, &error))
1113 return SOUP_STATUS_OK;
1115 return socket_legacy_error (sock, error);
1119 * soup_socket_get_fd:
1120 * @sock: a #SoupSocket
1122 * Gets @sock's underlying file descriptor.
1124 * Note that fiddling with the file descriptor may break the
1127 * Return value: @sock's file descriptor.
1130 soup_socket_get_fd (SoupSocket *sock)
1132 SoupSocketPrivate *priv;
1134 g_return_val_if_fail (SOUP_IS_SOCKET (sock), -1);
1136 priv = soup_socket_get_instance_private (sock);
1138 return g_socket_get_fd (priv->gsock);
1142 soup_socket_get_gsocket (SoupSocket *sock)
1144 SoupSocketPrivate *priv;
1146 g_return_val_if_fail (SOUP_IS_SOCKET (sock), NULL);
1148 priv = soup_socket_get_instance_private (sock);
1154 soup_socket_steal_gsocket (SoupSocket *sock)
1156 SoupSocketPrivate *priv;
1159 g_return_val_if_fail (SOUP_IS_SOCKET (sock), NULL);
1160 priv = soup_socket_get_instance_private (sock);
1162 gsock = priv->gsock;
1164 g_clear_object (&priv->conn);
1165 g_clear_object (&priv->iostream);
1171 soup_socket_get_connection (SoupSocket *sock)
1173 SoupSocketPrivate *priv;
1175 g_return_val_if_fail (SOUP_IS_SOCKET (sock), NULL);
1177 priv = soup_socket_get_instance_private (sock);
1183 soup_socket_get_iostream (SoupSocket *sock)
1185 SoupSocketPrivate *priv;
1187 g_return_val_if_fail (SOUP_IS_SOCKET (sock), NULL);
1189 priv = soup_socket_get_instance_private (sock);
1191 return priv->iostream;
1195 soup_socket_create_watch (SoupSocketPrivate *priv, GIOCondition cond,
1196 GPollableSourceFunc callback, gpointer user_data,
1197 GCancellable *cancellable)
1201 if (cond == G_IO_IN)
1202 watch = g_pollable_input_stream_create_source (G_POLLABLE_INPUT_STREAM (priv->istream), cancellable);
1204 watch = g_pollable_output_stream_create_source (G_POLLABLE_OUTPUT_STREAM (priv->ostream), cancellable);
1205 g_source_set_callback (watch, (GSourceFunc)callback, user_data, NULL);
1207 g_source_attach (watch, priv->async_context);
1208 g_source_unref (watch);
1214 listen_watch (GObject *pollable, gpointer data)
1216 SoupSocket *sock = data, *new;
1217 SoupSocketPrivate *priv = soup_socket_get_instance_private (sock), *new_priv;
1220 new_gsock = g_socket_accept (priv->gsock, NULL, NULL);
1224 new = g_object_new (SOUP_TYPE_SOCKET, NULL);
1225 new_priv = soup_socket_get_instance_private (new);
1226 new_priv->gsock = new_gsock;
1227 if (priv->async_context)
1228 new_priv->async_context = g_main_context_ref (priv->async_context);
1229 new_priv->use_thread_context = priv->use_thread_context;
1230 new_priv->non_blocking = priv->non_blocking;
1231 new_priv->clean_dispose = priv->clean_dispose;
1232 new_priv->is_server = TRUE;
1233 new_priv->ssl = priv->ssl;
1234 if (priv->ssl_creds)
1235 new_priv->ssl_creds = g_object_ref (priv->ssl_creds);
1236 finish_socket_setup (new);
1238 if (new_priv->ssl_creds) {
1239 if (!soup_socket_start_proxy_ssl (new, NULL, NULL)) {
1240 g_object_unref (new);
1245 g_signal_emit (sock, signals[NEW_CONNECTION], 0, new);
1246 g_object_unref (new);
1252 finish_listener_setup (SoupSocket *sock)
1254 SoupSocketPrivate *priv = soup_socket_get_instance_private (sock);
1256 priv->is_server = TRUE;
1257 priv->watch_src = soup_socket_create_watch (priv, G_IO_IN,
1263 * soup_socket_listen:
1264 * @sock: a server #SoupSocket (which must not already be connected or
1267 * Makes @sock start listening on its local address. When connections
1268 * come in, @sock will emit #SoupSocket::new_connection.
1270 * Return value: whether or not @sock is now listening.
1273 soup_socket_listen (SoupSocket *sock)
1275 return soup_socket_listen_full (sock, NULL);
1279 * soup_socket_listen_full:
1280 * @sock: a server #SoupSocket (which must not already be connected or listening)
1281 * @error: error pointer
1283 * Makes @sock start listening on its local address. When connections
1284 * come in, @sock will emit #SoupSocket::new_connection.
1286 * Return value: whether or not @sock is now listening.
1289 soup_socket_listen_full (SoupSocket *sock,
1293 SoupSocketPrivate *priv;
1294 GSocketAddress *addr;
1296 g_return_val_if_fail (SOUP_IS_SOCKET (sock), FALSE);
1297 priv = soup_socket_get_instance_private (sock);
1298 g_return_val_if_fail (priv->gsock == NULL, FALSE);
1299 g_return_val_if_fail (priv->local_addr != NULL, FALSE);
1301 /* @local_addr may have its port set to 0. So we intentionally
1302 * don't store it in priv->local_addr, so that if the
1303 * caller calls soup_socket_get_local_address() later, we'll
1304 * have to make a new addr by calling getsockname(), which
1305 * will have the right port number.
1307 addr = soup_address_get_gsockaddr (priv->local_addr);
1308 g_return_val_if_fail (addr != NULL, FALSE);
1310 priv->gsock = g_socket_new (g_socket_address_get_family (addr),
1311 G_SOCKET_TYPE_STREAM,
1312 G_SOCKET_PROTOCOL_DEFAULT,
1316 finish_socket_setup (sock);
1318 #if defined (IPPROTO_IPV6) && defined (IPV6_V6ONLY)
1319 if (priv->ipv6_only) {
1322 fd = g_socket_get_fd (priv->gsock);
1324 setsockopt (fd, IPPROTO_IPV6, IPV6_V6ONLY,
1325 &v6_only, sizeof (v6_only));
1330 if (!g_socket_bind (priv->gsock, addr, TRUE, error))
1332 /* Force local_addr to be re-resolved now */
1333 g_object_unref (priv->local_addr);
1334 priv->local_addr = NULL;
1337 if (!g_socket_listen (priv->gsock, error))
1339 finish_listener_setup (sock);
1341 g_object_unref (addr);
1346 disconnect_internal (sock, TRUE);
1347 g_object_unref (addr);
1353 soup_socket_peer_certificate_changed (GObject *conn, GParamSpec *pspec,
1356 SoupSocketPrivate *priv = soup_socket_get_instance_private (sock);
1358 priv->tls_errors = g_tls_connection_get_peer_certificate_errors (G_TLS_CONNECTION (priv->conn));
1360 g_object_notify (sock, "tls-certificate");
1361 g_object_notify (sock, "tls-errors");
1365 soup_socket_accept_certificate (GTlsConnection *conn, GTlsCertificate *cert,
1366 GTlsCertificateFlags errors, gpointer sock)
1372 soup_socket_setup_ssl (SoupSocket *sock,
1373 const char *ssl_host,
1374 GCancellable *cancellable,
1377 SoupSocketPrivate *priv = soup_socket_get_instance_private (sock);
1378 GTlsBackend *backend = g_tls_backend_get_default ();
1380 if (G_IS_TLS_CONNECTION (priv->conn))
1383 if (g_cancellable_set_error_if_cancelled (cancellable, error))
1388 if (!priv->is_server) {
1389 GTlsClientConnection *conn;
1390 GSocketConnectable *identity;
1392 identity = g_network_address_new (ssl_host, 0);
1393 conn = g_initable_new (g_tls_backend_get_client_connection_type (backend),
1395 "base-io-stream", priv->conn,
1396 "server-identity", identity,
1397 "database", priv->ssl_creds,
1398 "require-close-notify", FALSE,
1399 "use-ssl3", priv->ssl_fallback,
1401 g_object_unref (identity);
1406 /* GLib < 2.41 mistakenly doesn't implement this property in the
1407 * dummy TLS backend, so we don't include it in the g_initable_new()
1410 g_object_set (G_OBJECT (conn),
1411 "interaction", priv->tls_interaction,
1414 g_object_unref (priv->conn);
1415 priv->conn = G_IO_STREAM (conn);
1417 if (!priv->ssl_strict) {
1418 g_signal_connect (conn, "accept-certificate",
1419 G_CALLBACK (soup_socket_accept_certificate),
1423 GTlsServerConnection *conn;
1425 conn = g_initable_new (g_tls_backend_get_server_connection_type (backend),
1427 "base-io-stream", priv->conn,
1428 "certificate", priv->ssl_creds,
1429 "use-system-certdb", FALSE,
1430 "require-close-notify", FALSE,
1435 g_object_unref (priv->conn);
1436 priv->conn = G_IO_STREAM (conn);
1439 g_signal_connect (priv->conn, "notify::peer-certificate",
1440 G_CALLBACK (soup_socket_peer_certificate_changed), sock);
1442 g_clear_object (&priv->istream);
1443 g_clear_object (&priv->ostream);
1444 g_clear_object (&priv->iostream);
1445 priv->iostream = soup_io_stream_new (priv->conn, FALSE);
1446 priv->istream = g_object_ref (g_io_stream_get_input_stream (priv->iostream));
1447 priv->ostream = g_object_ref (g_io_stream_get_output_stream (priv->iostream));
1453 * soup_socket_start_ssl:
1455 * @cancellable: a #GCancellable
1457 * Starts using SSL on @socket.
1459 * Return value: success or failure
1462 soup_socket_start_ssl (SoupSocket *sock, GCancellable *cancellable)
1464 SoupSocketPrivate *priv = soup_socket_get_instance_private (sock);
1466 return soup_socket_setup_ssl (sock, soup_address_get_name (priv->remote_addr),
1471 * soup_socket_start_proxy_ssl:
1473 * @ssl_host: hostname of the SSL server
1474 * @cancellable: a #GCancellable
1476 * Starts using SSL on @socket, expecting to find a host named
1479 * Return value: success or failure
1482 soup_socket_start_proxy_ssl (SoupSocket *sock, const char *ssl_host,
1483 GCancellable *cancellable)
1485 return soup_socket_setup_ssl (sock, ssl_host, cancellable, NULL);
1489 soup_socket_handshake_sync (SoupSocket *sock,
1490 const char *ssl_host,
1491 GCancellable *cancellable,
1494 SoupSocketPrivate *priv = soup_socket_get_instance_private (sock);
1496 if (!soup_socket_setup_ssl (sock, ssl_host, cancellable, error))
1499 soup_socket_event (sock, G_SOCKET_CLIENT_TLS_HANDSHAKING, priv->conn);
1501 if (!g_tls_connection_handshake (G_TLS_CONNECTION (priv->conn),
1502 cancellable, error))
1505 soup_socket_event (sock, G_SOCKET_CLIENT_TLS_HANDSHAKED, priv->conn);
1510 handshake_async_ready (GObject *source, GAsyncResult *result, gpointer user_data)
1512 GTask *task = user_data;
1513 GError *error = NULL;
1515 if (g_tls_connection_handshake_finish (G_TLS_CONNECTION (source),
1517 SoupSocket *sock = g_task_get_source_object (task);
1518 SoupSocketPrivate *priv = soup_socket_get_instance_private (sock);
1520 soup_socket_event (sock, G_SOCKET_CLIENT_TLS_HANDSHAKED, priv->conn);
1521 g_task_return_boolean (task, TRUE);
1523 g_task_return_error (task, error);
1524 g_object_unref (task);
1528 soup_socket_handshake_async (SoupSocket *sock,
1529 const char *ssl_host,
1530 GCancellable *cancellable,
1531 GAsyncReadyCallback callback,
1534 SoupSocketPrivate *priv = soup_socket_get_instance_private (sock);
1536 GError *error = NULL;
1538 task = g_task_new (sock, cancellable, callback, user_data);
1540 if (!soup_socket_setup_ssl (sock, ssl_host, cancellable, &error)) {
1541 g_task_return_error (task, error);
1542 g_object_unref (task);
1546 soup_socket_event (sock, G_SOCKET_CLIENT_TLS_HANDSHAKING, priv->conn);
1548 g_tls_connection_handshake_async (G_TLS_CONNECTION (priv->conn),
1550 cancellable, handshake_async_ready,
1555 soup_socket_handshake_finish (SoupSocket *sock,
1556 GAsyncResult *result,
1559 return g_task_propagate_boolean (G_TASK (result), error);
1563 * soup_socket_is_ssl:
1564 * @sock: a #SoupSocket
1566 * Tests if @sock is doing (or has attempted to do) SSL.
1568 * Return value: %TRUE if @sock has SSL credentials set
1571 soup_socket_is_ssl (SoupSocket *sock)
1573 SoupSocketPrivate *priv = soup_socket_get_instance_private (sock);
1579 * soup_socket_disconnect:
1580 * @sock: a #SoupSocket
1582 * Disconnects @sock. Any further read or write attempts on it will
1586 soup_socket_disconnect (SoupSocket *sock)
1588 SoupSocketPrivate *priv;
1589 gboolean already_disconnected = FALSE;
1591 g_return_if_fail (SOUP_IS_SOCKET (sock));
1592 priv = soup_socket_get_instance_private (sock);
1594 if (priv->connect_cancel) {
1595 disconnect_internal (sock, FALSE);
1596 g_cancellable_cancel (priv->connect_cancel);
1598 } else if (g_mutex_trylock (&priv->iolock)) {
1600 disconnect_internal (sock, TRUE);
1602 already_disconnected = TRUE;
1603 g_mutex_unlock (&priv->iolock);
1605 /* Another thread is currently doing IO, so
1606 * we can't close the socket. So just shutdown
1607 * the file descriptor to force the I/O to fail.
1608 * (It will actually be closed when the socket
1611 g_socket_shutdown (priv->gsock, TRUE, TRUE, NULL);
1614 if (already_disconnected)
1617 /* Keep ref around signals in case the object is unreferenced
1620 g_object_ref (sock);
1622 if (priv->non_blocking) {
1623 /* Give all readers a chance to notice the connection close */
1624 g_signal_emit (sock, signals[READABLE], 0);
1627 /* FIXME: can't disconnect until all data is read */
1629 /* Then let everyone know we're disconnected */
1630 g_signal_emit (sock, signals[DISCONNECTED], 0);
1632 g_object_unref (sock);
1636 * soup_socket_is_connected:
1637 * @sock: a #SoupSocket
1639 * Tests if @sock is connected to another host
1641 * Return value: %TRUE or %FALSE.
1644 soup_socket_is_connected (SoupSocket *sock)
1646 SoupSocketPrivate *priv;
1648 g_return_val_if_fail (SOUP_IS_SOCKET (sock), FALSE);
1649 priv = soup_socket_get_instance_private (sock);
1651 return priv->conn && !g_io_stream_is_closed (priv->conn);
1655 * soup_socket_get_local_address:
1656 * @sock: a #SoupSocket
1658 * Returns the #SoupAddress corresponding to the local end of @sock.
1660 * Calling this method on an unconnected socket is considered to be
1661 * an error, and produces undefined results.
1663 * Return value: (transfer none): the #SoupAddress
1666 soup_socket_get_local_address (SoupSocket *sock)
1668 SoupSocketPrivate *priv;
1670 g_return_val_if_fail (SOUP_IS_SOCKET (sock), NULL);
1671 priv = soup_socket_get_instance_private (sock);
1673 g_mutex_lock (&priv->addrlock);
1674 if (!priv->local_addr) {
1675 GSocketAddress *addr;
1676 struct sockaddr_storage sa;
1678 GError *error = NULL;
1680 if (priv->gsock == NULL) {
1681 g_warning ("%s: socket not connected", G_STRLOC);
1685 addr = g_socket_get_local_address (priv->gsock, &error);
1687 g_warning ("%s: %s", G_STRLOC, error->message);
1688 g_error_free (error);
1691 sa_len = g_socket_address_get_native_size (addr);
1692 g_socket_address_to_native (addr, &sa, sa_len, NULL);
1693 priv->local_addr = soup_address_new_from_sockaddr ((struct sockaddr *)&sa, sa_len);
1694 g_object_unref (addr);
1697 g_mutex_unlock (&priv->addrlock);
1699 return priv->local_addr;
1703 * soup_socket_get_remote_address:
1704 * @sock: a #SoupSocket
1706 * Returns the #SoupAddress corresponding to the remote end of @sock.
1708 * Calling this method on an unconnected socket is considered to be
1709 * an error, and produces undefined results.
1711 * Return value: (transfer none): the #SoupAddress
1714 soup_socket_get_remote_address (SoupSocket *sock)
1716 SoupSocketPrivate *priv;
1718 g_return_val_if_fail (SOUP_IS_SOCKET (sock), NULL);
1719 priv = soup_socket_get_instance_private (sock);
1721 g_mutex_lock (&priv->addrlock);
1722 if (!priv->remote_addr) {
1723 GSocketAddress *addr;
1724 struct sockaddr_storage sa;
1726 GError *error = NULL;
1728 if (priv->gsock == NULL) {
1729 g_warning ("%s: socket not connected", G_STRLOC);
1733 addr = g_socket_get_remote_address (priv->gsock, &error);
1735 g_warning ("%s: %s", G_STRLOC, error->message);
1736 g_error_free (error);
1739 sa_len = g_socket_address_get_native_size (addr);
1740 g_socket_address_to_native (addr, &sa, sa_len, NULL);
1741 priv->remote_addr = soup_address_new_from_sockaddr ((struct sockaddr *)&sa, sa_len);
1742 g_object_unref (addr);
1745 g_mutex_unlock (&priv->addrlock);
1747 return priv->remote_addr;
1751 soup_socket_get_http_proxy_uri (SoupSocket *sock)
1753 SoupSocketPrivate *priv = soup_socket_get_instance_private (sock);
1754 GSocketAddress *addr;
1755 GProxyAddress *paddr;
1760 addr = g_socket_get_remote_address (priv->gsock, NULL);
1761 if (!addr || !G_IS_PROXY_ADDRESS (addr)) {
1763 g_object_unref (addr);
1767 paddr = G_PROXY_ADDRESS (addr);
1768 if (strcmp (g_proxy_address_get_protocol (paddr), "http") != 0)
1771 uri = soup_uri_new (g_proxy_address_get_uri (paddr));
1772 g_object_unref (addr);
1777 socket_read_watch (GObject *pollable, gpointer user_data)
1779 SoupSocket *sock = user_data;
1780 SoupSocketPrivate *priv = soup_socket_get_instance_private (sock);
1782 priv->read_src = NULL;
1783 g_signal_emit (sock, signals[READABLE], 0);
1787 static SoupSocketIOStatus
1788 translate_read_status (SoupSocket *sock, GCancellable *cancellable,
1789 gssize my_nread, gsize *nread,
1790 GError *my_err, GError **error)
1792 SoupSocketPrivate *priv = soup_socket_get_instance_private (sock);
1795 g_assert_no_error (my_err);
1797 return SOUP_SOCKET_OK;
1798 } else if (my_nread == 0) {
1799 g_assert_no_error (my_err);
1801 return SOUP_SOCKET_EOF;
1802 } else if (g_error_matches (my_err, G_IO_ERROR, G_IO_ERROR_WOULD_BLOCK)) {
1803 g_clear_error (&my_err);
1804 if (!priv->read_src) {
1806 soup_socket_create_watch (priv, G_IO_IN,
1807 socket_read_watch, sock,
1810 return SOUP_SOCKET_WOULD_BLOCK;
1813 g_propagate_error (error, my_err);
1814 return SOUP_SOCKET_ERROR;
1818 * SoupSocketIOStatus:
1819 * @SOUP_SOCKET_OK: Success
1820 * @SOUP_SOCKET_WOULD_BLOCK: Cannot read/write any more at this time
1821 * @SOUP_SOCKET_EOF: End of file
1822 * @SOUP_SOCKET_ERROR: Other error
1824 * Return value from the #SoupSocket IO methods.
1830 * @buffer: (array length=len) (element-type guint8): buffer to read
1832 * @len: size of @buffer in bytes
1833 * @nread: (out): on return, the number of bytes read into @buffer
1834 * @cancellable: a #GCancellable, or %NULL
1835 * @error: error pointer
1837 * Attempts to read up to @len bytes from @sock into @buffer. If some
1838 * data is successfully read, soup_socket_read() will return
1839 * %SOUP_SOCKET_OK, and *@nread will contain the number of bytes
1840 * actually read (which may be less than @len).
1842 * If @sock is non-blocking, and no data is available, the return
1843 * value will be %SOUP_SOCKET_WOULD_BLOCK. In this case, the caller
1844 * can connect to the #SoupSocket::readable signal to know when there
1845 * is more data to read. (NB: You MUST read all available data off the
1846 * socket first. #SoupSocket::readable is only emitted after
1847 * soup_socket_read() returns %SOUP_SOCKET_WOULD_BLOCK, and it is only
1848 * emitted once. See the documentation for #SoupSocket:non-blocking.)
1850 * Return value: a #SoupSocketIOStatus, as described above (or
1851 * %SOUP_SOCKET_EOF if the socket is no longer connected, or
1852 * %SOUP_SOCKET_ERROR on any other error, in which case @error will
1856 soup_socket_read (SoupSocket *sock, gpointer buffer, gsize len,
1857 gsize *nread, GCancellable *cancellable, GError **error)
1859 SoupSocketPrivate *priv;
1860 SoupSocketIOStatus status;
1862 GError *my_err = NULL;
1864 g_return_val_if_fail (SOUP_IS_SOCKET (sock), SOUP_SOCKET_ERROR);
1865 g_return_val_if_fail (nread != NULL, SOUP_SOCKET_ERROR);
1867 priv = soup_socket_get_instance_private (sock);
1869 g_mutex_lock (&priv->iolock);
1871 if (!priv->istream) {
1872 status = SOUP_SOCKET_EOF;
1876 if (!priv->non_blocking) {
1877 my_nread = g_input_stream_read (priv->istream, buffer, len,
1878 cancellable, &my_err);
1880 my_nread = g_pollable_input_stream_read_nonblocking (G_POLLABLE_INPUT_STREAM (priv->istream),
1882 cancellable, &my_err);
1884 status = translate_read_status (sock, cancellable,
1885 my_nread, nread, my_err, error);
1888 g_mutex_unlock (&priv->iolock);
1894 * soup_socket_read_until:
1896 * @buffer: (array length=len) (element-type guint8): buffer to read
1898 * @len: size of @buffer in bytes
1899 * @boundary: boundary to read until
1900 * @boundary_len: length of @boundary in bytes
1901 * @nread: (out): on return, the number of bytes read into @buffer
1902 * @got_boundary: on return, whether or not the data in @buffer
1903 * ends with the boundary string
1904 * @cancellable: a #GCancellable, or %NULL
1905 * @error: error pointer
1907 * Like soup_socket_read(), but reads no further than the first
1908 * occurrence of @boundary. (If the boundary is found, it will be
1909 * included in the returned data, and *@got_boundary will be set to
1910 * %TRUE.) Any data after the boundary will returned in future reads.
1912 * soup_socket_read_until() will almost always return fewer than @len
1913 * bytes: if the boundary is found, then it will only return the bytes
1914 * up until the end of the boundary, and if the boundary is not found,
1915 * then it will leave the last <literal>(boundary_len - 1)</literal>
1916 * bytes in its internal buffer, in case they form the start of the
1917 * boundary string. Thus, @len normally needs to be at least 1 byte
1918 * longer than @boundary_len if you want to make any progress at all.
1920 * Return value: as for soup_socket_read()
1923 soup_socket_read_until (SoupSocket *sock, gpointer buffer, gsize len,
1924 gconstpointer boundary, gsize boundary_len,
1925 gsize *nread, gboolean *got_boundary,
1926 GCancellable *cancellable, GError **error)
1928 SoupSocketPrivate *priv;
1929 SoupSocketIOStatus status;
1931 GError *my_err = NULL;
1933 g_return_val_if_fail (SOUP_IS_SOCKET (sock), SOUP_SOCKET_ERROR);
1934 g_return_val_if_fail (nread != NULL, SOUP_SOCKET_ERROR);
1935 g_return_val_if_fail (len >= boundary_len, SOUP_SOCKET_ERROR);
1937 priv = soup_socket_get_instance_private (sock);
1939 g_mutex_lock (&priv->iolock);
1941 *got_boundary = FALSE;
1944 status = SOUP_SOCKET_EOF;
1946 my_nread = soup_filter_input_stream_read_until (
1947 SOUP_FILTER_INPUT_STREAM (priv->istream),
1948 buffer, len, boundary, boundary_len,
1949 !priv->non_blocking,
1950 TRUE, got_boundary, cancellable, &my_err);
1951 status = translate_read_status (sock, cancellable,
1952 my_nread, nread, my_err, error);
1955 g_mutex_unlock (&priv->iolock);
1960 socket_write_watch (GObject *pollable, gpointer user_data)
1962 SoupSocket *sock = user_data;
1963 SoupSocketPrivate *priv = soup_socket_get_instance_private (sock);
1965 priv->write_src = NULL;
1966 g_signal_emit (sock, signals[WRITABLE], 0);
1971 * soup_socket_write:
1973 * @buffer: (array length=len) (element-type guint8): data to write
1974 * @len: size of @buffer, in bytes
1975 * @nwrote: (out): on return, number of bytes written
1976 * @cancellable: a #GCancellable, or %NULL
1977 * @error: error pointer
1979 * Attempts to write @len bytes from @buffer to @sock. If some data is
1980 * successfully written, the return status will be %SOUP_SOCKET_OK,
1981 * and *@nwrote will contain the number of bytes actually written
1982 * (which may be less than @len).
1984 * If @sock is non-blocking, and no data could be written right away,
1985 * the return value will be %SOUP_SOCKET_WOULD_BLOCK. In this case,
1986 * the caller can connect to the #SoupSocket::writable signal to know
1987 * when more data can be written. (NB: #SoupSocket::writable is only
1988 * emitted after soup_socket_write() returns %SOUP_SOCKET_WOULD_BLOCK,
1989 * and it is only emitted once. See the documentation for
1990 * #SoupSocket:non-blocking.)
1992 * Return value: a #SoupSocketIOStatus, as described above (or
1993 * %SOUP_SOCKET_EOF or %SOUP_SOCKET_ERROR. @error will be set if the
1994 * return value is %SOUP_SOCKET_ERROR.)
1997 soup_socket_write (SoupSocket *sock, gconstpointer buffer,
1998 gsize len, gsize *nwrote,
1999 GCancellable *cancellable, GError **error)
2001 SoupSocketPrivate *priv;
2002 GError *my_err = NULL;
2005 g_return_val_if_fail (SOUP_IS_SOCKET (sock), SOUP_SOCKET_ERROR);
2006 g_return_val_if_fail (nwrote != NULL, SOUP_SOCKET_ERROR);
2008 priv = soup_socket_get_instance_private (sock);
2010 g_mutex_lock (&priv->iolock);
2013 g_mutex_unlock (&priv->iolock);
2014 return SOUP_SOCKET_EOF;
2016 if (priv->write_src) {
2017 g_mutex_unlock (&priv->iolock);
2018 return SOUP_SOCKET_WOULD_BLOCK;
2021 if (!priv->non_blocking) {
2022 my_nwrote = g_output_stream_write (priv->ostream,
2024 cancellable, &my_err);
2026 my_nwrote = g_pollable_output_stream_write_nonblocking (
2027 G_POLLABLE_OUTPUT_STREAM (priv->ostream),
2028 buffer, len, cancellable, &my_err);
2031 if (my_nwrote > 0) {
2032 g_mutex_unlock (&priv->iolock);
2033 g_clear_error (&my_err);
2034 *nwrote = my_nwrote;
2035 return SOUP_SOCKET_OK;
2038 if (g_error_matches (my_err, G_IO_ERROR, G_IO_ERROR_WOULD_BLOCK)) {
2039 g_mutex_unlock (&priv->iolock);
2040 g_clear_error (&my_err);
2043 soup_socket_create_watch (priv,
2045 socket_write_watch, sock, cancellable);
2046 return SOUP_SOCKET_WOULD_BLOCK;
2049 g_mutex_unlock (&priv->iolock);
2050 g_propagate_error (error, my_err);
2051 return SOUP_SOCKET_ERROR;