fix: return contenttype header value string with parameters

This commit is contained in:
Thomas Dupont
2022-07-05 13:06:18 +02:00
committed by Joachim Van Herwegen
parent e0954cf2a7
commit 311f8756ec
12 changed files with 122 additions and 30 deletions

View File

@@ -4,7 +4,6 @@ import { MetadataParser } from './MetadataParser';
/**
* Parser for the `content-type` header.
* Currently only stores the media type and ignores other parameters such as charset.
*/
export class ContentTypeParser extends MetadataParser {
public async handle(input: { request: HttpRequest; metadata: RepresentationMetadata }): Promise<void> {

View File

@@ -0,0 +1,15 @@
import type { HttpResponse } from '../../../server/HttpResponse';
import type { RepresentationMetadata } from '../../representation/RepresentationMetadata';
import { MetadataWriter } from './MetadataWriter';
/**
* Adds the `Content-Type` header containing value and parameters (if available).
*/
export class ContentTypeMetadataWriter extends MetadataWriter {
public async handle(input: { response: HttpResponse; metadata: RepresentationMetadata }): Promise<void> {
const { contentTypeObject } = input.metadata;
if (contentTypeObject) {
input.response.setHeader('Content-Type', contentTypeObject.toHeaderValueString());
}
}
}

View File

@@ -2,8 +2,7 @@ import { DataFactory, Store } from 'n3';
import type { BlankNode, DefaultGraph, Literal, NamedNode, Quad, Term } from 'rdf-js';
import { getLoggerFor } from '../../logging/LogUtil';
import { InternalServerError } from '../../util/errors/InternalServerError';
import type { ContentType } from '../../util/HeaderUtil';
import { parseContentType } from '../../util/HeaderUtil';
import { ContentType, parseContentType } from '../../util/HeaderUtil';
import { toNamedTerm, toObjectTerm, isTerm, toLiteral } from '../../util/TermUtil';
import { CONTENT_TYPE_TERM, CONTENT_LENGTH_TERM, XSD, SOLID_META, RDFS } from '../../util/Vocabularies';
import type { ResourceIdentifier } from './ResourceIdentifier';
@@ -369,18 +368,16 @@ export class RepresentationMetadata {
return;
}
const params = this.getAll(SOLID_META.terms.contentTypeParameter);
return {
value,
parameters: Object.fromEntries(params.map((param): [string, string] => {
const labels = this.store.getObjects(param, RDFS.terms.label, null);
const values = this.store.getObjects(param, SOLID_META.terms.value, null);
if (labels.length !== 1 || values.length !== 1) {
this.logger.error(`Detected invalid content-type metadata for ${this.id.value}`);
return [ 'invalid', '' ];
}
return [ labels[0].value, values[0].value ];
})),
};
const parameters = Object.fromEntries(params.map((param): [string, string] => {
const labels = this.store.getObjects(param, RDFS.terms.label, null);
const values = this.store.getObjects(param, SOLID_META.terms.value, null);
if (labels.length !== 1 || values.length !== 1) {
this.logger.error(`Detected invalid content-type metadata for ${this.id.value}`);
return [ 'invalid', '' ];
}
return [ labels[0].value, values[0].value ];
}));
return new ContentType(value, parameters);
}
private removeContentType(): void {