summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2021-11-21 23:45:56 +0100
committerCarlos Garnacho <carlosg@gnome.org>2022-02-04 19:22:01 +0100
commit883bc6facedc9575deb6a9ae94dde47433d79c0e (patch)
tree9aed0fefd2d48efafe8fd70d1a16eded61c018bf
parent39b365a17edb1b03cd5242a5731b5718d4913715 (diff)
downloadtracker-883bc6facedc9575deb6a9ae94dde47433d79c0e.tar.gz
libtracker-sparql: Implement serialize_async/finish on remote connection
HTTP endpoints must already serve RDF formats on DESCRIBE/CONSTRUCT queries if asked so. Hook the TrackerSparqlConnection serialize_async call there, and handle those formats in the TrackerEndpointHttp.
-rw-r--r--src/libtracker-sparql/remote/tracker-remote.vala30
-rw-r--r--src/libtracker-sparql/tracker-endpoint-http.c10
2 files changed, 40 insertions, 0 deletions
diff --git a/src/libtracker-sparql/remote/tracker-remote.vala b/src/libtracker-sparql/remote/tracker-remote.vala
index f3be3147a..98c85467f 100644
--- a/src/libtracker-sparql/remote/tracker-remote.vala
+++ b/src/libtracker-sparql/remote/tracker-remote.vala
@@ -28,6 +28,8 @@ public class Tracker.Remote.Connection : Tracker.Sparql.Connection {
const string XML_TYPE = "application/sparql-results+xml";
const string JSON_TYPE = "application/sparql-results+json";
+ const string TTL_TYPE = "text/turtle";
+ const string TRIG_TYPE = "application/trig";
const string USER_AGENT = "Tracker/" + PACKAGE_VERSION + " (https://gitlab.gnome.org/GNOME/tracker/issues/; tracker-list@lists.gnome.org) Tracker/" + PACKAGE_VERSION;
public Connection (string base_uri) {
@@ -36,6 +38,25 @@ public class Tracker.Remote.Connection : Tracker.Sparql.Connection {
_session = new Soup.Session ();
}
+ private Soup.Message create_describe_request (string sparql, RdfFormat format) {
+ var uri = _base_uri + "?query=" + GLib.Uri.escape_string (sparql, null, false);
+ var message = new Soup.Message ("GET", uri);
+#if SOUP2
+ var headers = message.request_headers;
+#else
+ var headers = message.get_request_headers();
+#endif
+
+ headers.append ("User-Agent", USER_AGENT);
+
+ if (format == RdfFormat.TURTLE)
+ headers.append ("Accept", TTL_TYPE);
+ else if (format == RdfFormat.TRIG)
+ headers.append ("Accept", TRIG_TYPE);
+
+ return message;
+ }
+
private Soup.Message create_request (string sparql) {
var uri = _base_uri + "?query=" + GLib.Uri.escape_string (sparql, null, false);
var message = new Soup.Message ("GET", uri);
@@ -120,4 +141,13 @@ public class Tracker.Remote.Connection : Tracker.Sparql.Connection {
public async override bool close_async () throws GLib.IOError {
return true;
}
+
+ public async override GLib.InputStream serialize_async (RdfFormat format, string sparql, GLib.Cancellable? cancellable = null) throws Sparql.Error, GLib.Error, GLib.IOError, GLib.DBusError {
+ var message = create_describe_request (sparql, format);
+#if SOUP2
+ return yield _session.send_async (message, cancellable);
+#else
+ return yield _session.send_async (message, GLib.Priority.DEFAULT, cancellable);
+#endif
+ }
}
diff --git a/src/libtracker-sparql/tracker-endpoint-http.c b/src/libtracker-sparql/tracker-endpoint-http.c
index 0d56bd561..2f1282004 100644
--- a/src/libtracker-sparql/tracker-endpoint-http.c
+++ b/src/libtracker-sparql/tracker-endpoint-http.c
@@ -83,6 +83,8 @@ enum {
#define XML_TYPE "application/sparql-results+xml"
#define JSON_TYPE "application/sparql-results+json"
+#define TTL_TYPE "text/turtle"
+#define TRIG_TYPE "application/trig"
static GParamSpec *props[N_PROPS];
static guint signals[N_SIGNALS];
@@ -235,6 +237,14 @@ pick_format (SoupMessage *message,
soup_message_headers_set_content_type (response_headers, XML_TYPE, NULL);
*format = TRACKER_SERIALIZER_FORMAT_XML;
return TRUE;
+ } else if (soup_message_headers_header_contains (request_headers, "Accept", TTL_TYPE)) {
+ soup_message_headers_set_content_type (response_headers, TTL_TYPE, NULL);
+ *format = TRACKER_SERIALIZER_FORMAT_TTL;
+ return TRUE;
+ } else if (soup_message_headers_header_contains (request_headers, "Accept", TRIG_TYPE)) {
+ soup_message_headers_set_content_type (response_headers, TRIG_TYPE, NULL);
+ *format = TRACKER_SERIALIZER_FORMAT_TRIG;
+ return TRUE;
} else {
return FALSE;
}