diff --git a/config/config-default.json b/config/config-default.json index 880e6f02b..2e05b7501 100644 --- a/config/config-default.json +++ b/config/config-default.json @@ -16,6 +16,7 @@ "files-scs:config/presets/middleware.json", "files-scs:config/presets/pod-management.json", "files-scs:config/presets/representation-conversion.json", + "files-scs:config/presets/static.json", "files-scs:config/presets/storage/backend/storage-memory.json", "files-scs:config/presets/storage-wrapper.json", "files-scs:config/presets/cli-params.json" diff --git a/config/config-file.json b/config/config-file.json index e002a8fbd..03e140e9c 100644 --- a/config/config-file.json +++ b/config/config-file.json @@ -16,6 +16,7 @@ "files-scs:config/presets/middleware.json", "files-scs:config/presets/pod-management.json", "files-scs:config/presets/representation-conversion.json", + "files-scs:config/presets/static.json", "files-scs:config/presets/storage/backend/storage-filesystem.json", "files-scs:config/presets/storage-wrapper.json", "files-scs:config/presets/cli-params.json" diff --git a/config/config-path-routing.json b/config/config-path-routing.json index 8d9e8c7ab..1f0c804f9 100644 --- a/config/config-path-routing.json +++ b/config/config-path-routing.json @@ -16,6 +16,7 @@ "files-scs:config/presets/middleware.json", "files-scs:config/presets/pod-management.json", "files-scs:config/presets/representation-conversion.json", + "files-scs:config/presets/static.json", "files-scs:config/presets/storage/backend/storage-filesystem.json", "files-scs:config/presets/storage/backend/storage-memory.json", "files-scs:config/presets/storage/backend/storage-sparql-endpoint.json", diff --git a/config/config-rdf-to-sparql-endpoint.json b/config/config-rdf-to-sparql-endpoint.json index 9486c8e93..f7b6acf24 100644 --- a/config/config-rdf-to-sparql-endpoint.json +++ b/config/config-rdf-to-sparql-endpoint.json @@ -16,6 +16,7 @@ "files-scs:config/presets/middleware.json", "files-scs:config/presets/pod-management.json", "files-scs:config/presets/representation-conversion.json", + "files-scs:config/presets/static.json", "files-scs:config/presets/storage/backend/storage-filesystem.json", "files-scs:config/presets/storage/backend/storage-sparql-endpoint.json", "files-scs:config/presets/storage/routing/quad-type-routing.json", diff --git a/config/config-sparql-endpoint.json b/config/config-sparql-endpoint.json index 29609334e..be0edf08f 100644 --- a/config/config-sparql-endpoint.json +++ b/config/config-sparql-endpoint.json @@ -16,6 +16,7 @@ "files-scs:config/presets/middleware.json", "files-scs:config/presets/pod-management.json", "files-scs:config/presets/representation-conversion.json", + "files-scs:config/presets/static.json", "files-scs:config/presets/storage/backend/storage-sparql-endpoint.json", "files-scs:config/presets/storage-wrapper.json", "files-scs:config/presets/cli-params.json" diff --git a/config/presets/http.json b/config/presets/http.json index e27281aaa..b773ce799 100644 --- a/config/presets/http.json +++ b/config/presets/http.json @@ -28,6 +28,9 @@ { "@type": "WaterfallHandler", "WaterfallHandler:_handlers": [ + { + "@id": "urn:solid-server:default:StaticAssetHandler" + }, { "@id": "urn:solid-server:default:PodManagerHandler" }, diff --git a/config/presets/representation-conversion.json b/config/presets/representation-conversion.json index 110524901..4e765487a 100644 --- a/config/presets/representation-conversion.json +++ b/config/presets/representation-conversion.json @@ -82,7 +82,11 @@ "@type": "WaterfallHandler", "WaterfallHandler:_handlers": [ { - "@type": "IfNeededConverter" + "@id": "urn:solid-server:default:IndexConverter", + }, + { + "@type": "IfNeededConverter", + "comment": "Only continue converting if the requester cannot accept the available content type", }, { "@id": "urn:solid-server:default:ContentTypeReplacer" diff --git a/config/presets/static.json b/config/presets/static.json new file mode 100644 index 000000000..aa253b1ec --- /dev/null +++ b/config/presets/static.json @@ -0,0 +1,15 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "@graph": [ + { + "@id": "urn:solid-server:default:IndexConverter", + "@type": "UnsupportedAsyncHandler", + "comment": "This value can be used to set a custom handler for index files" + }, + { + "@id": "urn:solid-server:default:StaticAssetHandler", + "@type": "UnsupportedAsyncHandler", + "comment": "This value can be used to set a custom handler for static assets" + } + ] +} diff --git a/src/server/middleware/StaticAssetHandler.ts b/src/server/middleware/StaticAssetHandler.ts index 1967b5c91..856955a4c 100644 --- a/src/server/middleware/StaticAssetHandler.ts +++ b/src/server/middleware/StaticAssetHandler.ts @@ -2,6 +2,7 @@ import { createReadStream } from 'fs'; import * as mime from 'mime-types'; import { getLoggerFor } from '../../logging/LogUtil'; import { APPLICATION_OCTET_STREAM } from '../../util/ContentTypes'; +import { NotImplementedHttpError } from '../../util/errors/NotImplementedHttpError'; import { pipeSafely } from '../../util/StreamUtil'; import type { HttpHandlerInput } from '../HttpHandler'; import { HttpHandler } from '../HttpHandler'; @@ -25,10 +26,10 @@ export class StaticAssetHandler extends HttpHandler { public async canHandle({ request }: HttpHandlerInput): Promise { if (request.method !== 'GET' && request.method !== 'HEAD') { - throw new Error('Only GET and HEAD requests are supported'); + throw new NotImplementedHttpError('Only GET and HEAD requests are supported'); } if (!(this.getAssetUrl(request) in this.assets)) { - throw new Error(`No static resource at ${request.url}`); + throw new NotImplementedHttpError(`No static resource at ${request.url}`); } } diff --git a/test/integration/config/ldp-with-auth.json b/test/integration/config/ldp-with-auth.json index 2d2457bd1..f2eaf13cd 100644 --- a/test/integration/config/ldp-with-auth.json +++ b/test/integration/config/ldp-with-auth.json @@ -11,6 +11,7 @@ "files-scs:config/presets/ldp/response-writer.json", "files-scs:config/presets/ldp/request-parser.json", "files-scs:config/presets/representation-conversion.json", + "files-scs:config/presets/static.json", "files-scs:config/presets/storage/backend/storage-memory.json", "files-scs:config/presets/storage/backend/storage-filesystem.json", "files-scs:config/presets/storage/backend/storage-sparql-endpoint.json", diff --git a/test/integration/config/server-middleware.json b/test/integration/config/server-middleware.json index 11a9e357b..72a1ff5d0 100644 --- a/test/integration/config/server-middleware.json +++ b/test/integration/config/server-middleware.json @@ -3,6 +3,7 @@ "import": [ "files-scs:config/presets/http.json", "files-scs:config/presets/middleware.json", + "files-scs:config/presets/static.json", "files-scs:config/presets/cli-params.json" ], "@graph": [ diff --git a/test/integration/config/server-without-auth.json b/test/integration/config/server-without-auth.json index 1e215c9af..096fb874d 100644 --- a/test/integration/config/server-without-auth.json +++ b/test/integration/config/server-without-auth.json @@ -12,6 +12,7 @@ "files-scs:config/presets/middleware.json", "files-scs:config/presets/pod-management.json", "files-scs:config/presets/representation-conversion.json", + "files-scs:config/presets/static.json", "files-scs:config/presets/storage/backend/storage-memory.json", "files-scs:config/presets/storage-wrapper.json", "files-scs:config/presets/cli-params.json"