Skip to content

Commit

Permalink
Merge pull request #1022 from NoutieH/feature/add_content_type_to_req…
Browse files Browse the repository at this point in the history
…uest_header

Add the content type 'application/sparql-update' when preparing a SPARQL update request
  • Loading branch information
white-gecko authored May 1, 2020
2 parents a39c1a7 + 0986737 commit 827eabd
Show file tree
Hide file tree
Showing 2 changed files with 82 additions and 2 deletions.
6 changes: 5 additions & 1 deletion rdflib/plugins/stores/sparqlconnector.py
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@ def query(self, query, default_graph=None):
if self.method == 'GET':
args['params'].update(params)
elif self.method == 'POST':
args['headers'].update({'Content-Type': 'application/sparql-query'})
args['data'] = params
else:
raise SPARQLConnectorException("Unknown method %s" % self.method)
Expand All @@ -106,7 +107,10 @@ def update(self, update, default_graph=None):
if default_graph:
params["using-graph-uri"] = default_graph

headers = {'Accept': _response_mime_types[self.returnFormat]}
headers = {
'Accept': _response_mime_types[self.returnFormat],
'Content-Type': 'application/sparql-update',
}

args = dict(self.kwargs)

Expand Down
78 changes: 77 additions & 1 deletion test/test_sparqlstore.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,10 @@
import unittest
from nose import SkipTest
from requests import HTTPError

from http.server import BaseHTTPRequestHandler, HTTPServer
import socket
from threading import Thread
import requests

try:
assert len(urlopen("http://dbpedia.org/sparql").read()) > 0
Expand Down Expand Up @@ -67,5 +70,78 @@ def test_query_with_added_prolog(self):
assert type(i[0]) == Literal, i[0].n3()


class SPARQLStoreUpdateTestCase(unittest.TestCase):
def setUp(self):
port = self.setup_mocked_endpoint()
self.graph = Graph(store="SPARQLUpdateStore", identifier=URIRef("urn:ex"))
self.graph.open(("http://localhost:{port}/query".format(port=port),
"http://localhost:{port}/update".format(port=port)), create=False)
ns = list(self.graph.namespaces())
assert len(ns) > 0, ns

def setup_mocked_endpoint(self):
# Configure mock server.
s = socket.socket(socket.AF_INET, type=socket.SOCK_STREAM)
s.bind(('localhost', 0))
address, port = s.getsockname()
s.close()
mock_server = HTTPServer(('localhost', port), SPARQL11ProtocolStoreMock)

# Start running mock server in a separate thread.
# Daemon threads automatically shut down when the main process exits.
mock_server_thread = Thread(target=mock_server.serve_forever)
mock_server_thread.setDaemon(True)
mock_server_thread.start()
print("Started mocked sparql endpoint on http://localhost:{port}/".format(port=port))
return port

def tearDown(self):
self.graph.close()

def test_Query(self):
query = "insert data {<urn:s> <urn:p> <urn:o>}"
res = self.graph.update(query)
print(res)


class SPARQL11ProtocolStoreMock(BaseHTTPRequestHandler):
def do_POST(self):
"""
If the body should be analysed as well, just use:
```
body = self.rfile.read(int(self.headers['Content-Length'])).decode()
print(body)
```
"""
contenttype = self.headers.get("Content-Type")
if self.path == "/query":
if self.headers.get("Content-Type") == "application/sparql-query":
pass
elif self.headers.get("Content-Type") == "application/x-www-form-urlencoded":
pass
else:
self.send_response(requests.codes.not_acceptable)
self.end_headers()
elif self.path == "/update":
if self.headers.get("Content-Type") == "application/sparql-update":
pass
elif self.headers.get("Content-Type") == "application/x-www-form-urlencoded":
pass
else:
self.send_response(requests.codes.not_acceptable)
self.end_headers()
else:
self.send_response(requests.codes.not_found)
self.end_headers()
self.send_response(requests.codes.ok)
self.end_headers()
return

def do_GET(self):
# Process an HTTP GET request and return a response with an HTTP 200 status.
self.send_response(requests.codes.ok)
self.end_headers()
return

if __name__ == '__main__':
unittest.main()

0 comments on commit 827eabd

Please sign in to comment.