sparql-client and joseki: more flexible content negotiation?

Ben Lavender asked me to bring this up on the list.

I discovered that sparql-client can't be used out-of-the-box to query
Joseki repositories.  This is because Joseki up to 3.4.2 has a bug
that makes it return N3 for text/plain content type and text/plain seems
to be the only content type in the default Accept: headers that is common
to both..

C.f. http://tech.groups.yahoo.com/group/jena-dev/message/45451 for details
of the bug.

My first workaround was to patch sparql-client to generate the Accept:
header dynamically depending on the RDF::Readers that are loaded.

# also accept content types for other known RDF::Formats

--- lib/sparql/client.rb.orig	2010-10-19 14:35:53.000000000 +0000
+++ lib/sparql/client.rb	2010-10-19 14:42:59.000000000 +0000
@@ -28,7 +28,8 @@
     # @param  [Hash{Symbol => Object}] options
     def initialize(url, options = {}, &block)
       @url, @options = RDF::URI.new(url.to_s), options
-      @headers = {'Accept' => "#{RESULT_JSON}, #{RESULT_XML}, text/plain"}
+      @headers = {'Accept' => [RESULT_JSON, RESULT_XML,
+          RDF::Format.content_types.collect { |k,v| k.to_s }].join(', ')}
 
       if block_given?
         case block.arity

I seems to me it should be possible to influence the acceptable content-types
through an option argument to SPARQL::Client::Repository.new.  There's some
support in sparql/client.rb for setting the Accept: header from
options[:content_type] but that relies on options being passed down from
the invoking method.

Any ideas?

--chris

Received on Wednesday, 3 November 2010 22:48:19 UTC