feat: Support LDN inbox headers

* chore: add inbox mapping to metadatawriter config

* fix: correct inbox link rel

* feat: make LinkTypeParser reuseable to fit all link headers

* feat: minor code optimization

* feat: cleaned up metadata parser config

* feat: further cleanup of metadata parser config

* feat: adapted LinkMetadataParser to take a list to be in line with LinkRelMetadataWriter implementation

* feat: minor changes to be in line with other classes and code improvements

Co-authored-by: Wouter Termont <woutermont@gmail.com>
This commit is contained in:
Arthur Joppart
2021-08-25 12:48:13 +02:00
committed by GitHub
parent ff200e22a9
commit 759112bc04
8 changed files with 72 additions and 13 deletions

View File

@@ -97,7 +97,7 @@ export * from './ldp/http/conditions/ConditionsParser';
export * from './ldp/http/metadata/ConstantMetadataWriter';
export * from './ldp/http/metadata/ContentTypeParser';
export * from './ldp/http/metadata/LinkRelMetadataWriter';
export * from './ldp/http/metadata/LinkTypeParser';
export * from './ldp/http/metadata/LinkRelParser';
export * from './ldp/http/metadata/MappedMetadataWriter';
export * from './ldp/http/metadata/MetadataParser';
export * from './ldp/http/metadata/MetadataWriter';

View File

@@ -1,17 +1,27 @@
import type { NamedNode } from '@rdfjs/types';
import { DataFactory } from 'n3';
import { getLoggerFor } from '../../../logging/LogUtil';
import type { HttpRequest } from '../../../server/HttpRequest';
import { parseParameters, splitAndClean, transformQuotedStrings } from '../../../util/HeaderUtil';
import { RDF } from '../../../util/Vocabularies';
import type { RepresentationMetadata } from '../../representation/RepresentationMetadata';
import { MetadataParser } from './MetadataParser';
import namedNode = DataFactory.namedNode;
/**
* Parses Link headers with "rel=type" parameters and adds them as RDF.type metadata.
* Parses Link headers with a specific `rel` value and adds them as metadata with the given predicate.
*/
export class LinkTypeParser extends MetadataParser {
export class LinkRelParser extends MetadataParser {
protected readonly logger = getLoggerFor(this);
private readonly linkRelMap: Record<string, NamedNode>;
public constructor(linkRelMap: Record<string, string>) {
super();
this.linkRelMap = Object.fromEntries(
Object.entries(linkRelMap).map(([ header, uri ]): [string, NamedNode] => [ header, namedNode(uri) ]),
);
}
public async handle(input: { request: HttpRequest; metadata: RepresentationMetadata }): Promise<void> {
const link = input.request.headers.link ?? [];
const entries: string[] = Array.isArray(link) ? link : [ link ];
@@ -29,8 +39,8 @@ export class LinkTypeParser extends MetadataParser {
continue;
}
for (const { name, value } of parseParameters(parameters, replacements)) {
if (name === 'rel' && value === 'type') {
metadata.add(RDF.type, DataFactory.namedNode(link.slice(1, -1)));
if (name === 'rel' && this.linkRelMap[value]) {
metadata.add(this.linkRelMap[value], namedNode(link.slice(1, -1)));
}
}
}