Selaa lähdekoodia

Merge branch 'master' into issues/115

Stefano Cossu 4 vuotta sitten
vanhempi
commit
1f118c7cb1
2 muutettua tiedostoa jossa 33 lisäystä ja 16 poistoa
  1. 20 16
      lakesuperior/endpoints/ldp.py
  2. 13 0
      tests/3_endpoints/test_3_0_ldp.py

+ 20 - 16
lakesuperior/endpoints/ldp.py

@@ -182,26 +182,30 @@ def get_resource(uid, out_fmt=None):
                 rdf_mimetype = DEFAULT_RDF_MIMETYPE
             ggr = g.tbox.globalize_imr(rsrc.out_graph)
             ggr.namespace_manager = nsm
-            return _negotiate_content(
+            rsp = _negotiate_content(
                     ggr, rdf_mimetype, out_headers, uid=uid, uri=uri)
+            if isinstance(rsrc, LdpNr):
+                rsp.headers.add(
+                        'Link', f'<{g.tbox.uid_to_uri(uid)}>', rel='describes')
+
+            return rsp
 
         # Datastream.
+        if not getattr(rsrc, 'local_path', False):
+            return ('{} has no binary content.'.format(rsrc.uid), 404)
+
+        logger.debug('Streaming out binary content.')
+        if request.range and request.range.units == 'bytes':
+            # Stream partial response.
+            # This is only true if the header is well-formed. Thanks, Werkzeug.
+            rsp = _parse_range_header(
+                request.range.ranges, rsrc, out_headers
+            )
         else:
-            if not getattr(rsrc, 'local_path', False):
-                return ('{} has no binary content.'.format(rsrc.uid), 404)
-
-            logger.debug('Streaming out binary content.')
-            if request.range and request.range.units == 'bytes':
-                # Stream partial response.
-                # This is only true if the header is well-formed. Thanks, Werkzeug.
-                rsp = _parse_range_header(
-                    request.range.ranges, rsrc, out_headers
-                )
-            else:
-                rsp = make_response(send_file(
-                        rsrc.local_path, as_attachment=True,
-                        attachment_filename=rsrc.filename,
-                        mimetype=rsrc.mimetype), 200, out_headers)
+            rsp = make_response(send_file(
+                    rsrc.local_path, as_attachment=True,
+                    attachment_filename=rsrc.filename,
+                    mimetype=rsrc.mimetype), 200, out_headers)
 
         # This seems necessary to prevent Flask from setting an
         # additional ETag.

+ 13 - 0
tests/3_endpoints/test_3_0_ldp.py

@@ -364,6 +364,19 @@ class TestLdp:
             assert rsp_ok.status_code == 201
 
 
+    def test_metadata_describe_header(self):
+        """
+        Verify that a "describe" Link header is presented for LDP-NR metadata.
+        """
+        uid = f'/{uuid4()}'
+        self.client.put(f'/ldp{uid}', data=b'ciao')
+
+        md_rsp = self.client.get(f'/ldp{uid}/fcr:metadata')
+        assert (
+                f'<{g.tbox.uid_to_uri(uid)}>; rel=describes'
+                in md_rsp.headers.get_all('Link'))
+
+
     def test_put_mismatched_ldp_rs(self, rnd_img):
         """
         Verify MIME type / LDP mismatch.