mirror of
https://github.com/CommunitySolidServer/CommunitySolidServer.git
synced 2024-10-03 14:55:10 +00:00
fix: return contenttype header value string with parameters
This commit is contained in:
committed by
Joachim Van Herwegen
parent
e0954cf2a7
commit
311f8756ec
@@ -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> {
|
||||
|
||||
15
src/http/output/metadata/ContentTypeMetadataWriter.ts
Normal file
15
src/http/output/metadata/ContentTypeMetadataWriter.ts
Normal 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());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user