Author: Martin Hepp, martin.hepp@unibw.de
Experiments regarding the support of MIME types (aka media types or IANA media types) and HTTP Content Negotiation for RDF/XML, JSON-LD, Turtle, N3, and NTriples syntaxes.
The purpose of this repository is to test and document whether typical MIME types for Linked Open Data and the Semantic Web are properly derived from local filename extensions and lead to correct MIME type information in the HTTP Response Message header data.
Source code on Github: https://github.com/mfhepp/test_mime_types
Github Pages version: https://mfhepp.github.io/test_mime_types/
Note: The actual payload of the examples is just quickly compiled from trivial examples in the respective specifications or other resources. They might not validate and have no meaningful content.
File Format | Filename | Expected MIME Type | Github MIME | Comment |
---|---|---|---|---|
RDF in RDF/XML | test.rdf | application/rdf+xml | application/rdf+xml | OK |
OWL in RDF/XML | test.owl | application/owl+xml | application/rdf+xml | OK |
Turtle | test.ttl | text/turtle | text/turtle | OK |
NTriples | test.nt | application/n-triples | application/n-triples | OK |
N3 | test.n3 | text/n3 | text/n3 | OK |
JSON-LD | test.jsonld | application/ld+json | application/ld+json | OK |
You can always check the current status of support by using curl
.
$ curl -I https://mfhepp.github.io/test_mime_types/test.rdf
$ curl -I https://mfhepp.github.io/test_mime_types/test.owl
$ curl -I https://mfhepp.github.io/test_mime_types/test.ttl
$ curl -I https://mfhepp.github.io/test_mime_types/test.nt
$ curl -I https://mfhepp.github.io/test_mime_types/test.n3
$ curl -I https://mfhepp.github.io/test_mime_types/test.jsonld
There is also a Python script check_mime_types.py
for this purpose.
As of 2024-10-31, all above files return the proper MIME type from their Github pages URIs.
For files with the extention .owl
, Github returns application/rdf+xml
instead of application/owl+xml
, but that's technically fine.
So Github Pages is able to recognize the proper MIME type from the file extension and signal it back to the client in the HTTP response header.
Some of the current recommendations for the deployment of Linked Data and Web ontologies on the Web require server-side HTTP Content Negotiation (called "pro-active content negotiation" in the new IETF RFC 7231.
- https://www.w3.org/TR/swbp-vocab-pub/
- http://wifo5-03.informatik.uni-mannheim.de/bizer/pub/LinkedDataTutorial/
- https://www.w3.org/TR/ld-bp/
This can also be checked with curl
, see e.g. Richard Cyganiak's nice tutorial on this.
The very simple case of returning HTML as a default for an HTTP HEAD request without any file extension returns the HTML version, is properly supported:
$ curl -I https://mfhepp.github.io/test_mime_types/test HTTP/2 200 ... content-type: text/html; charset=utf-8 ...
Ideally, two other scenarios would be supported:
Cool URIs for Linked Data would ideally be supported, i.e. the best-matching representation would be returned baded on the Accept
request header parameter, like so
$ curl -I -H "Accept: application/rdf+xml"
for text/html
and all available RDF syntaxes:
- application/rdf+xml
- application/owl+xml
- text/turtle
- application/n-triples
- text/n3
- application/ld+json
curl -I -H "Accept: application/rdf+xml" https://mfhepp.github.io/test_mime_types/test curl -I -H "Accept: application/owl+xml" https://mfhepp.github.io/test_mime_types/test curl -I -H "Accept: text/turtle" https://mfhepp.github.io/test_mime_types/test curl -I -H "Accept: application/n-triples" https://mfhepp.github.io/test_mime_types/test curl -I -H "Accept: text/n3" https://mfhepp.github.io/test_mime_types/test curl -I -H "Accept: application/ld+json" https://mfhepp.github.io/test_mime_types/test
There is also a bash script check_conneg.sh
for this purpose.
Status 2024-10-31: Unfortunately, Github Pages always returns the HTML version and ignores the indicated MIME type preferences:
$ curl -I -H "Accept: application/rdf+xml" https://mfhepp.github.io/test_mime_types/test HTTP/2 200 server: GitHub.com content-type: text/html; charset=utf-8 permissions-policy: interest-cohort=() last-modified: Thu, 31 Oct 2024 11:56:02 GMT access-control-allow-origin: * etag: "67237052-2b2" expires: Thu, 31 Oct 2024 12:28:16 GMT cache-control: max-age=600 ... accept-ranges: bytes age: 509 date: Thu, 31 Oct 2024 12:26:45 GMT via: 1.1 varnish ... vary: Accept-Encoding ... content-length: 690
In an ideal world, Github Pages would return 303 redirects for an HTTP request with MIME type preferences that recommend another local file, e.g. requestion application/rdf+xml
from the URI of JSON-LD variant, like so
$ curl -I -H "Accept: application/rdf+xml" https://mfhepp.github.io/test_mime_types/test.jsonld
Again, Github Pages simply returns the static file mapped to that URI, in this case test.jsonld
with its original MIME type, but neither redirects to a better matching URI nor hints to alternative representations:
$ curl -I -H "Accept: application/rdf+xml" https://mfhepp.github.io/test_mime_types/test.jsonld HTTP/2 200 server: GitHub.com content-type: application/ld+json permissions-policy: interest-cohort=() last-modified: Thu, 31 Oct 2024 11:56:02 GMT access-control-allow-origin: * etag: "67237052-dd" expires: Thu, 31 Oct 2024 12:13:31 GMT cache-control: max-age=600 ... accept-ranges: bytes age: 203 date: Thu, 31 Oct 2024 12:28:25 GMT via: 1.1 varnish ... vary: Accept-Encoding ...
- https://www.w3.org/TR/rdf-syntax-grammar/#section-MIME-Type
- https://www.w3.org/TR/owl2-xml-serialization/
- https://www.w3.org/TR/turtle/
- https://www.w3.org/TR/n-triples/
- https://www.w3.org/TeamSubmission/n3/
- https://www.w3.org/TR/json-ld11/
- 2020-11-04: Initial version
- 2024-01-10: Updated status, cosmetic fixes, new theme, wording
- 2024-10-31: Updated status, fixed table, added scripts for automating tests