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.
19 #include "soup-address.h"
20 #include "soup-socket.h"
21 #include "soup-marshal.h"
22 #include "soup-misc.h"
23 #include "soup-misc-private.h"
27 * @short_description: A network socket
29 * #SoupSocket is libsoup's TCP socket type. While it is primarily
30 * intended for internal use, #SoupSocket<!-- -->s are exposed in the
31 * API in various places, and some of their methods (eg,
32 * soup_socket_get_remote_address()) may be useful to applications.
35 G_DEFINE_TYPE (SoupSocket, soup_socket, G_TYPE_OBJECT)
45 static guint signals[LAST_SIGNAL] = { 0 };
58 PROP_USE_THREAD_CONTEXT,
60 PROP_TRUSTED_CERTIFICATE,
69 SoupAddress *local_addr, *remote_addr;
72 GPollableInputStream *istream;
73 GPollableOutputStream *ostream;
74 GTlsCertificateFlags tls_errors;
81 guint clean_dispose:1;
82 guint use_thread_context:1;
85 GMainContext *async_context;
87 GSource *read_src, *write_src;
90 GMutex iolock, addrlock;
93 GCancellable *connect_cancel;
95 #define SOUP_SOCKET_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), SOUP_TYPE_SOCKET, SoupSocketPrivate))
97 static void set_property (GObject *object, guint prop_id,
98 const GValue *value, GParamSpec *pspec);
99 static void get_property (GObject *object, guint prop_id,
100 GValue *value, GParamSpec *pspec);
102 static void soup_socket_peer_certificate_changed (GObject *conn,
107 soup_socket_init (SoupSocket *sock)
109 SoupSocketPrivate *priv = SOUP_SOCKET_GET_PRIVATE (sock);
111 priv->non_blocking = TRUE;
112 g_mutex_init (&priv->addrlock);
113 g_mutex_init (&priv->iolock);
117 disconnect_internal (SoupSocket *sock)
119 SoupSocketPrivate *priv = SOUP_SOCKET_GET_PRIVATE (sock);
122 g_socket_close (priv->gsock, NULL);
123 g_object_unref (priv->gsock);
127 if (G_IS_TLS_CONNECTION (priv->conn))
128 g_signal_handlers_disconnect_by_func (priv->conn, soup_socket_peer_certificate_changed, sock);
129 g_object_unref (priv->conn);
131 priv->istream = NULL;
132 priv->ostream = NULL;
135 if (priv->read_src) {
136 g_source_destroy (priv->read_src);
137 priv->read_src = NULL;
139 if (priv->write_src) {
140 g_source_destroy (priv->write_src);
141 priv->write_src = NULL;
146 finalize (GObject *object)
148 SoupSocketPrivate *priv = SOUP_SOCKET_GET_PRIVATE (object);
150 if (priv->connect_cancel) {
151 if (priv->clean_dispose)
152 g_warning ("Disposing socket %p during connect", object);
153 g_object_unref (priv->connect_cancel);
156 if (priv->clean_dispose)
157 g_warning ("Disposing socket %p while still connected", object);
158 disconnect_internal (SOUP_SOCKET (object));
161 if (priv->local_addr)
162 g_object_unref (priv->local_addr);
163 if (priv->remote_addr)
164 g_object_unref (priv->remote_addr);
166 if (priv->watch_src) {
167 if (priv->clean_dispose && !priv->is_server)
168 g_warning ("Disposing socket %p during async op", object);
169 g_source_destroy (priv->watch_src);
171 if (priv->async_context)
172 g_main_context_unref (priv->async_context);
175 g_byte_array_free (priv->read_buf, TRUE);
177 g_mutex_clear (&priv->addrlock);
178 g_mutex_clear (&priv->iolock);
180 G_OBJECT_CLASS (soup_socket_parent_class)->finalize (object);
184 soup_socket_class_init (SoupSocketClass *socket_class)
186 GObjectClass *object_class = G_OBJECT_CLASS (socket_class);
188 g_type_class_add_private (socket_class, sizeof (SoupSocketPrivate));
190 /* virtual method override */
191 object_class->finalize = finalize;
192 object_class->set_property = set_property;
193 object_class->get_property = get_property;
198 * SoupSocket::readable:
201 * Emitted when an async socket is readable. See
202 * soup_socket_read(), soup_socket_read_until() and
203 * #SoupSocket:non-blocking.
206 g_signal_new ("readable",
207 G_OBJECT_CLASS_TYPE (object_class),
209 G_STRUCT_OFFSET (SoupSocketClass, readable),
211 soup_marshal_NONE__NONE,
215 * SoupSocket::writable:
218 * Emitted when an async socket is writable. See
219 * soup_socket_write() and #SoupSocket:non-blocking.
222 g_signal_new ("writable",
223 G_OBJECT_CLASS_TYPE (object_class),
225 G_STRUCT_OFFSET (SoupSocketClass, writable),
227 soup_marshal_NONE__NONE,
231 * SoupSocket::disconnected:
234 * Emitted when the socket is disconnected, for whatever
237 signals[DISCONNECTED] =
238 g_signal_new ("disconnected",
239 G_OBJECT_CLASS_TYPE (object_class),
241 G_STRUCT_OFFSET (SoupSocketClass, disconnected),
243 soup_marshal_NONE__NONE,
247 * SoupSocket::new-connection:
249 * @new: the new socket
251 * Emitted when a listening socket (set up with
252 * soup_socket_listen()) receives a new connection.
254 * You must ref the @new if you want to keep it; otherwise it
255 * will be destroyed after the signal is emitted.
257 signals[NEW_CONNECTION] =
258 g_signal_new ("new_connection",
259 G_OBJECT_CLASS_TYPE (object_class),
261 G_STRUCT_OFFSET (SoupSocketClass, new_connection),
263 soup_marshal_NONE__OBJECT,
269 * SOUP_SOCKET_LOCAL_ADDRESS:
271 * Alias for the #SoupSocket:local-address property. (Address
272 * of local end of socket.)
274 g_object_class_install_property (
275 object_class, PROP_LOCAL_ADDRESS,
276 g_param_spec_object (SOUP_SOCKET_LOCAL_ADDRESS,
278 "Address of local end of socket",
280 G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
282 * SOUP_SOCKET_REMOTE_ADDRESS:
284 * Alias for the #SoupSocket:remote-address property. (Address
285 * of remote end of socket.)
287 g_object_class_install_property (
288 object_class, PROP_REMOTE_ADDRESS,
289 g_param_spec_object (SOUP_SOCKET_REMOTE_ADDRESS,
291 "Address of remote end of socket",
293 G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
295 * SoupSocket:non-blocking:
297 * Whether or not the socket uses non-blocking I/O.
299 * #SoupSocket's I/O methods are designed around the idea of
300 * using a single codepath for both synchronous and
301 * asynchronous I/O. If you want to read off a #SoupSocket,
302 * the "correct" way to do it is to call soup_socket_read() or
303 * soup_socket_read_until() repeatedly until you have read
304 * everything you want. If it returns %SOUP_SOCKET_WOULD_BLOCK
305 * at any point, stop reading and wait for it to emit the
306 * #SoupSocket::readable signal. Then go back to the
307 * reading-as-much-as-you-can loop. Likewise, for writing to a
308 * #SoupSocket, you should call soup_socket_write() either
309 * until you have written everything, or it returns
310 * %SOUP_SOCKET_WOULD_BLOCK (in which case you wait for
311 * #SoupSocket::writable and then go back into the loop).
313 * Code written this way will work correctly with both
314 * blocking and non-blocking sockets; blocking sockets will
315 * simply never return %SOUP_SOCKET_WOULD_BLOCK, and so the
316 * code that handles that case just won't get used for them.
319 * SOUP_SOCKET_FLAG_NONBLOCKING:
321 * Alias for the #SoupSocket:non-blocking property. (Whether
322 * or not the socket uses non-blocking I/O.)
324 g_object_class_install_property (
325 object_class, PROP_NON_BLOCKING,
326 g_param_spec_boolean (SOUP_SOCKET_FLAG_NONBLOCKING,
328 "Whether or not the socket uses non-blocking I/O",
332 * SOUP_SOCKET_IS_SERVER:
334 * Alias for the #SoupSocket:is-server property. (Whether or
335 * not the socket is a server socket.)
337 g_object_class_install_property (
338 object_class, PROP_IS_SERVER,
339 g_param_spec_boolean (SOUP_SOCKET_IS_SERVER,
341 "Whether or not the socket is a server socket",
345 * SOUP_SOCKET_SSL_CREDENTIALS:
347 * Alias for the #SoupSocket:ssl-creds property.
348 * (SSL credential information.)
350 /* For historical reasons, there's only a single property
351 * here, which is a GTlsDatabase for client sockets, and
352 * a GTlsCertificate for server sockets. Whee!
354 g_object_class_install_property (
355 object_class, PROP_SSL_CREDENTIALS,
356 g_param_spec_pointer (SOUP_SOCKET_SSL_CREDENTIALS,
358 "SSL credential information, passed from the session to the SSL implementation",
361 * SOUP_SOCKET_SSL_STRICT:
363 * Alias for the #SoupSocket:ssl-strict property.
365 g_object_class_install_property (
366 object_class, PROP_SSL_STRICT,
367 g_param_spec_boolean (SOUP_SOCKET_SSL_STRICT,
368 "Strictly validate SSL certificates",
369 "Whether certificate errors should be considered a connection error",
371 G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
373 * SOUP_SOCKET_SSL_FALLBACK:
375 * Alias for the #SoupSocket:ssl-fallback property.
377 g_object_class_install_property (
378 object_class, PROP_SSL_FALLBACK,
379 g_param_spec_boolean (SOUP_SOCKET_SSL_FALLBACK,
381 "Use SSLv3 instead of TLS (client-side only)",
383 G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
385 * SOUP_SOCKET_TRUSTED_CERTIFICATE:
387 * Alias for the #SoupSocket:trusted-certificate
390 g_object_class_install_property (
391 object_class, PROP_TRUSTED_CERTIFICATE,
392 g_param_spec_boolean (SOUP_SOCKET_TRUSTED_CERTIFICATE,
393 "Trusted Certificate",
394 "Whether the server certificate is trusted, if this is an SSL socket",
398 * SOUP_SOCKET_ASYNC_CONTEXT:
400 * Alias for the #SoupSocket:async-context property. (The
401 * socket's #GMainContext.)
403 g_object_class_install_property (
404 object_class, PROP_ASYNC_CONTEXT,
405 g_param_spec_pointer (SOUP_SOCKET_ASYNC_CONTEXT,
406 "Async GMainContext",
407 "The GMainContext to dispatch this socket's async I/O in",
408 G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
411 * SOUP_SOCKET_USE_THREAD_CONTEXT:
413 * Alias for the #SoupSocket:use-thread-context property. (Use
414 * g_main_context_get_thread_default())
419 * SoupSocket:use-thread-context:
421 * Use g_main_context_get_thread_default().
425 g_object_class_install_property (
426 object_class, PROP_USE_THREAD_CONTEXT,
427 g_param_spec_boolean (SOUP_SOCKET_USE_THREAD_CONTEXT,
428 "Use thread context",
429 "Use g_main_context_get_thread_default",
431 G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
434 * SOUP_SOCKET_TIMEOUT:
436 * Alias for the #SoupSocket:timeout property. (The timeout
437 * in seconds for blocking socket I/O operations.)
439 g_object_class_install_property (
440 object_class, PROP_TIMEOUT,
441 g_param_spec_uint (SOUP_SOCKET_TIMEOUT,
443 "Value in seconds to timeout a blocking I/O",
447 g_object_class_install_property (
448 object_class, PROP_CLEAN_DISPOSE,
449 g_param_spec_boolean ("clean-dispose",
451 "Warn on unclean dispose",
453 G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY));
455 * SOUP_SOCKET_TLS_CERTIFICATE:
457 * Alias for the #SoupSocket:tls-certificate
458 * property. Note that this property's value is only useful
459 * if the socket is for a TLS connection, and only reliable
460 * after some data has been transferred to or from it.
464 g_object_class_install_property (
465 object_class, PROP_TLS_CERTIFICATE,
466 g_param_spec_object (SOUP_SOCKET_TLS_CERTIFICATE,
468 "The peer's TLS certificate",
469 G_TYPE_TLS_CERTIFICATE,
472 * SOUP_SOCKET_TLS_ERRORS:
474 * Alias for the #SoupSocket:tls-errors
475 * property. Note that this property's value is only useful
476 * if the socket is for a TLS connection, and only reliable
477 * after some data has been transferred to or from it.
481 g_object_class_install_property (
482 object_class, PROP_TLS_ERRORS,
483 g_param_spec_flags (SOUP_SOCKET_TLS_ERRORS,
485 "Errors with the peer's TLS certificate",
486 G_TYPE_TLS_CERTIFICATE_FLAGS, 0,
492 finish_socket_setup (SoupSocketPrivate *priv)
498 priv->conn = (GIOStream *)g_socket_connection_factory_create_connection (priv->gsock);
500 priv->istream = G_POLLABLE_INPUT_STREAM (g_io_stream_get_input_stream (priv->conn));
502 priv->ostream = G_POLLABLE_OUTPUT_STREAM (g_io_stream_get_output_stream (priv->conn));
504 g_socket_set_timeout (priv->gsock, priv->timeout);
508 set_property (GObject *object, guint prop_id,
509 const GValue *value, GParamSpec *pspec)
511 SoupSocketPrivate *priv = SOUP_SOCKET_GET_PRIVATE (object);
514 case PROP_LOCAL_ADDRESS:
515 priv->local_addr = (SoupAddress *)g_value_dup_object (value);
517 case PROP_REMOTE_ADDRESS:
518 priv->remote_addr = (SoupAddress *)g_value_dup_object (value);
520 case PROP_NON_BLOCKING:
521 priv->non_blocking = g_value_get_boolean (value);
523 case PROP_SSL_CREDENTIALS:
524 priv->ssl_creds = g_value_get_pointer (value);
526 case PROP_SSL_STRICT:
527 priv->ssl_strict = g_value_get_boolean (value);
529 case PROP_SSL_FALLBACK:
530 priv->ssl_fallback = g_value_get_boolean (value);
532 case PROP_ASYNC_CONTEXT:
533 priv->async_context = g_value_get_pointer (value);
534 if (priv->async_context)
535 g_main_context_ref (priv->async_context);
537 case PROP_USE_THREAD_CONTEXT:
538 priv->use_thread_context = g_value_get_boolean (value);
541 priv->timeout = g_value_get_uint (value);
543 g_socket_set_timeout (priv->gsock, priv->timeout);
545 case PROP_CLEAN_DISPOSE:
546 priv->clean_dispose = g_value_get_boolean (value);
549 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
555 get_property (GObject *object, guint prop_id,
556 GValue *value, GParamSpec *pspec)
558 SoupSocketPrivate *priv = SOUP_SOCKET_GET_PRIVATE (object);
561 case PROP_LOCAL_ADDRESS:
562 g_value_set_object (value, soup_socket_get_local_address (SOUP_SOCKET (object)));
564 case PROP_REMOTE_ADDRESS:
565 g_value_set_object (value, soup_socket_get_remote_address (SOUP_SOCKET (object)));
567 case PROP_NON_BLOCKING:
568 g_value_set_boolean (value, priv->non_blocking);
571 g_value_set_boolean (value, priv->is_server);
573 case PROP_SSL_CREDENTIALS:
574 g_value_set_pointer (value, priv->ssl_creds);
576 case PROP_SSL_STRICT:
577 g_value_set_boolean (value, priv->ssl_strict);
579 case PROP_SSL_FALLBACK:
580 g_value_set_boolean (value, priv->ssl_fallback);
582 case PROP_TRUSTED_CERTIFICATE:
583 g_value_set_boolean (value, priv->tls_errors == 0);
585 case PROP_ASYNC_CONTEXT:
586 g_value_set_pointer (value, priv->async_context ? g_main_context_ref (priv->async_context) : NULL);
588 case PROP_USE_THREAD_CONTEXT:
589 g_value_set_boolean (value, priv->use_thread_context);
592 g_value_set_uint (value, priv->timeout);
594 case PROP_TLS_CERTIFICATE:
595 if (G_IS_TLS_CONNECTION (priv->conn))
596 g_value_set_object (value, g_tls_connection_get_peer_certificate (G_TLS_CONNECTION (priv->conn)));
598 g_value_set_object (value, NULL);
600 case PROP_TLS_ERRORS:
601 g_value_set_flags (value, priv->tls_errors);
604 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
612 * @optname1: name of first property to set (or %NULL)
613 * @...: value of @optname1, followed by additional property/value pairs
615 * Creates a new (disconnected) socket
617 * Return value: the new socket
620 soup_socket_new (const char *optname1, ...)
625 va_start (ap, optname1);
626 sock = (SoupSocket *)g_object_new_valist (SOUP_TYPE_SOCKET,
634 socket_connected (SoupSocket *sock, GSocketConnection *conn, GError *error)
636 SoupSocketPrivate *priv = SOUP_SOCKET_GET_PRIVATE (sock);
638 g_object_unref (priv->connect_cancel);
639 priv->connect_cancel = NULL;
642 if (error->domain == G_RESOLVER_ERROR) {
643 g_error_free (error);
644 return SOUP_STATUS_CANT_RESOLVE;
646 g_error_free (error);
647 return SOUP_STATUS_CANT_CONNECT;
651 priv->conn = (GIOStream *)conn;
652 priv->gsock = g_object_ref (g_socket_connection_get_socket (conn));
653 finish_socket_setup (priv);
655 return SOUP_STATUS_OK;
659 * SoupSocketCallback:
660 * @sock: the #SoupSocket
661 * @status: an HTTP status code indicating success or failure
662 * @user_data: the data passed to soup_socket_connect_async()
664 * The callback function passed to soup_socket_connect_async().
669 SoupSocketCallback callback;
671 } SoupSocketAsyncConnectData;
674 async_connected (GObject *client, GAsyncResult *result, gpointer data)
676 SoupSocketAsyncConnectData *sacd = data;
677 SoupSocketPrivate *priv = SOUP_SOCKET_GET_PRIVATE (sacd->sock);
678 GError *error = NULL;
679 GSocketConnection *conn;
682 if (priv->async_context && !priv->use_thread_context)
683 g_main_context_pop_thread_default (priv->async_context);
685 conn = g_socket_client_connect_finish (G_SOCKET_CLIENT (client),
687 status = socket_connected (sacd->sock, conn, error);
689 sacd->callback (sacd->sock, status, sacd->user_data);
690 g_object_unref (sacd->sock);
691 g_slice_free (SoupSocketAsyncConnectData, sacd);
695 * soup_socket_connect_async:
696 * @sock: a client #SoupSocket (which must not already be connected)
697 * @cancellable: a #GCancellable, or %NULL
698 * @callback: (scope async): callback to call after connecting
699 * @user_data: data to pass to @callback
701 * Begins asynchronously connecting to @sock's remote address. The
702 * socket will call @callback when it succeeds or fails (but not
703 * before returning from this function).
705 * If @cancellable is non-%NULL, it can be used to cancel the
706 * connection. @callback will still be invoked in this case, with a
707 * status of %SOUP_STATUS_CANCELLED.
710 soup_socket_connect_async (SoupSocket *sock, GCancellable *cancellable,
711 SoupSocketCallback callback, gpointer user_data)
713 SoupSocketPrivate *priv;
714 SoupSocketAsyncConnectData *sacd;
715 GSocketClient *client;
717 g_return_if_fail (SOUP_IS_SOCKET (sock));
718 priv = SOUP_SOCKET_GET_PRIVATE (sock);
719 g_return_if_fail (priv->remote_addr != NULL);
721 sacd = g_slice_new0 (SoupSocketAsyncConnectData);
722 sacd->sock = g_object_ref (sock);
723 sacd->callback = callback;
724 sacd->user_data = user_data;
726 priv->connect_cancel = cancellable ? g_object_ref (cancellable) : g_cancellable_new ();
728 if (priv->async_context && !priv->use_thread_context)
729 g_main_context_push_thread_default (priv->async_context);
731 client = g_socket_client_new ();
733 g_socket_client_set_timeout (client, priv->timeout);
734 g_socket_client_connect_async (client,
735 G_SOCKET_CONNECTABLE (priv->remote_addr),
736 priv->connect_cancel,
737 async_connected, sacd);
738 g_object_unref (client);
742 * soup_socket_connect_sync:
743 * @sock: a client #SoupSocket (which must not already be connected)
744 * @cancellable: a #GCancellable, or %NULL
746 * Attempt to synchronously connect @sock to its remote address.
748 * If @cancellable is non-%NULL, it can be used to cancel the
749 * connection, in which case soup_socket_connect_sync() will return
750 * %SOUP_STATUS_CANCELLED.
752 * Return value: a success or failure code.
755 soup_socket_connect_sync (SoupSocket *sock, GCancellable *cancellable)
757 SoupSocketPrivate *priv;
758 GSocketClient *client;
759 GSocketConnection *conn;
760 GError *error = NULL;
762 g_return_val_if_fail (SOUP_IS_SOCKET (sock), SOUP_STATUS_MALFORMED);
763 priv = SOUP_SOCKET_GET_PRIVATE (sock);
764 g_return_val_if_fail (!priv->is_server, SOUP_STATUS_MALFORMED);
765 g_return_val_if_fail (priv->gsock == NULL, SOUP_STATUS_MALFORMED);
766 g_return_val_if_fail (priv->remote_addr != NULL, SOUP_STATUS_MALFORMED);
769 g_object_ref (cancellable);
771 cancellable = g_cancellable_new ();
772 priv->connect_cancel = cancellable;
774 client = g_socket_client_new ();
776 g_socket_client_set_timeout (client, priv->timeout);
777 conn = g_socket_client_connect (client,
778 G_SOCKET_CONNECTABLE (priv->remote_addr),
779 priv->connect_cancel, &error);
780 g_object_unref (client);
782 return socket_connected (sock, conn, error);
786 soup_socket_get_fd (SoupSocket *sock)
788 g_return_val_if_fail (SOUP_IS_SOCKET (sock), -1);
790 return g_socket_get_fd (SOUP_SOCKET_GET_PRIVATE (sock)->gsock);
794 soup_socket_create_watch (SoupSocketPrivate *priv, GIOCondition cond,
795 GPollableSourceFunc callback, gpointer user_data,
796 GCancellable *cancellable)
799 GMainContext *async_context;
802 watch = g_pollable_input_stream_create_source (priv->istream, cancellable);
804 watch = g_pollable_output_stream_create_source (priv->ostream, cancellable);
805 g_source_set_callback (watch, (GSourceFunc)callback, user_data, NULL);
807 if (priv->use_thread_context)
808 async_context = g_main_context_get_thread_default ();
810 async_context = priv->async_context;
812 g_source_attach (watch, async_context);
813 g_source_unref (watch);
819 listen_watch (GObject *pollable, gpointer data)
821 SoupSocket *sock = data, *new;
822 SoupSocketPrivate *priv = SOUP_SOCKET_GET_PRIVATE (sock), *new_priv;
825 new_gsock = g_socket_accept (priv->gsock, NULL, NULL);
829 new = g_object_new (SOUP_TYPE_SOCKET, NULL);
830 new_priv = SOUP_SOCKET_GET_PRIVATE (new);
831 new_priv->gsock = new_gsock;
832 if (priv->async_context)
833 new_priv->async_context = g_main_context_ref (priv->async_context);
834 new_priv->use_thread_context = priv->use_thread_context;
835 new_priv->non_blocking = priv->non_blocking;
836 new_priv->is_server = TRUE;
837 new_priv->ssl = priv->ssl;
839 new_priv->ssl_creds = priv->ssl_creds;
840 finish_socket_setup (new_priv);
842 if (new_priv->ssl_creds) {
843 if (!soup_socket_start_proxy_ssl (new, NULL, NULL)) {
844 g_object_unref (new);
849 g_signal_emit (sock, signals[NEW_CONNECTION], 0, new);
850 g_object_unref (new);
856 * soup_socket_listen:
857 * @sock: a server #SoupSocket (which must not already be connected or
860 * Makes @sock start listening on its local address. When connections
861 * come in, @sock will emit #SoupSocket::new_connection.
863 * Return value: whether or not @sock is now listening.
866 soup_socket_listen (SoupSocket *sock)
869 SoupSocketPrivate *priv;
870 GSocketAddress *addr;
872 g_return_val_if_fail (SOUP_IS_SOCKET (sock), FALSE);
873 priv = SOUP_SOCKET_GET_PRIVATE (sock);
874 g_return_val_if_fail (priv->gsock == NULL, FALSE);
875 g_return_val_if_fail (priv->local_addr != NULL, FALSE);
877 priv->is_server = TRUE;
879 /* @local_addr may have its port set to 0. So we intentionally
880 * don't store it in priv->local_addr, so that if the
881 * caller calls soup_socket_get_local_address() later, we'll
882 * have to make a new addr by calling getsockname(), which
883 * will have the right port number.
885 addr = soup_address_get_gsockaddr (priv->local_addr);
886 g_return_val_if_fail (addr != NULL, FALSE);
888 priv->gsock = g_socket_new (g_socket_address_get_family (addr),
889 G_SOCKET_TYPE_STREAM,
890 G_SOCKET_PROTOCOL_DEFAULT,
894 finish_socket_setup (priv);
897 if (!g_socket_bind (priv->gsock, addr, TRUE, NULL))
899 /* Force local_addr to be re-resolved now */
900 g_object_unref (priv->local_addr);
901 priv->local_addr = NULL;
904 if (!g_socket_listen (priv->gsock, NULL))
907 priv->watch_src = soup_socket_create_watch (priv, G_IO_IN,
910 g_object_unref (addr);
915 disconnect_internal (sock);
916 g_object_unref (addr);
922 soup_socket_peer_certificate_changed (GObject *conn, GParamSpec *pspec,
925 SoupSocketPrivate *priv = SOUP_SOCKET_GET_PRIVATE (sock);
927 priv->tls_errors = g_tls_connection_get_peer_certificate_errors (G_TLS_CONNECTION (priv->conn));
929 g_object_notify (sock, "tls-certificate");
930 g_object_notify (sock, "tls-errors");
934 soup_socket_accept_certificate (GTlsConnection *conn, GTlsCertificate *cert,
935 GTlsCertificateFlags errors, gpointer sock)
941 * soup_socket_start_ssl:
943 * @cancellable: a #GCancellable
945 * Starts using SSL on @socket.
947 * Return value: success or failure
950 soup_socket_start_ssl (SoupSocket *sock, GCancellable *cancellable)
952 SoupSocketPrivate *priv = SOUP_SOCKET_GET_PRIVATE (sock);
954 return soup_socket_start_proxy_ssl (sock, soup_address_get_name (priv->remote_addr), cancellable);
958 * soup_socket_start_proxy_ssl:
960 * @ssl_host: hostname of the SSL server
961 * @cancellable: a #GCancellable
963 * Starts using SSL on @socket, expecting to find a host named
966 * Return value: success or failure
969 soup_socket_start_proxy_ssl (SoupSocket *sock, const char *ssl_host,
970 GCancellable *cancellable)
972 SoupSocketPrivate *priv = SOUP_SOCKET_GET_PRIVATE (sock);
973 GTlsBackend *backend = g_tls_backend_get_default ();
975 if (G_IS_TLS_CONNECTION (priv->conn))
980 if (!priv->is_server) {
981 GTlsClientConnection *conn;
982 GSocketConnectable *identity;
984 identity = g_network_address_new (ssl_host, 0);
985 conn = g_initable_new (g_tls_backend_get_client_connection_type (backend),
987 "base-io-stream", priv->conn,
988 "server-identity", identity,
989 "database", priv->ssl_creds,
990 "require-close-notify", FALSE,
991 "use-ssl3", priv->ssl_fallback,
993 g_object_unref (identity);
998 g_object_unref (priv->conn);
999 priv->conn = G_IO_STREAM (conn);
1001 if (!priv->ssl_strict) {
1002 g_signal_connect (conn, "accept-certificate",
1003 G_CALLBACK (soup_socket_accept_certificate),
1007 GTlsServerConnection *conn;
1009 conn = g_initable_new (g_tls_backend_get_server_connection_type (backend),
1011 "base-io-stream", priv->conn,
1012 "certificate", priv->ssl_creds,
1013 "use-system-certdb", FALSE,
1014 "require-close-notify", FALSE,
1019 g_object_unref (priv->conn);
1020 priv->conn = G_IO_STREAM (conn);
1023 g_signal_connect (priv->conn, "notify::peer-certificate",
1024 G_CALLBACK (soup_socket_peer_certificate_changed), sock);
1026 priv->istream = G_POLLABLE_INPUT_STREAM (g_io_stream_get_input_stream (priv->conn));
1027 priv->ostream = G_POLLABLE_OUTPUT_STREAM (g_io_stream_get_output_stream (priv->conn));
1032 soup_socket_handshake_sync (SoupSocket *sock,
1033 GCancellable *cancellable)
1035 SoupSocketPrivate *priv = SOUP_SOCKET_GET_PRIVATE (sock);
1036 GError *error = NULL;
1039 if (g_tls_connection_handshake (G_TLS_CONNECTION (priv->conn),
1040 cancellable, &error))
1041 return SOUP_STATUS_OK;
1042 else if (!priv->ssl_fallback &&
1043 g_error_matches (error, G_TLS_ERROR, G_TLS_ERROR_NOT_TLS)) {
1044 g_error_free (error);
1045 return SOUP_STATUS_TLS_FAILED;
1047 g_error_free (error);
1048 return SOUP_STATUS_SSL_FAILED;
1053 handshake_async_ready (GObject *source, GAsyncResult *result, gpointer user_data)
1055 SoupSocketAsyncConnectData *data = user_data;
1056 SoupSocketPrivate *priv = SOUP_SOCKET_GET_PRIVATE (data->sock);
1057 GError *error = NULL;
1060 if (priv->async_context && !priv->use_thread_context)
1061 g_main_context_pop_thread_default (priv->async_context);
1063 if (g_tls_connection_handshake_finish (G_TLS_CONNECTION (priv->conn),
1065 status = SOUP_STATUS_OK;
1066 else if (!priv->ssl_fallback &&
1067 g_error_matches (error, G_TLS_ERROR, G_TLS_ERROR_NOT_TLS))
1068 status = SOUP_STATUS_TLS_FAILED;
1070 status = SOUP_STATUS_SSL_FAILED;
1071 g_clear_error (&error);
1073 data->callback (data->sock, status, data->user_data);
1074 g_object_unref (data->sock);
1075 g_slice_free (SoupSocketAsyncConnectData, data);
1079 soup_socket_handshake_async (SoupSocket *sock,
1080 GCancellable *cancellable,
1081 SoupSocketCallback callback,
1084 SoupSocketPrivate *priv = SOUP_SOCKET_GET_PRIVATE (sock);
1085 SoupSocketAsyncConnectData *data;
1089 data = g_slice_new (SoupSocketAsyncConnectData);
1090 data->sock = g_object_ref (sock);
1091 data->callback = callback;
1092 data->user_data = user_data;
1094 if (priv->async_context && !priv->use_thread_context)
1095 g_main_context_push_thread_default (priv->async_context);
1096 g_tls_connection_handshake_async (G_TLS_CONNECTION (priv->conn),
1098 cancellable, handshake_async_ready,
1103 * soup_socket_is_ssl:
1104 * @sock: a #SoupSocket
1106 * Tests if @sock is doing (or has attempted to do) SSL.
1108 * Return value: %TRUE if @sock has SSL credentials set
1111 soup_socket_is_ssl (SoupSocket *sock)
1113 SoupSocketPrivate *priv = SOUP_SOCKET_GET_PRIVATE (sock);
1119 * soup_socket_disconnect:
1120 * @sock: a #SoupSocket
1122 * Disconnects @sock. Any further read or write attempts on it will
1126 soup_socket_disconnect (SoupSocket *sock)
1128 SoupSocketPrivate *priv;
1129 gboolean already_disconnected = FALSE;
1131 g_return_if_fail (SOUP_IS_SOCKET (sock));
1132 priv = SOUP_SOCKET_GET_PRIVATE (sock);
1134 if (priv->connect_cancel) {
1135 g_cancellable_cancel (priv->connect_cancel);
1137 } else if (g_mutex_trylock (&priv->iolock)) {
1139 disconnect_internal (sock);
1141 already_disconnected = TRUE;
1142 g_mutex_unlock (&priv->iolock);
1144 /* Another thread is currently doing IO, so
1145 * we can't close the socket. So just shutdown
1146 * the file descriptor to force the I/O to fail.
1147 * (It will actually be closed when the socket
1150 g_socket_shutdown (priv->gsock, TRUE, TRUE, NULL);
1153 if (already_disconnected)
1156 /* Keep ref around signals in case the object is unreferenced
1159 g_object_ref (sock);
1161 /* Give all readers a chance to notice the connection close */
1162 g_signal_emit (sock, signals[READABLE], 0);
1164 /* FIXME: can't disconnect until all data is read */
1166 /* Then let everyone know we're disconnected */
1167 g_signal_emit (sock, signals[DISCONNECTED], 0);
1169 g_object_unref (sock);
1173 * soup_socket_is_connected:
1174 * @sock: a #SoupSocket
1176 * Tests if @sock is connected to another host
1178 * Return value: %TRUE or %FALSE.
1181 soup_socket_is_connected (SoupSocket *sock)
1183 SoupSocketPrivate *priv;
1185 g_return_val_if_fail (SOUP_IS_SOCKET (sock), FALSE);
1186 priv = SOUP_SOCKET_GET_PRIVATE (sock);
1188 return priv->conn != NULL;
1192 * soup_socket_get_local_address:
1193 * @sock: a #SoupSocket
1195 * Returns the #SoupAddress corresponding to the local end of @sock.
1197 * Return value: (transfer none): the #SoupAddress
1200 soup_socket_get_local_address (SoupSocket *sock)
1202 SoupSocketPrivate *priv;
1204 g_return_val_if_fail (SOUP_IS_SOCKET (sock), NULL);
1205 priv = SOUP_SOCKET_GET_PRIVATE (sock);
1207 g_mutex_lock (&priv->addrlock);
1208 if (!priv->local_addr) {
1209 GSocketAddress *addr;
1210 struct sockaddr_storage sa;
1213 addr = g_socket_get_local_address (priv->gsock, NULL);
1214 sa_len = g_socket_address_get_native_size (addr);
1215 g_socket_address_to_native (addr, &sa, sa_len, NULL);
1216 priv->local_addr = soup_address_new_from_sockaddr ((struct sockaddr *)&sa, sa_len);
1217 g_object_unref (addr);
1219 g_mutex_unlock (&priv->addrlock);
1221 return priv->local_addr;
1225 * soup_socket_get_remote_address:
1226 * @sock: a #SoupSocket
1228 * Returns the #SoupAddress corresponding to the remote end of @sock.
1230 * Return value: (transfer none): the #SoupAddress
1233 soup_socket_get_remote_address (SoupSocket *sock)
1235 SoupSocketPrivate *priv;
1237 g_return_val_if_fail (SOUP_IS_SOCKET (sock), NULL);
1238 priv = SOUP_SOCKET_GET_PRIVATE (sock);
1240 g_mutex_lock (&priv->addrlock);
1241 if (!priv->remote_addr) {
1242 GSocketAddress *addr;
1243 struct sockaddr_storage sa;
1246 addr = g_socket_get_remote_address (priv->gsock, NULL);
1247 sa_len = g_socket_address_get_native_size (addr);
1248 g_socket_address_to_native (addr, &sa, sa_len, NULL);
1249 priv->remote_addr = soup_address_new_from_sockaddr ((struct sockaddr *)&sa, sa_len);
1250 g_object_unref (addr);
1252 g_mutex_unlock (&priv->addrlock);
1254 return priv->remote_addr;
1259 socket_read_watch (GObject *pollable, gpointer user_data)
1261 SoupSocket *sock = user_data;
1262 SoupSocketPrivate *priv = SOUP_SOCKET_GET_PRIVATE (sock);
1264 priv->read_src = NULL;
1265 g_signal_emit (sock, signals[READABLE], 0);
1269 static SoupSocketIOStatus
1270 read_from_network (SoupSocket *sock, gpointer buffer, gsize len,
1271 gsize *nread, GCancellable *cancellable, GError **error)
1273 SoupSocketPrivate *priv = SOUP_SOCKET_GET_PRIVATE (sock);
1274 GError *my_err = NULL;
1280 return SOUP_SOCKET_EOF;
1282 if (!priv->non_blocking) {
1283 my_nread = g_input_stream_read (G_INPUT_STREAM (priv->istream),
1285 cancellable, &my_err);
1287 my_nread = g_pollable_input_stream_read_nonblocking (
1288 priv->istream, buffer, len,
1289 cancellable, &my_err);
1293 g_clear_error (&my_err);
1295 return SOUP_SOCKET_OK;
1296 } else if (my_nread == 0) {
1297 g_clear_error (&my_err);
1299 return SOUP_SOCKET_EOF;
1300 } else if (g_error_matches (my_err, G_IO_ERROR, G_IO_ERROR_WOULD_BLOCK)) {
1301 g_clear_error (&my_err);
1302 if (!priv->read_src) {
1304 soup_socket_create_watch (priv, G_IO_IN,
1305 socket_read_watch, sock,
1308 return SOUP_SOCKET_WOULD_BLOCK;
1311 g_propagate_error (error, my_err);
1312 return SOUP_SOCKET_ERROR;
1315 static SoupSocketIOStatus
1316 read_from_buf (SoupSocket *sock, gpointer buffer, gsize len, gsize *nread)
1318 SoupSocketPrivate *priv = SOUP_SOCKET_GET_PRIVATE (sock);
1319 GByteArray *read_buf = priv->read_buf;
1321 *nread = MIN (read_buf->len, len);
1322 memcpy (buffer, read_buf->data, *nread);
1324 if (*nread == read_buf->len) {
1325 g_byte_array_free (read_buf, TRUE);
1326 priv->read_buf = NULL;
1328 memmove (read_buf->data, read_buf->data + *nread,
1329 read_buf->len - *nread);
1330 g_byte_array_set_size (read_buf, read_buf->len - *nread);
1333 return SOUP_SOCKET_OK;
1337 * SoupSocketIOStatus:
1338 * @SOUP_SOCKET_OK: Success
1339 * @SOUP_SOCKET_WOULD_BLOCK: Cannot read/write any more at this time
1340 * @SOUP_SOCKET_EOF: End of file
1341 * @SOUP_SOCKET_ERROR: Other error
1343 * Return value from the #SoupSocket IO methods.
1349 * @buffer: buffer to read into
1350 * @len: size of @buffer in bytes
1351 * @nread: (out): on return, the number of bytes read into @buffer
1352 * @cancellable: a #GCancellable, or %NULL
1353 * @error: error pointer
1355 * Attempts to read up to @len bytes from @sock into @buffer. If some
1356 * data is successfully read, soup_socket_read() will return
1357 * %SOUP_SOCKET_OK, and *@nread will contain the number of bytes
1358 * actually read (which may be less than @len).
1360 * If @sock is non-blocking, and no data is available, the return
1361 * value will be %SOUP_SOCKET_WOULD_BLOCK. In this case, the caller
1362 * can connect to the #SoupSocket::readable signal to know when there
1363 * is more data to read. (NB: You MUST read all available data off the
1364 * socket first. #SoupSocket::readable is only emitted after
1365 * soup_socket_read() returns %SOUP_SOCKET_WOULD_BLOCK, and it is only
1366 * emitted once. See the documentation for #SoupSocket:non-blocking.)
1368 * Return value: a #SoupSocketIOStatus, as described above (or
1369 * %SOUP_SOCKET_EOF if the socket is no longer connected, or
1370 * %SOUP_SOCKET_ERROR on any other error, in which case @error will
1374 soup_socket_read (SoupSocket *sock, gpointer buffer, gsize len,
1375 gsize *nread, GCancellable *cancellable, GError **error)
1377 SoupSocketPrivate *priv;
1378 SoupSocketIOStatus status;
1380 g_return_val_if_fail (SOUP_IS_SOCKET (sock), SOUP_SOCKET_ERROR);
1381 g_return_val_if_fail (nread != NULL, SOUP_SOCKET_ERROR);
1383 priv = SOUP_SOCKET_GET_PRIVATE (sock);
1385 g_mutex_lock (&priv->iolock);
1387 status = read_from_buf (sock, buffer, len, nread);
1389 status = read_from_network (sock, buffer, len, nread, cancellable, error);
1390 g_mutex_unlock (&priv->iolock);
1396 * soup_socket_read_until:
1398 * @buffer: buffer to read into
1399 * @len: size of @buffer in bytes
1400 * @boundary: boundary to read until
1401 * @boundary_len: length of @boundary in bytes
1402 * @nread: (out): on return, the number of bytes read into @buffer
1403 * @got_boundary: on return, whether or not the data in @buffer
1404 * ends with the boundary string
1405 * @cancellable: a #GCancellable, or %NULL
1406 * @error: error pointer
1408 * Like soup_socket_read(), but reads no further than the first
1409 * occurrence of @boundary. (If the boundary is found, it will be
1410 * included in the returned data, and *@got_boundary will be set to
1411 * %TRUE.) Any data after the boundary will returned in future reads.
1413 * soup_socket_read_until() will almost always return fewer than @len
1414 * bytes: if the boundary is found, then it will only return the bytes
1415 * up until the end of the boundary, and if the boundary is not found,
1416 * then it will leave the last <literal>(boundary_len - 1)</literal>
1417 * bytes in its internal buffer, in case they form the start of the
1418 * boundary string. Thus, @len normally needs to be at least 1 byte
1419 * longer than @boundary_len if you want to make any progress at all.
1421 * Return value: as for soup_socket_read()
1424 soup_socket_read_until (SoupSocket *sock, gpointer buffer, gsize len,
1425 gconstpointer boundary, gsize boundary_len,
1426 gsize *nread, gboolean *got_boundary,
1427 GCancellable *cancellable, GError **error)
1429 SoupSocketPrivate *priv;
1430 SoupSocketIOStatus status;
1431 GByteArray *read_buf;
1432 guint match_len, prev_len;
1435 g_return_val_if_fail (SOUP_IS_SOCKET (sock), SOUP_SOCKET_ERROR);
1436 g_return_val_if_fail (nread != NULL, SOUP_SOCKET_ERROR);
1437 g_return_val_if_fail (len >= boundary_len, SOUP_SOCKET_ERROR);
1439 priv = SOUP_SOCKET_GET_PRIVATE (sock);
1441 g_mutex_lock (&priv->iolock);
1443 *got_boundary = FALSE;
1445 if (!priv->read_buf)
1446 priv->read_buf = g_byte_array_new ();
1447 read_buf = priv->read_buf;
1449 if (read_buf->len < boundary_len) {
1450 prev_len = read_buf->len;
1451 g_byte_array_set_size (read_buf, len);
1452 status = read_from_network (sock,
1453 read_buf->data + prev_len,
1454 len - prev_len, nread, cancellable, error);
1455 read_buf->len = prev_len + *nread;
1457 if (status != SOUP_SOCKET_OK) {
1458 g_mutex_unlock (&priv->iolock);
1463 /* Scan for the boundary */
1464 end = read_buf->data + read_buf->len;
1465 for (p = read_buf->data; p <= end - boundary_len; p++) {
1466 if (!memcmp (p, boundary, boundary_len)) {
1468 *got_boundary = TRUE;
1473 /* Return everything up to 'p' (which is either just after the
1474 * boundary, or @boundary_len - 1 bytes before the end of the
1477 match_len = p - read_buf->data;
1478 status = read_from_buf (sock, buffer, MIN (len, match_len), nread);
1480 g_mutex_unlock (&priv->iolock);
1485 socket_write_watch (GObject *pollable, gpointer user_data)
1487 SoupSocket *sock = user_data;
1488 SoupSocketPrivate *priv = SOUP_SOCKET_GET_PRIVATE (sock);
1490 priv->write_src = NULL;
1491 g_signal_emit (sock, signals[WRITABLE], 0);
1496 * soup_socket_write:
1498 * @buffer: data to write
1499 * @len: size of @buffer, in bytes
1500 * @nwrote: (out): on return, number of bytes written
1501 * @cancellable: a #GCancellable, or %NULL
1502 * @error: error pointer
1504 * Attempts to write @len bytes from @buffer to @sock. If some data is
1505 * successfully written, the return status will be %SOUP_SOCKET_OK,
1506 * and *@nwrote will contain the number of bytes actually written
1507 * (which may be less than @len).
1509 * If @sock is non-blocking, and no data could be written right away,
1510 * the return value will be %SOUP_SOCKET_WOULD_BLOCK. In this case,
1511 * the caller can connect to the #SoupSocket::writable signal to know
1512 * when more data can be written. (NB: #SoupSocket::writable is only
1513 * emitted after soup_socket_write() returns %SOUP_SOCKET_WOULD_BLOCK,
1514 * and it is only emitted once. See the documentation for
1515 * #SoupSocket:non-blocking.)
1517 * Return value: a #SoupSocketIOStatus, as described above (or
1518 * %SOUP_SOCKET_EOF or %SOUP_SOCKET_ERROR. @error will be set if the
1519 * return value is %SOUP_SOCKET_ERROR.)
1522 soup_socket_write (SoupSocket *sock, gconstpointer buffer,
1523 gsize len, gsize *nwrote,
1524 GCancellable *cancellable, GError **error)
1526 SoupSocketPrivate *priv;
1527 GError *my_err = NULL;
1530 g_return_val_if_fail (SOUP_IS_SOCKET (sock), SOUP_SOCKET_ERROR);
1531 g_return_val_if_fail (nwrote != NULL, SOUP_SOCKET_ERROR);
1533 priv = SOUP_SOCKET_GET_PRIVATE (sock);
1535 g_mutex_lock (&priv->iolock);
1538 g_mutex_unlock (&priv->iolock);
1539 return SOUP_SOCKET_EOF;
1541 if (priv->write_src) {
1542 g_mutex_unlock (&priv->iolock);
1543 return SOUP_SOCKET_WOULD_BLOCK;
1546 if (!priv->non_blocking) {
1547 my_nwrote = g_output_stream_write (G_OUTPUT_STREAM (priv->ostream),
1549 cancellable, &my_err);
1551 my_nwrote = g_pollable_output_stream_write_nonblocking (
1552 priv->ostream, buffer, len,
1553 cancellable, &my_err);
1556 if (my_nwrote > 0) {
1557 g_mutex_unlock (&priv->iolock);
1558 g_clear_error (&my_err);
1559 *nwrote = my_nwrote;
1560 return SOUP_SOCKET_OK;
1563 if (g_error_matches (my_err, G_IO_ERROR, G_IO_ERROR_WOULD_BLOCK)) {
1564 g_mutex_unlock (&priv->iolock);
1565 g_clear_error (&my_err);
1568 soup_socket_create_watch (priv,
1570 socket_write_watch, sock, cancellable);
1571 return SOUP_SOCKET_WOULD_BLOCK;
1574 g_mutex_unlock (&priv->iolock);
1575 g_propagate_error (error, my_err);
1576 return SOUP_SOCKET_ERROR;