summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Winship <danw@gnome.org>2009-07-02 21:28:53 -0400
committerDan Winship <danw@gnome.org>2009-07-02 21:28:53 -0400
commitaad40ac467d12a188aed01e543aef5016aa4d3cb (patch)
tree125c8fd41e7e9db703bf6f1ad062236a915a8411
parent3c9f3cdffc32126700f25d8a0c55f68b6f587bde (diff)
downloadlibsoup-aad40ac467d12a188aed01e543aef5016aa4d3cb.tar.gz
Fix the SOUP_METHOD_* and SOUP_URI_SCHEME_* defines to be threadsafe
Also fix/optimize a few other things in URI scheme canonicalization
-rw-r--r--libsoup/soup-method.h33
-rw-r--r--libsoup/soup-misc.h2
-rw-r--r--libsoup/soup-uri.c9
-rw-r--r--libsoup/soup-uri.h5
4 files changed, 28 insertions, 21 deletions
diff --git a/libsoup/soup-method.h b/libsoup/soup-method.h
index f646fd2e..e716b8e5 100644
--- a/libsoup/soup-method.h
+++ b/libsoup/soup-method.h
@@ -7,6 +7,7 @@
#define SOUP_METHOD_H 1
#include <libsoup/soup-types.h>
+#include <libsoup/soup-misc.h>
G_BEGIN_DECLS
@@ -33,24 +34,26 @@ G_BEGIN_DECLS
* </programlisting></informalexample>
**/
+#define _SOUP_INTERN_METHOD(method) (_SOUP_ATOMIC_INTERN_STRING (_SOUP_METHOD_##method, #method))
+
/* HTTP/1.1 methods */
-#define SOUP_METHOD_OPTIONS (_SOUP_METHOD_OPTIONS ? _SOUP_METHOD_OPTIONS : (_SOUP_METHOD_OPTIONS = g_intern_static_string ("OPTIONS")))
-#define SOUP_METHOD_GET (_SOUP_METHOD_GET ? _SOUP_METHOD_GET : (_SOUP_METHOD_GET = g_intern_static_string ("GET")))
-#define SOUP_METHOD_HEAD (_SOUP_METHOD_HEAD ? _SOUP_METHOD_HEAD : (_SOUP_METHOD_HEAD = g_intern_static_string ("HEAD")))
-#define SOUP_METHOD_POST (_SOUP_METHOD_POST ? _SOUP_METHOD_POST : (_SOUP_METHOD_POST = g_intern_static_string ("POST")))
-#define SOUP_METHOD_PUT (_SOUP_METHOD_PUT ? _SOUP_METHOD_PUT : (_SOUP_METHOD_PUT = g_intern_static_string ("PUT")))
-#define SOUP_METHOD_DELETE (_SOUP_METHOD_DELETE ? _SOUP_METHOD_DELETE : (_SOUP_METHOD_DELETE = g_intern_static_string ("DELETE")))
-#define SOUP_METHOD_TRACE (_SOUP_METHOD_TRACE ? _SOUP_METHOD_TRACE : (_SOUP_METHOD_TRACE = g_intern_static_string ("TRACE")))
-#define SOUP_METHOD_CONNECT (_SOUP_METHOD_CONNECT ? _SOUP_METHOD_CONNECT : (_SOUP_METHOD_CONNECT = g_intern_static_string ("CONNECT")))
+#define SOUP_METHOD_OPTIONS _SOUP_INTERN_METHOD (OPTIONS)
+#define SOUP_METHOD_GET _SOUP_INTERN_METHOD (GET)
+#define SOUP_METHOD_HEAD _SOUP_INTERN_METHOD (HEAD)
+#define SOUP_METHOD_POST _SOUP_INTERN_METHOD (POST)
+#define SOUP_METHOD_PUT _SOUP_INTERN_METHOD (PUT)
+#define SOUP_METHOD_DELETE _SOUP_INTERN_METHOD (DELETE)
+#define SOUP_METHOD_TRACE _SOUP_INTERN_METHOD (TRACE)
+#define SOUP_METHOD_CONNECT _SOUP_INTERN_METHOD (CONNECT)
/* WebDAV methods */
-#define SOUP_METHOD_PROPFIND (_SOUP_METHOD_PROPFIND ? _SOUP_METHOD_PROPFIND : (_SOUP_METHOD_PROPFIND = g_intern_static_string ("PROPFIND")))
-#define SOUP_METHOD_PROPPATCH (_SOUP_METHOD_PROPPATCH ? _SOUP_METHOD_PROPPATCH : (_SOUP_METHOD_PROPPATCH = g_intern_static_string ("PROPPATCH")))
-#define SOUP_METHOD_MKCOL (_SOUP_METHOD_MKCOL ? _SOUP_METHOD_MKCOL : (_SOUP_METHOD_MKCOL = g_intern_static_string ("MKCOL")))
-#define SOUP_METHOD_COPY (_SOUP_METHOD_COPY ? _SOUP_METHOD_COPY : (_SOUP_METHOD_COPY = g_intern_static_string ("COPY")))
-#define SOUP_METHOD_MOVE (_SOUP_METHOD_MOVE ? _SOUP_METHOD_MOVE : (_SOUP_METHOD_MOVE = g_intern_static_string ("MOVE")))
-#define SOUP_METHOD_LOCK (_SOUP_METHOD_LOCK ? _SOUP_METHOD_LOCK : (_SOUP_METHOD_LOCK = g_intern_static_string ("LOCK")))
-#define SOUP_METHOD_UNLOCK (_SOUP_METHOD_UNLOCK ? _SOUP_METHOD_UNLOCK : (_SOUP_METHOD_UNLOCK = g_intern_static_string ("UNLOCK")))
+#define SOUP_METHOD_PROPFIND _SOUP_INTERN_METHOD (PROPFIND)
+#define SOUP_METHOD_PROPPATCH _SOUP_INTERN_METHOD (PROPPATCH)
+#define SOUP_METHOD_MKCOL _SOUP_INTERN_METHOD (MKCOL)
+#define SOUP_METHOD_COPY _SOUP_INTERN_METHOD (COPY)
+#define SOUP_METHOD_MOVE _SOUP_INTERN_METHOD (MOVE)
+#define SOUP_METHOD_LOCK _SOUP_INTERN_METHOD (LOCK)
+#define SOUP_METHOD_UNLOCK _SOUP_INTERN_METHOD (UNLOCK)
/* Do not use these variables directly; use the macros above, which
* ensure that they get initialized properly.
diff --git a/libsoup/soup-misc.h b/libsoup/soup-misc.h
index 162ddacd..f8dde104 100644
--- a/libsoup/soup-misc.h
+++ b/libsoup/soup-misc.h
@@ -33,6 +33,8 @@ guint soup_str_case_hash (gconstpointer key);
gboolean soup_str_case_equal (gconstpointer v1,
gconstpointer v2);
+#define _SOUP_ATOMIC_INTERN_STRING(variable, value) (g_once_init_enter ((gsize *)&variable) ? (g_once_init_leave ((gsize *)&variable, GPOINTER_TO_SIZE (g_intern_static_string (value))), variable) : variable)
+
/* SSL stuff */
extern const gboolean soup_ssl_supported;
diff --git a/libsoup/soup-uri.c b/libsoup/soup-uri.c
index 819e5cce..72a900db 100644
--- a/libsoup/soup-uri.c
+++ b/libsoup/soup-uri.c
@@ -100,16 +100,17 @@ const char *_SOUP_URI_SCHEME_HTTP, *_SOUP_URI_SCHEME_HTTPS;
static inline const char *
soup_uri_get_scheme (const char *scheme, int len)
{
- if (len == 4 && !strncmp (scheme, "http", 4)) {
+ if (len == 4 && !g_ascii_strncasecmp (scheme, "http", len)) {
return SOUP_URI_SCHEME_HTTP;
- } else if (len == 5 && !strncmp (scheme, "https", 5)) {
+ } else if (len == 5 && !g_ascii_strncasecmp (scheme, "https", len)) {
return SOUP_URI_SCHEME_HTTPS;
} else {
char *lower_scheme;
lower_scheme = g_ascii_strdown (scheme, len);
- scheme = g_intern_string (lower_scheme);
- g_free (lower_scheme);
+ scheme = g_intern_static_string (lower_scheme);
+ if (scheme != (const char *)lower_scheme)
+ g_free (lower_scheme);
return scheme;
}
}
diff --git a/libsoup/soup-uri.h b/libsoup/soup-uri.h
index 32de7a3b..c05f3f23 100644
--- a/libsoup/soup-uri.h
+++ b/libsoup/soup-uri.h
@@ -9,6 +9,7 @@
#define SOUP_URI_H 1
#include <libsoup/soup-types.h>
+#include <libsoup/soup-misc.h>
G_BEGIN_DECLS
@@ -30,8 +31,8 @@ struct _SoupURI {
GType soup_uri_get_type (void);
#define SOUP_TYPE_URI (soup_uri_get_type ())
-#define SOUP_URI_SCHEME_HTTP (_SOUP_URI_SCHEME_HTTP ? _SOUP_URI_SCHEME_HTTP : (_SOUP_URI_SCHEME_HTTP = g_intern_static_string ("http")))
-#define SOUP_URI_SCHEME_HTTPS (_SOUP_URI_SCHEME_HTTPS ? _SOUP_URI_SCHEME_HTTPS : (_SOUP_URI_SCHEME_HTTPS = g_intern_static_string ("https")))
+#define SOUP_URI_SCHEME_HTTP _SOUP_ATOMIC_INTERN_STRING (_SOUP_URI_SCHEME_HTTP, "http")
+#define SOUP_URI_SCHEME_HTTPS _SOUP_ATOMIC_INTERN_STRING (_SOUP_URI_SCHEME_HTTPS, "https")
extern const char *_SOUP_URI_SCHEME_HTTP, *_SOUP_URI_SCHEME_HTTPS;
SoupURI *soup_uri_new_with_base (SoupURI *base,