mirror of
https://github.com/CommunitySolidServer/CommunitySolidServer.git
synced 2024-10-03 14:55:10 +00:00
feat: Split up server creation and request handling
This allows us to decouple the WebSocket listening from the HTTP configs, making these features completely orthogonal.
This commit is contained in:
@@ -4,7 +4,7 @@ import type { App } from '../../src/init/App';
|
||||
import { getPort } from '../util/Util';
|
||||
import { getDefaultVariables, getTestConfigPath, instantiateFromConfig } from './Config';
|
||||
|
||||
const port = getPort('WebSocketsProtocol');
|
||||
const port = getPort('LegacyWebSocketsProtocol');
|
||||
const serverUrl = `http://localhost:${port}/`;
|
||||
const headers = { forwarded: 'host=example.pod;proto=https' };
|
||||
|
||||
@@ -14,7 +14,7 @@ describe('A server with the Solid WebSockets API behind a proxy', (): void => {
|
||||
beforeAll(async(): Promise<void> => {
|
||||
app = await instantiateFromConfig(
|
||||
'urn:solid-server:default:App',
|
||||
getTestConfigPath('server-without-auth.json'),
|
||||
getTestConfigPath('legacy-websockets.json'),
|
||||
getDefaultVariables(port, 'https://example.pod/'),
|
||||
) as App;
|
||||
|
||||
@@ -1,39 +1,36 @@
|
||||
import type { Server } from 'http';
|
||||
import request from 'supertest';
|
||||
import type { BaseHttpServerFactory } from '../../src/server/BaseHttpServerFactory';
|
||||
import type { HttpHandlerInput } from '../../src/server/HttpHandler';
|
||||
import { HttpHandler } from '../../src/server/HttpHandler';
|
||||
import type { App } from '../../src/init/App';
|
||||
import type { HttpServerFactory } from '../../src/server/HttpServerFactory';
|
||||
import { splitCommaSeparated } from '../../src/util/StringUtil';
|
||||
import { getPort } from '../util/Util';
|
||||
import { getTestConfigPath, instantiateFromConfig } from './Config';
|
||||
import { getDefaultVariables, getTestConfigPath, instantiateFromConfig } from './Config';
|
||||
|
||||
const port = getPort('Middleware');
|
||||
|
||||
class SimpleHttpHandler extends HttpHandler {
|
||||
public async handle(input: HttpHandlerInput): Promise<void> {
|
||||
input.response.writeHead(200, { location: '/' });
|
||||
input.response.end('Hello World');
|
||||
}
|
||||
}
|
||||
|
||||
describe('An http server with middleware', (): void => {
|
||||
let app: App;
|
||||
let server: Server;
|
||||
|
||||
beforeAll(async(): Promise<void> => {
|
||||
const factory = await instantiateFromConfig(
|
||||
'urn:solid-server:default:HttpServerFactory',
|
||||
getTestConfigPath('server-middleware.json'),
|
||||
{
|
||||
'urn:solid-server:default:LdpHandler': new SimpleHttpHandler(),
|
||||
'urn:solid-server:default:variable:baseUrl': 'https://example.pod/',
|
||||
'urn:solid-server:default:variable:showStackTrace': true,
|
||||
},
|
||||
) as BaseHttpServerFactory;
|
||||
server = factory.startServer(port);
|
||||
const instances = await instantiateFromConfig(
|
||||
'urn:solid-server:test:Instances',
|
||||
[
|
||||
getTestConfigPath('server-middleware.json'),
|
||||
],
|
||||
getDefaultVariables(port),
|
||||
) as { app: App; factory: HttpServerFactory };
|
||||
|
||||
({ app } = instances);
|
||||
|
||||
server = await instances.factory.createServer();
|
||||
server.listen(port);
|
||||
});
|
||||
|
||||
afterAll(async(): Promise<void> => {
|
||||
server.close();
|
||||
// Even though the server was started separately, there might still be finalizers that need to be stopped
|
||||
await app.stop();
|
||||
});
|
||||
|
||||
it('sets a Vary header containing Accept.', async(): Promise<void> => {
|
||||
@@ -75,7 +72,6 @@ describe('An http server with middleware', (): void => {
|
||||
expect(res.header).toEqual(expect.objectContaining({
|
||||
'access-control-allow-origin': '*',
|
||||
'access-control-allow-headers': 'content-type',
|
||||
'updates-via': 'wss://example.pod/',
|
||||
'x-powered-by': 'Community Solid Server',
|
||||
}));
|
||||
const { vary } = res.header;
|
||||
@@ -90,12 +86,12 @@ describe('An http server with middleware', (): void => {
|
||||
});
|
||||
|
||||
it('specifies CORS origin header if an origin was supplied.', async(): Promise<void> => {
|
||||
const res = await request(server).get('/').set('origin', 'test.com').expect(200);
|
||||
const res = await request(server).options('/').set('origin', 'test.com').expect(204);
|
||||
expect(res.header).toEqual(expect.objectContaining({ 'access-control-allow-origin': 'test.com' }));
|
||||
});
|
||||
|
||||
it('exposes the Accept-[Method] header via CORS.', async(): Promise<void> => {
|
||||
const res = await request(server).get('/').expect(200);
|
||||
const res = await request(server).options('/').expect(204);
|
||||
const exposed = res.header['access-control-expose-headers'];
|
||||
expect(splitCommaSeparated(exposed)).toContain('Accept-Patch');
|
||||
expect(splitCommaSeparated(exposed)).toContain('Accept-Post');
|
||||
@@ -103,45 +99,39 @@ describe('An http server with middleware', (): void => {
|
||||
});
|
||||
|
||||
it('exposes the Last-Modified and ETag headers via CORS.', async(): Promise<void> => {
|
||||
const res = await request(server).get('/').expect(200);
|
||||
const res = await request(server).options('/').expect(204);
|
||||
const exposed = res.header['access-control-expose-headers'];
|
||||
expect(splitCommaSeparated(exposed)).toContain('ETag');
|
||||
expect(splitCommaSeparated(exposed)).toContain('Last-Modified');
|
||||
});
|
||||
|
||||
it('exposes the Link header via CORS.', async(): Promise<void> => {
|
||||
const res = await request(server).get('/').expect(200);
|
||||
const res = await request(server).options('/').expect(204);
|
||||
const exposed = res.header['access-control-expose-headers'];
|
||||
expect(splitCommaSeparated(exposed)).toContain('Link');
|
||||
});
|
||||
|
||||
it('exposes the Location header via CORS.', async(): Promise<void> => {
|
||||
const res = await request(server).get('/').expect(200);
|
||||
const res = await request(server).options('/').expect(204);
|
||||
const exposed = res.header['access-control-expose-headers'];
|
||||
expect(splitCommaSeparated(exposed)).toContain('Location');
|
||||
});
|
||||
|
||||
it('exposes the WAC-Allow header via CORS.', async(): Promise<void> => {
|
||||
const res = await request(server).get('/').expect(200);
|
||||
const res = await request(server).options('/').expect(204);
|
||||
const exposed = res.header['access-control-expose-headers'];
|
||||
expect(splitCommaSeparated(exposed)).toContain('WAC-Allow');
|
||||
});
|
||||
|
||||
it('exposes the Updates-Via header via CORS.', async(): Promise<void> => {
|
||||
const res = await request(server).get('/').expect(200);
|
||||
const res = await request(server).options('/').expect(204);
|
||||
const exposed = res.header['access-control-expose-headers'];
|
||||
expect(splitCommaSeparated(exposed)).toContain('Updates-Via');
|
||||
});
|
||||
|
||||
it('exposes the Www-Authenticate header via CORS.', async(): Promise<void> => {
|
||||
const res = await request(server).get('/').expect(200);
|
||||
const res = await request(server).options('/').expect(204);
|
||||
const exposed = res.header['access-control-expose-headers'];
|
||||
expect(splitCommaSeparated(exposed)).toContain('Www-Authenticate');
|
||||
});
|
||||
|
||||
it('sends incoming requests to the handler.', async(): Promise<void> => {
|
||||
const response = request(server).get('/').set('Host', 'test.com');
|
||||
expect(response).toBeDefined();
|
||||
await response.expect(200).expect('Hello World');
|
||||
});
|
||||
});
|
||||
|
||||
@@ -6,8 +6,8 @@
|
||||
"css:config/app/setup/disabled.json",
|
||||
|
||||
"css:config/http/handler/simple.json",
|
||||
"css:config/http/middleware/no-websockets.json",
|
||||
"css:config/http/server-factory/no-websockets.json",
|
||||
"css:config/http/middleware/default.json",
|
||||
"css:config/http/server-factory/http.json",
|
||||
"css:config/http/static/default.json",
|
||||
"css:config/identity/access/public.json",
|
||||
|
||||
|
||||
@@ -5,19 +5,23 @@
|
||||
"css:config/app/init/initialize-root.json",
|
||||
"css:config/app/setup/disabled.json",
|
||||
"css:config/http/handler/simple.json",
|
||||
"css:config/http/middleware/no-websockets.json",
|
||||
"css:config/http/server-factory/no-websockets.json",
|
||||
"css:config/http/middleware/default.json",
|
||||
"css:config/http/notifications/disabled.json",
|
||||
"css:config/http/server-factory/http.json",
|
||||
"css:config/http/static/default.json",
|
||||
"css:config/identity/access/public.json",
|
||||
|
||||
"css:config/identity/handler/default.json",
|
||||
"css:config/identity/ownership/token.json",
|
||||
"css:config/identity/pod/static.json",
|
||||
"css:config/identity/registration/disabled.json",
|
||||
"css:config/ldp/authentication/debug-auth-header.json",
|
||||
"css:config/ldp/authorization/webacl.json",
|
||||
"css:config/ldp/handler/default.json",
|
||||
"css:config/ldp/metadata-parser/default.json",
|
||||
"css:config/ldp/metadata-writer/default.json",
|
||||
"css:config/ldp/modes/default.json",
|
||||
|
||||
"css:config/storage/key-value/memory.json",
|
||||
"css:config/storage/middleware/default.json",
|
||||
"css:config/util/auxiliary/acl.json",
|
||||
|
||||
37
test/integration/config/legacy-websockets.json
Normal file
37
test/integration/config/legacy-websockets.json
Normal file
@@ -0,0 +1,37 @@
|
||||
{
|
||||
"@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^5.0.0/components/context.jsonld",
|
||||
"import": [
|
||||
"css:config/app/main/default.json",
|
||||
"css:config/app/init/initialize-root.json",
|
||||
"css:config/app/setup/disabled.json",
|
||||
"css:config/http/handler/default.json",
|
||||
"css:config/http/middleware/default.json",
|
||||
"css:config/http/notifications/legacy-websockets.json",
|
||||
"css:config/http/server-factory/http.json",
|
||||
"css:config/http/static/default.json",
|
||||
"css:config/identity/access/public.json",
|
||||
"css:config/identity/email/default.json",
|
||||
"css:config/identity/handler/default.json",
|
||||
"css:config/identity/ownership/token.json",
|
||||
"css:config/identity/pod/static.json",
|
||||
"css:config/identity/registration/enabled.json",
|
||||
"css:config/ldp/authentication/dpop-bearer.json",
|
||||
"css:config/ldp/authorization/webacl.json",
|
||||
"css:config/ldp/handler/default.json",
|
||||
"css:config/ldp/metadata-parser/default.json",
|
||||
"css:config/ldp/metadata-writer/default.json",
|
||||
"css:config/ldp/modes/default.json",
|
||||
"css:config/storage/backend/memory.json",
|
||||
"css:config/storage/key-value/resource-store.json",
|
||||
"css:config/storage/middleware/default.json",
|
||||
"css:config/util/auxiliary/acl.json",
|
||||
"css:config/util/identifiers/suffix.json",
|
||||
"css:config/util/index/default.json",
|
||||
"css:config/util/logging/winston.json",
|
||||
"css:config/util/representation-conversion/default.json",
|
||||
"css:config/util/resource-locker/memory.json",
|
||||
"css:config/util/variables/default.json"
|
||||
],
|
||||
"@graph": [
|
||||
]
|
||||
}
|
||||
@@ -6,8 +6,8 @@
|
||||
"css:config/app/setup/disabled.json",
|
||||
|
||||
"css:config/http/handler/simple.json",
|
||||
"css:config/http/middleware/no-websockets.json",
|
||||
"css:config/http/server-factory/no-websockets.json",
|
||||
"css:config/http/middleware/default.json",
|
||||
"css:config/http/server-factory/http.json",
|
||||
"css:config/http/static/default.json",
|
||||
"css:config/identity/access/public.json",
|
||||
|
||||
|
||||
@@ -5,8 +5,9 @@
|
||||
"css:config/app/init/initialize-root.json",
|
||||
"css:config/app/setup/disabled.json",
|
||||
"css:config/http/handler/default.json",
|
||||
"css:config/http/middleware/websockets.json",
|
||||
"css:config/http/server-factory/websockets.json",
|
||||
"css:config/http/middleware/default.json",
|
||||
"css:config/http/notifications/legacy-websockets.json",
|
||||
"css:config/http/server-factory/http.json",
|
||||
"css:config/http/static/default.json",
|
||||
"css:config/identity/access/public.json",
|
||||
"css:config/identity/email/default.json",
|
||||
|
||||
@@ -5,8 +5,9 @@
|
||||
"css:config/app/init/initialize-root.json",
|
||||
"css:config/app/setup/disabled.json",
|
||||
"css:config/http/handler/default.json",
|
||||
"css:config/http/middleware/websockets.json",
|
||||
"css:config/http/server-factory/websockets.json",
|
||||
"css:config/http/middleware/default.json",
|
||||
"css:config/http/notifications/legacy-websockets.json",
|
||||
"css:config/http/server-factory/http.json",
|
||||
"css:config/http/static/default.json",
|
||||
"css:config/identity/access/public.json",
|
||||
"css:config/identity/email/default.json",
|
||||
|
||||
@@ -5,8 +5,9 @@
|
||||
"css:config/app/init/default.json",
|
||||
"css:config/app/setup/disabled.json",
|
||||
"css:config/http/handler/default.json",
|
||||
"css:config/http/middleware/websockets.json",
|
||||
"css:config/http/server-factory/websockets.json",
|
||||
"css:config/http/middleware/default.json",
|
||||
"css:config/http/notifications/legacy-websockets.json",
|
||||
"css:config/http/server-factory/http.json",
|
||||
"css:config/http/static/default.json",
|
||||
"css:config/identity/access/restricted.json",
|
||||
"css:config/identity/email/default.json",
|
||||
|
||||
@@ -5,8 +5,9 @@
|
||||
"css:config/app/init/initialize-root.json",
|
||||
"css:config/app/setup/disabled.json",
|
||||
"css:config/http/handler/default.json",
|
||||
"css:config/http/middleware/no-websockets.json",
|
||||
"css:config/http/server-factory/no-websockets.json",
|
||||
"css:config/http/middleware/default.json",
|
||||
"css:config/http/notifications/disabled.json",
|
||||
"css:config/http/server-factory/http.json",
|
||||
"css:config/http/static/default.json",
|
||||
"css:config/identity/access/public.json",
|
||||
"css:config/identity/email/default.json",
|
||||
|
||||
@@ -5,10 +5,12 @@
|
||||
"css:config/app/init/initialize-root.json",
|
||||
"css:config/app/setup/disabled.json",
|
||||
"css:config/http/handler/default.json",
|
||||
"css:config/http/middleware/websockets.json",
|
||||
"css:config/http/server-factory/websockets.json",
|
||||
"css:config/http/middleware/default.json",
|
||||
"css:config/http/notifications/legacy-websockets.json",
|
||||
"css:config/http/server-factory/http.json",
|
||||
"css:config/http/static/default.json",
|
||||
"css:config/identity/access/public.json",
|
||||
|
||||
"css:config/identity/handler/default.json",
|
||||
"css:config/identity/ownership/token.json",
|
||||
"css:config/identity/pod/static.json",
|
||||
|
||||
@@ -5,10 +5,12 @@
|
||||
"css:config/app/init/initialize-root.json",
|
||||
"css:config/app/setup/disabled.json",
|
||||
"css:config/http/handler/default.json",
|
||||
"css:config/http/middleware/websockets.json",
|
||||
"css:config/http/server-factory/websockets.json",
|
||||
"css:config/http/middleware/default.json",
|
||||
"css:config/http/notifications/legacy-websockets.json",
|
||||
"css:config/http/server-factory/http.json",
|
||||
"css:config/http/static/default.json",
|
||||
"css:config/identity/access/public.json",
|
||||
|
||||
"css:config/identity/handler/default.json",
|
||||
"css:config/identity/ownership/token.json",
|
||||
"css:config/identity/pod/static.json",
|
||||
|
||||
@@ -1,16 +1,51 @@
|
||||
{
|
||||
"@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^5.0.0/components/context.jsonld",
|
||||
"import": [
|
||||
"css:config/app/main/default.json",
|
||||
"css:config/app/init/initialize-root.json",
|
||||
"css:config/app/setup/disabled.json",
|
||||
"css:config/http/handler/simple.json",
|
||||
"css:config/http/middleware/websockets.json",
|
||||
"css:config/http/server-factory/websockets.json",
|
||||
"css:config/http/middleware/default.json",
|
||||
"css:config/http/notifications/legacy-websockets.json",
|
||||
"css:config/http/server-factory/http.json",
|
||||
"css:config/http/static/default.json",
|
||||
"css:config/identity/access/public.json",
|
||||
"css:config/identity/email/default.json",
|
||||
"css:config/identity/handler/default.json",
|
||||
"css:config/identity/ownership/token.json",
|
||||
"css:config/identity/pod/static.json",
|
||||
"css:config/identity/registration/enabled.json",
|
||||
"css:config/ldp/authentication/dpop-bearer.json",
|
||||
"css:config/ldp/authorization/webacl.json",
|
||||
"css:config/ldp/handler/default.json",
|
||||
"css:config/ldp/metadata-parser/default.json",
|
||||
"css:config/ldp/metadata-writer/default.json",
|
||||
"css:config/ldp/modes/default.json",
|
||||
"css:config/storage/backend/memory.json",
|
||||
"css:config/storage/key-value/resource-store.json",
|
||||
"css:config/storage/middleware/default.json",
|
||||
"css:config/util/auxiliary/acl.json",
|
||||
"css:config/util/identifiers/suffix.json",
|
||||
"css:config/util/index/default.json",
|
||||
"css:config/util/logging/winston.json",
|
||||
"css:config/util/representation-conversion/default.json",
|
||||
"css:config/util/resource-locker/memory.json",
|
||||
"css:config/util/variables/default.json"
|
||||
],
|
||||
"@graph": [
|
||||
{
|
||||
"@id": "urn:solid-server:default:LdpHandler",
|
||||
"@type": "Variable"
|
||||
"@id": "urn:solid-server:test:Instances",
|
||||
"@type": "RecordObject",
|
||||
"record": [
|
||||
{
|
||||
"RecordObject:_record_key": "app",
|
||||
"RecordObject:_record_value": { "@id": "urn:solid-server:default:App" }
|
||||
},
|
||||
{
|
||||
"RecordObject:_record_key": "factory",
|
||||
"RecordObject:_record_value": { "@id": "urn:solid-server:default:ServerFactory" }
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -5,12 +5,16 @@
|
||||
"css:config/app/init/initialize-root.json",
|
||||
"css:config/app/setup/disabled.json",
|
||||
"css:config/http/handler/simple.json",
|
||||
"css:config/http/middleware/no-websockets.json",
|
||||
"css:config/http/server-factory/no-websockets.json",
|
||||
"css:config/http/middleware/default.json",
|
||||
"css:config/http/notifications/disabled.json",
|
||||
"css:config/http/server-factory/http.json",
|
||||
"css:config/http/static/default.json",
|
||||
"css:config/identity/handler/account-store/default.json",
|
||||
"css:config/identity/ownership/unsafe-no-check.json",
|
||||
|
||||
|
||||
"css:config/identity/pod/static.json",
|
||||
|
||||
|
||||
|
||||
"css:config/ldp/authentication/debug-auth-header.json",
|
||||
"css:config/ldp/authorization/allow-all.json",
|
||||
"css:config/ldp/handler/default.json",
|
||||
@@ -26,7 +30,10 @@
|
||||
"css:config/util/logging/winston.json",
|
||||
"css:config/util/representation-conversion/default.json",
|
||||
"css:config/util/resource-locker/redis.json",
|
||||
"css:config/util/variables/default.json"
|
||||
"css:config/util/variables/default.json",
|
||||
|
||||
"css:config/identity/handler/account-store/default.json",
|
||||
"css:config/identity/ownership/unsafe-no-check.json"
|
||||
],
|
||||
"@graph": [
|
||||
{
|
||||
|
||||
@@ -5,8 +5,9 @@
|
||||
"css:config/app/init/initialize-root.json",
|
||||
"css:config/app/setup/disabled.json",
|
||||
"css:config/http/handler/default.json",
|
||||
"css:config/http/middleware/no-websockets.json",
|
||||
"css:config/http/server-factory/no-websockets.json",
|
||||
"css:config/http/middleware/default.json",
|
||||
"css:config/http/notifications/disabled.json",
|
||||
"css:config/http/server-factory/http.json",
|
||||
"css:config/http/static/default.json",
|
||||
"css:config/identity/access/public.json",
|
||||
"css:config/identity/email/default.json",
|
||||
@@ -20,6 +21,7 @@
|
||||
"css:config/ldp/metadata-parser/default.json",
|
||||
"css:config/ldp/metadata-writer/default.json",
|
||||
"css:config/ldp/modes/default.json",
|
||||
|
||||
"css:config/storage/key-value/memory.json",
|
||||
"css:config/storage/middleware/default.json",
|
||||
"css:config/util/auxiliary/acl.json",
|
||||
|
||||
@@ -5,12 +5,16 @@
|
||||
"css:config/app/init/initialize-root.json",
|
||||
"css:config/app/setup/disabled.json",
|
||||
"css:config/http/handler/simple.json",
|
||||
"css:config/http/middleware/websockets.json",
|
||||
"css:config/http/server-factory/websockets.json",
|
||||
"css:config/http/middleware/default.json",
|
||||
"css:config/http/notifications/legacy-websockets.json",
|
||||
"css:config/http/server-factory/http.json",
|
||||
"css:config/http/static/default.json",
|
||||
"css:config/identity/handler/account-store/default.json",
|
||||
|
||||
|
||||
|
||||
"css:config/identity/ownership/unsafe-no-check.json",
|
||||
"css:config/identity/pod/static.json",
|
||||
"css:config/identity/registration/disabled.json",
|
||||
"css:config/ldp/authentication/dpop-bearer.json",
|
||||
"css:config/ldp/authorization/allow-all.json",
|
||||
"css:config/ldp/handler/default.json",
|
||||
@@ -26,7 +30,9 @@
|
||||
"css:config/util/logging/winston.json",
|
||||
"css:config/util/representation-conversion/default.json",
|
||||
"css:config/util/resource-locker/memory.json",
|
||||
"css:config/util/variables/default.json"
|
||||
"css:config/util/variables/default.json",
|
||||
|
||||
"css:config/identity/handler/account-store/default.json"
|
||||
],
|
||||
"@graph": [
|
||||
]
|
||||
|
||||
@@ -5,8 +5,9 @@
|
||||
"css:config/app/init/default.json",
|
||||
"css:config/app/setup/required.json",
|
||||
"css:config/http/handler/default.json",
|
||||
"css:config/http/middleware/websockets.json",
|
||||
"css:config/http/server-factory/websockets.json",
|
||||
"css:config/http/middleware/default.json",
|
||||
"css:config/http/notifications/legacy-websockets.json",
|
||||
"css:config/http/server-factory/http.json",
|
||||
"css:config/http/static/default.json",
|
||||
"css:config/identity/access/public.json",
|
||||
"css:config/identity/email/default.json",
|
||||
|
||||
Reference in New Issue
Block a user