Browse Source

Small fixes

Improve matching of content type and charset in content type header.
master
TheoryOfNekomata 8 months ago
parent
commit
13e76c0c9b
2 changed files with 20 additions and 8 deletions
  1. +20
    -3
      src/backend/http/server.ts
  2. +0
    -5
      src/common/data-source.ts

+ 20
- 3
src/backend/http/server.ts View File

@@ -174,6 +174,14 @@ export const createServer = (backendState: BackendState, serverParams = {} as Cr
decorateRequestWithBackend(backendState),
];

const isTextMediaType = (mediaType: string) => (
mediaType.startsWith('text/')
|| [
'application/json',
'application/xml'
].includes(mediaType)
);

const processRequest = (middlewares: [string, Middleware, v.BaseSchema?][]) => async (req: RequestContext) => {
if (req.url === '/' || req.url === '') {
return handleGetRoot(req);
@@ -220,10 +228,19 @@ export const createServer = (backendState: BackendState, serverParams = {} as Cr

if (schema) {
const contentTypeHeader = req.headers['content-type'] ?? 'application/octet-stream';
const fragments = contentTypeHeader.split(';');
const fragments = contentTypeHeader.replace(/\s+/g, ' ').split(';');
const mediaType = fragments[0];
const charsetParam = fragments.map((s) => s.trim())
.find((f) => f.startsWith('charset=')) ?? (mediaType.startsWith('text/') ? 'charset=utf-8' : 'charset=binary');
const charsetParam = (
fragments
.map((s) => s.trim())
.find((f) => f.startsWith('charset='))

?? (
isTextMediaType(mediaType)
? 'charset=utf-8'
: 'charset=binary'
)
);
const [_charsetKey, charsetRaw] = charsetParam.split('=').map((s) => s.trim());
const charset = (
(


+ 0
- 5
src/common/data-source.ts View File

@@ -1,5 +0,0 @@
export interface BaseDataSource {}

export interface GenerationStrategy<D extends BaseDataSource = BaseDataSource> {
(dataSource: D, ...args: unknown[]): Promise<string | number | unknown>;
}

Loading…
Cancel
Save