aboutsummaryrefslogtreecommitdiff
blob: 4cf6efbf1e1ee83cf29a8133c4196f9fc163e497 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
From 56d0018d911eb5783f22125d9893fce075778c64 Mon Sep 17 00:00:00 2001
From: Christian Persch <chpe@gnome.org>
Date: Sun, 3 Mar 2013 20:32:09 +0100
Subject: [PATCH 1/3] io: Resolve relative URIs

---
 rsvg-base.c | 81 ++++++++++++++++++++++++++++++++++++++++++++++++-------------
 1 file changed, 64 insertions(+), 17 deletions(-)

diff --git a/rsvg-base.c b/rsvg-base.c
index 6210716..ed383d2 100644
--- a/rsvg-base.c
+++ b/rsvg-base.c
@@ -2154,36 +2154,83 @@ _rsvg_handle_allow_load (RsvgHandle *handle,
     return TRUE;
 }
 
+static char *
+_rsvg_handle_resolve_uri (RsvgHandle *handle,
+                          const char *uri)
+{
+    RsvgHandlePrivate *priv = handle->priv;
+    char *scheme, *resolved_uri;
+    GFile *base, *resolved;
+
+    if (uri == NULL)
+        return NULL;
+
+    scheme = g_uri_parse_scheme (uri);
+    if (scheme != NULL ||
+        priv->base_gfile == NULL ||
+        (base = g_file_get_parent (priv->base_gfile)) == NULL) {
+        g_free (scheme);
+        return g_strdup (uri);
+    }
+
+    resolved = g_file_resolve_relative_path (base, uri);
+    resolved_uri = g_file_get_uri (resolved);
+
+    g_free (scheme);
+    g_object_unref (base);
+    g_object_unref (resolved);
+
+    return resolved_uri;
+}
+
 guint8* 
 _rsvg_handle_acquire_data (RsvgHandle *handle,
-                           const char *uri,
+                           const char *url,
                            char **content_type,
                            gsize *len,
                            GError **error)
 {
-    if (!_rsvg_handle_allow_load (handle, uri, error))
-        return NULL;
+    char *uri;
+    guint8 *data;
+
+    uri = _rsvg_handle_resolve_uri (handle, url);
+
+    if (_rsvg_handle_allow_load (handle, uri, error)) {
+        data = _rsvg_io_acquire_data (uri, 
+                                      rsvg_handle_get_base_uri (handle), 
+                                      content_type, 
+                                      len, 
+                                      handle->priv->cancellable,
+                                      error);
+    } else {
+        data = NULL;
+    }
 
-    return _rsvg_io_acquire_data (uri, 
-                                  rsvg_handle_get_base_uri (handle), 
-                                  content_type, 
-                                  len, 
-                                  handle->priv->cancellable,
-                                  error);
+    g_free (uri);
+    return data;
 }
 
 GInputStream *
 _rsvg_handle_acquire_stream (RsvgHandle *handle,
-                             const char *uri,
+                             const char *url,
                              char **content_type,
                              GError **error)
 {
-    if (!_rsvg_handle_allow_load (handle, uri, error))
-        return NULL;
+    char *uri;
+    GInputStream *stream;
+
+    uri = _rsvg_handle_resolve_uri (handle, url);
+
+    if (_rsvg_handle_allow_load (handle, uri, error)) {
+        stream = _rsvg_io_acquire_stream (uri, 
+                                          rsvg_handle_get_base_uri (handle), 
+                                          content_type, 
+                                          handle->priv->cancellable,
+                                          error);
+    } else {
+        stream = NULL;
+    }
 
-    return _rsvg_io_acquire_stream (uri, 
-                                    rsvg_handle_get_base_uri (handle), 
-                                    content_type, 
-                                    handle->priv->cancellable,
-                                    error);
+    g_free (uri);
+    return stream;
 }
-- 
1.8.3.2