Skip to content

Commit 22f4d28

Browse files
authored
Merge pull request ferdikoomen#644 from vanhoofmaarten/hotfix/respect-mediatype
Fix: Respect mediatype
2 parents b2bf206 + 968bef7 commit 22f4d28

File tree

14 files changed

+89
-30
lines changed

14 files changed

+89
-30
lines changed

src/client/interfaces/OperationParameter.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,5 @@ import type { Model } from './Model';
33
export interface OperationParameter extends Model {
44
in: 'path' | 'query' | 'header' | 'formData' | 'body' | 'cookie';
55
prop: string;
6+
mediaType: string | null;
67
}

src/openApi/v2/parser/getOperationParameter.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ export function getOperationParameter(openApi: OpenApi, parameter: OpenApiParame
4242
enum: [],
4343
enums: [],
4444
properties: [],
45+
mediaType: null,
4546
};
4647

4748
if (parameter.$ref) {

src/openApi/v3/parser/getMediaType.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import type { Dictionary } from '../../../utils/types';
2+
import type { OpenApi } from '../interfaces/OpenApi';
3+
import type { OpenApiMediaType } from '../interfaces/OpenApiMediaType';
4+
5+
export function getMediaType(openApi: OpenApi, content: Dictionary<OpenApiMediaType>): string | null {
6+
return (
7+
Object.keys(content).find(key => ['application/json-patch+json', 'application/json', 'text/json', 'text/plain', 'multipart/mixed', 'multipart/related', 'multipart/batch'].includes(key)) ||
8+
null
9+
);
10+
}

src/openApi/v3/parser/getOperationParameter.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ export function getOperationParameter(openApi: OpenApi, parameter: OpenApiParame
2727
enum: [],
2828
enums: [],
2929
properties: [],
30+
mediaType: null,
3031
};
3132

3233
if (parameter.$ref) {

src/openApi/v3/parser/getOperationRequestBody.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import type { OpenApi } from '../interfaces/OpenApi';
44
import type { OpenApiRequestBody } from '../interfaces/OpenApiRequestBody';
55
import { getComment } from './getComment';
66
import { getContent } from './getContent';
7+
import { getMediaType } from './getMediaType';
78
import { getModel } from './getModel';
89
import { getType } from './getType';
910

@@ -27,11 +28,14 @@ export function getOperationRequestBody(openApi: OpenApi, parameter: OpenApiRequ
2728
enum: [],
2829
enums: [],
2930
properties: [],
31+
mediaType: null,
3032
};
3133

3234
if (parameter.content) {
3335
const schema = getContent(openApi, parameter.content);
36+
const mediaType = getMediaType(openApi, parameter.content);
3437
if (schema) {
38+
requestBody.mediaType = mediaType;
3539
if (schema?.$ref) {
3640
const model = getType(schema.$ref);
3741
requestBody.export = 'reference';

src/templates/core/ApiRequestOptions.hbs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ export type ApiRequestOptions = {
88
readonly query?: Record<string, any>;
99
readonly formData?: Record<string, any>;
1010
readonly body?: any;
11+
readonly bodyMediaType?: string;
1112
readonly responseHeader?: string;
1213
readonly errors?: Record<number, string>;
1314
}

src/templates/core/fetch/getHeaders.hbs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,16 @@ async function getHeaders(options: ApiRequestOptions): Promise<Headers> {
2020
}
2121

2222
if (options.body) {
23-
if (isBlob(options.body)) {
24-
headers.append('Content-Type', options.body.type || 'application/octet-stream');
25-
} else if (isString(options.body)) {
26-
headers.append('Content-Type', 'text/plain');
23+
if (options.bodyMediaType) {
24+
headers.append('Content-Type', options.bodyMediaType);
2725
} else {
28-
headers.append('Content-Type', 'application/json');
26+
if (isBlob(options.body)) {
27+
headers.append('Content-Type', options.body.type || 'application/octet-stream');
28+
} else if (isString(options.body)) {
29+
headers.append('Content-Type', 'text/plain');
30+
} else {
31+
headers.append('Content-Type', 'application/json');
32+
}
2933
}
3034
}
3135
return headers;

src/templates/core/fetch/getRequestBody.hbs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@ function getRequestBody(options: ApiRequestOptions): BodyInit | undefined {
33
return getFormData(options.formData);
44
}
55
if (options.body) {
6-
if (isString(options.body) || isBlob(options.body)) {
6+
if (options.bodyMediaType?.includes('/json')) {
7+
return JSON.stringify(options.body)
8+
} else if (isString(options.body) || isBlob(options.body)) {
79
return options.body;
810
} else {
911
return JSON.stringify(options.body);

src/templates/core/node/getHeaders.hbs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,16 @@ async function getHeaders(options: ApiRequestOptions): Promise<Headers> {
2020
}
2121

2222
if (options.body) {
23-
if (isBinary(options.body)) {
24-
headers.append('Content-Type', 'application/octet-stream');
25-
} else if (isString(options.body)) {
26-
headers.append('Content-Type', 'text/plain');
23+
if (options.bodyMediaType) {
24+
headers.append('Content-Type', options.bodyMediaType);
2725
} else {
28-
headers.append('Content-Type', 'application/json');
26+
if (isBinary(options.body)) {
27+
headers.append('Content-Type', 'application/octet-stream');
28+
} else if (isString(options.body)) {
29+
headers.append('Content-Type', 'text/plain');
30+
} else {
31+
headers.append('Content-Type', 'application/json');
32+
}
2933
}
3034
}
3135
return headers;

src/templates/core/node/getRequestBody.hbs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@ function getRequestBody(options: ApiRequestOptions): BodyInit | undefined {
33
return getFormData(options.formData);
44
}
55
if (options.body) {
6-
if (isString(options.body) || isBinary(options.body)) {
6+
if (options.bodyMediaType?.includes('/json')) {
7+
return JSON.stringify(options.body)
8+
} else if (isString(options.body) || isBinary(options.body)) {
79
return options.body;
810
} else {
911
return JSON.stringify(options.body);

0 commit comments

Comments
 (0)