Skip to content

Commit

Permalink
typescript-fetch: Add application/x-www-form-urlencoded content suppo…
Browse files Browse the repository at this point in the history
…rt (#3934)

* typescript-fetch: to be able to handle application/x-www-form-urlencoded content

* typescript-fetch: run typescript-fetch-petstore-all.sh

* typescript-fetch: add test's dist dir

* typescript-fetch: delete Specified Content-Type header
  • Loading branch information
tkrtmy authored and macjohnny committed Sep 23, 2019
1 parent ee2e439 commit 1a55020
Show file tree
Hide file tree
Showing 17 changed files with 392 additions and 70 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,7 @@ samples/client/petstore/python-tornado/.venv/
samples/client/petstore/typescript-angular2/npm/npm-debug.log
samples/client/petstore/typescript-node/npm/npm-debug.log
samples/client/petstore/typescript-angular/tsd-debug.log
samples/client/petstore/typescript-fetch/tests/**/dist/

# aspnetcore
samples/server/petstore/aspnetcore/.vs/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -150,29 +150,50 @@ export class {{classname}} extends runtime.BaseAPI {
{{/isOAuth}}
{{/authMethods}}
{{#hasFormParams}}
const formData = new FormData();
{{/hasFormParams}}
const consumes: runtime.Consume[] = [
{{#consumes}}
{ contentType: '{{{mediaType}}}' },
{{/consumes}}
];
// @ts-ignore: canConsumeForm may be unused
const canConsumeForm = runtime.canConsumeForm(consumes);

let formParams: { append(param: string, value: any): any };
let useForm = false;
{{#formParams}}
{{#isFile}}
// use FormData to transmit files using content-type "multipart/form-data"
useForm = canConsumeForm;
{{/isFile}}
{{/formParams}}
if (useForm) {
formParams = new FormData();
} else {
formParams = new URLSearchParams();
}

{{#formParams}}
{{#isListContainer}}
if (requestParameters.{{paramName}}) {
{{#isCollectionFormatMulti}}
requestParameters.{{paramName}}.forEach((element) => {
formData.append('{{baseName}}', element as any);
formParams.append('{{baseName}}', element as any);
})
{{/isCollectionFormatMulti}}
{{^isCollectionFormatMulti}}
formData.append('{{baseName}}', requestParameters.{{paramName}}.join(runtime.COLLECTION_FORMATS["{{collectionFormat}}"]));
formParams.append('{{baseName}}', requestParameters.{{paramName}}.join(runtime.COLLECTION_FORMATS["{{collectionFormat}}"]));
{{/isCollectionFormatMulti}}
}

{{/isListContainer}}
{{^isListContainer}}
if (requestParameters.{{paramName}} !== undefined) {
formData.append('{{baseName}}', requestParameters.{{paramName}} as any);
formParams.append('{{baseName}}', requestParameters.{{paramName}} as any);
}

{{/isListContainer}}
{{/formParams}}
{{/hasFormParams}}
const response = await this.request({
path: `{{{path}}}`{{#pathParams}}.replace(`{${"{{baseName}}"}}`, encodeURIComponent(String(requestParameters.{{paramName}}))){{/pathParams}},
method: '{{httpMethod}}',
Expand All @@ -194,7 +215,7 @@ export class {{classname}} extends runtime.BaseAPI {
{{/bodyParam}}
{{/hasBodyParam}}
{{#hasFormParams}}
body: formData,
body: formParams,
{{/hasFormParams}}
});

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -184,7 +184,7 @@ export type Json = any;
export type HTTPMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'OPTIONS';
export type HTTPHeaders = { [key: string]: string };
export type HTTPQuery = { [key: string]: string | number | null | boolean | Array<string | number | null | boolean> | HTTPQuery };
export type HTTPBody = Json | FormData;
export type HTTPBody = Json | FormData | URLSearchParams;
export type ModelPropertyNaming = 'camelCase' | 'snake_case' | 'PascalCase' | 'original';

export interface FetchParams {
Expand Down Expand Up @@ -231,6 +231,19 @@ export function mapValues(data: any, fn: (item: any) => any) {
);
}

export function canConsumeForm(consumes: Consume[]): boolean {
for (const consume of consumes) {
if ('multipart/form-data' === consume.contentType) {
return true;
}
}
return false;
}

export interface Consume {
contentType: string
}

export interface RequestContext {
fetch: FetchAPI;
url: string;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -335,21 +335,34 @@ export class PetApi extends runtime.BaseAPI {
}
}

const formData = new FormData();
const consumes: runtime.Consume[] = [
{ contentType: 'application/x-www-form-urlencoded' },
];
// @ts-ignore: canConsumeForm may be unused
const canConsumeForm = runtime.canConsumeForm(consumes);

let formParams: { append(param: string, value: any): any };
let useForm = false;
if (useForm) {
formParams = new FormData();
} else {
formParams = new URLSearchParams();
}

if (requestParameters.name !== undefined) {
formData.append('name', requestParameters.name as any);
formParams.append('name', requestParameters.name as any);
}

if (requestParameters.status !== undefined) {
formData.append('status', requestParameters.status as any);
formParams.append('status', requestParameters.status as any);
}

const response = await this.request({
path: `/pet/{petId}`.replace(`{${"petId"}}`, encodeURIComponent(String(requestParameters.petId))),
method: 'POST',
headers: headerParameters,
query: queryParameters,
body: formData,
body: formParams,
});

return new runtime.VoidApiResponse(response);
Expand Down Expand Up @@ -383,21 +396,36 @@ export class PetApi extends runtime.BaseAPI {
}
}

const formData = new FormData();
const consumes: runtime.Consume[] = [
{ contentType: 'multipart/form-data' },
];
// @ts-ignore: canConsumeForm may be unused
const canConsumeForm = runtime.canConsumeForm(consumes);

let formParams: { append(param: string, value: any): any };
let useForm = false;
// use FormData to transmit files using content-type "multipart/form-data"
useForm = canConsumeForm;
if (useForm) {
formParams = new FormData();
} else {
formParams = new URLSearchParams();
}

if (requestParameters.additionalMetadata !== undefined) {
formData.append('additionalMetadata', requestParameters.additionalMetadata as any);
formParams.append('additionalMetadata', requestParameters.additionalMetadata as any);
}

if (requestParameters.file !== undefined) {
formData.append('file', requestParameters.file as any);
formParams.append('file', requestParameters.file as any);
}

const response = await this.request({
path: `/pet/{petId}/uploadImage`.replace(`{${"petId"}}`, encodeURIComponent(String(requestParameters.petId))),
method: 'POST',
headers: headerParameters,
query: queryParameters,
body: formData,
body: formParams,
});

return new runtime.JSONApiResponse(response, (jsonValue) => ModelApiResponseFromJSON(jsonValue));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -195,7 +195,7 @@ export type Json = any;
export type HTTPMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'OPTIONS';
export type HTTPHeaders = { [key: string]: string };
export type HTTPQuery = { [key: string]: string | number | null | boolean | Array<string | number | null | boolean> | HTTPQuery };
export type HTTPBody = Json | FormData;
export type HTTPBody = Json | FormData | URLSearchParams;
export type ModelPropertyNaming = 'camelCase' | 'snake_case' | 'PascalCase' | 'original';

export interface FetchParams {
Expand Down Expand Up @@ -242,6 +242,19 @@ export function mapValues(data: any, fn: (item: any) => any) {
);
}

export function canConsumeForm(consumes: Consume[]): boolean {
for (const consume of consumes) {
if ('multipart/form-data' === consume.contentType) {
return true;
}
}
return false;
}

export interface Consume {
contentType: string
}

export interface RequestContext {
fetch: FetchAPI;
url: string;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -335,21 +335,34 @@ export class PetApi extends runtime.BaseAPI {
}
}

const formData = new FormData();
const consumes: runtime.Consume[] = [
{ contentType: 'application/x-www-form-urlencoded' },
];
// @ts-ignore: canConsumeForm may be unused
const canConsumeForm = runtime.canConsumeForm(consumes);

let formParams: { append(param: string, value: any): any };
let useForm = false;
if (useForm) {
formParams = new FormData();
} else {
formParams = new URLSearchParams();
}

if (requestParameters.name !== undefined) {
formData.append('name', requestParameters.name as any);
formParams.append('name', requestParameters.name as any);
}

if (requestParameters.status !== undefined) {
formData.append('status', requestParameters.status as any);
formParams.append('status', requestParameters.status as any);
}

const response = await this.request({
path: `/pet/{petId}`.replace(`{${"petId"}}`, encodeURIComponent(String(requestParameters.petId))),
method: 'POST',
headers: headerParameters,
query: queryParameters,
body: formData,
body: formParams,
});

return new runtime.VoidApiResponse(response);
Expand Down Expand Up @@ -383,21 +396,36 @@ export class PetApi extends runtime.BaseAPI {
}
}

const formData = new FormData();
const consumes: runtime.Consume[] = [
{ contentType: 'multipart/form-data' },
];
// @ts-ignore: canConsumeForm may be unused
const canConsumeForm = runtime.canConsumeForm(consumes);

let formParams: { append(param: string, value: any): any };
let useForm = false;
// use FormData to transmit files using content-type "multipart/form-data"
useForm = canConsumeForm;
if (useForm) {
formParams = new FormData();
} else {
formParams = new URLSearchParams();
}

if (requestParameters.additionalMetadata !== undefined) {
formData.append('additionalMetadata', requestParameters.additionalMetadata as any);
formParams.append('additionalMetadata', requestParameters.additionalMetadata as any);
}

if (requestParameters.file !== undefined) {
formData.append('file', requestParameters.file as any);
formParams.append('file', requestParameters.file as any);
}

const response = await this.request({
path: `/pet/{petId}/uploadImage`.replace(`{${"petId"}}`, encodeURIComponent(String(requestParameters.petId))),
method: 'POST',
headers: headerParameters,
query: queryParameters,
body: formData,
body: formParams,
});

return new runtime.JSONApiResponse(response, (jsonValue) => ModelApiResponseFromJSON(jsonValue));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -195,7 +195,7 @@ export type Json = any;
export type HTTPMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'OPTIONS';
export type HTTPHeaders = { [key: string]: string };
export type HTTPQuery = { [key: string]: string | number | null | boolean | Array<string | number | null | boolean> | HTTPQuery };
export type HTTPBody = Json | FormData;
export type HTTPBody = Json | FormData | URLSearchParams;
export type ModelPropertyNaming = 'camelCase' | 'snake_case' | 'PascalCase' | 'original';

export interface FetchParams {
Expand Down Expand Up @@ -242,6 +242,19 @@ export function mapValues(data: any, fn: (item: any) => any) {
);
}

export function canConsumeForm(consumes: Consume[]): boolean {
for (const consume of consumes) {
if ('multipart/form-data' === consume.contentType) {
return true;
}
}
return false;
}

export interface Consume {
contentType: string
}

export interface RequestContext {
fetch: FetchAPI;
url: string;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -335,21 +335,34 @@ export class PetApi extends runtime.BaseAPI {
}
}

const formData = new FormData();
const consumes: runtime.Consume[] = [
{ contentType: 'application/x-www-form-urlencoded' },
];
// @ts-ignore: canConsumeForm may be unused
const canConsumeForm = runtime.canConsumeForm(consumes);

let formParams: { append(param: string, value: any): any };
let useForm = false;
if (useForm) {
formParams = new FormData();
} else {
formParams = new URLSearchParams();
}

if (requestParameters.name !== undefined) {
formData.append('name', requestParameters.name as any);
formParams.append('name', requestParameters.name as any);
}

if (requestParameters.status !== undefined) {
formData.append('status', requestParameters.status as any);
formParams.append('status', requestParameters.status as any);
}

const response = await this.request({
path: `/pet/{petId}`.replace(`{${"petId"}}`, encodeURIComponent(String(requestParameters.petId))),
method: 'POST',
headers: headerParameters,
query: queryParameters,
body: formData,
body: formParams,
});

return new runtime.VoidApiResponse(response);
Expand Down Expand Up @@ -383,21 +396,36 @@ export class PetApi extends runtime.BaseAPI {
}
}

const formData = new FormData();
const consumes: runtime.Consume[] = [
{ contentType: 'multipart/form-data' },
];
// @ts-ignore: canConsumeForm may be unused
const canConsumeForm = runtime.canConsumeForm(consumes);

let formParams: { append(param: string, value: any): any };
let useForm = false;
// use FormData to transmit files using content-type "multipart/form-data"
useForm = canConsumeForm;
if (useForm) {
formParams = new FormData();
} else {
formParams = new URLSearchParams();
}

if (requestParameters.additionalMetadata !== undefined) {
formData.append('additionalMetadata', requestParameters.additionalMetadata as any);
formParams.append('additionalMetadata', requestParameters.additionalMetadata as any);
}

if (requestParameters.file !== undefined) {
formData.append('file', requestParameters.file as any);
formParams.append('file', requestParameters.file as any);
}

const response = await this.request({
path: `/pet/{petId}/uploadImage`.replace(`{${"petId"}}`, encodeURIComponent(String(requestParameters.petId))),
method: 'POST',
headers: headerParameters,
query: queryParameters,
body: formData,
body: formParams,
});

return new runtime.JSONApiResponse(response, (jsonValue) => ModelApiResponseFromJSON(jsonValue));
Expand Down
Loading

0 comments on commit 1a55020

Please sign in to comment.