File tree Expand file tree Collapse file tree 19 files changed +767
-10
lines changed 
templates/base/http-clients 
axiosSingleHttpClient/__snapshots__ 
extractRequestBody/__snapshots__ 
extractResponseBody/__snapshots__ 
moduleNameFirstTag/__snapshots__ 
moduleNameIndex/__snapshots__ Expand file tree Collapse file tree 19 files changed +767
-10
lines changed Original file line number Diff line number Diff line change 1+ --- 
2+ " swagger-typescript-api "  : patch 
3+ --- 
4+ 
5+ Fix: PUT requests with application/x-www-form-urlencoded content type
6+ 
7+ This fixes an issue where PUT requests with ` application/x-www-form-urlencoded `  content type were incorrectly sent as ` multipart/form-data ` .
8+ A new ` createUrlEncoded `  method has been added to the ` HttpClient `  to handle this content type correctly.
Original file line number Diff line number Diff line change @@ -561,7 +561,17 @@ export class SchemaRoutes {
561561      } ) ; 
562562    } 
563563
564-     if  ( routeParams . formData . length )  { 
564+     if  ( 
565+       contentKind  ===  CONTENT_KIND . URL_ENCODED  && 
566+       routeParams . formData . length 
567+     )  { 
568+       schema  =  this . convertRouteParamsIntoObject ( routeParams . formData ) ; 
569+       content  =  this . schemaParserFabric . getInlineParseContent ( 
570+         schema , 
571+         typeName , 
572+         [ operationId ] , 
573+       ) ; 
574+     }  else  if  ( routeParams . formData . length )  { 
565575      contentKind  =  CONTENT_KIND . FORM_DATA ; 
566576      schema  =  this . convertRouteParamsIntoObject ( routeParams . formData ) ; 
567577      content  =  this . schemaParserFabric . getInlineParseContent ( 
Original file line number Diff line number Diff line change @@ -99,6 +99,22 @@ export class HttpClient<SecurityDataType = unknown> {
9999      }, new FormData());
100100    }
101101
102+     protected createUrlEncoded(input: Record<string ,  unknown >): URLSearchParams {
103+       if (input instanceof URLSearchParams) {
104+         return input;
105+       }
106+       return Object.keys(input || {}).reduce((searchParams, key) => {
107+         const property = input[key];
108+         const propertyContent: any[] = (property instanceof Array) ? property : [property]
109+ 
110+         for (const formItem of propertyContent) {
111+           searchParams.append(key, this.stringifyFormItem(formItem));
112+         }
113+ 
114+         return searchParams;
115+       }, new URLSearchParams());
116+     }
117+ 
102118    public request = async <T  = any,  _E  = any >({
103119        secure,
104120        path,
@@ -120,6 +136,10 @@ export class HttpClient<SecurityDataType = unknown> {
120136          body = this.createFormData(body as Record<string ,  unknown >);
121137        }
122138
139+         if (type === ContentType.UrlEncoded && body && body !== null && typeof body === "object") {
140+           body = this.createUrlEncoded(body as Record<string ,  unknown >);
141+         }
142+ 
123143        if (type === ContentType.Text && body && body !== null && typeof body !== "string") {
124144          body = JSON.stringify(body);
125145        }
Original file line number Diff line number Diff line change @@ -6376,7 +6376,7 @@ export class Api<
63766376        method: "POST",
63776377        body: data,
63786378        secure: true,
6379-         type: ContentType.FormData ,
6379+         type: ContentType.UrlEncoded ,
63806380        ...params,
63816381      }),
63826382
@@ -69452,7 +69452,7 @@ export class Api<
6945269452        method: "POST",
6945369453        body: data,
6945469454        secure: true,
69455-         type: ContentType.FormData ,
69455+         type: ContentType.UrlEncoded ,
6945669456        ...params,
6945769457      }),
6945869458
Original file line number Diff line number Diff line change @@ -3968,7 +3968,7 @@ export class Api<
39683968        method: "POST",
39693969        body: data,
39703970        secure: true,
3971-         type: ContentType.FormData ,
3971+         type: ContentType.UrlEncoded ,
39723972        ...params,
39733973      }),
39743974
@@ -43623,7 +43623,7 @@ export class Api<
4362343623        method: "POST",
4362443624        body: data,
4362543625        secure: true,
43626-         type: ContentType.FormData ,
43626+         type: ContentType.UrlEncoded ,
4362743627        ...params,
4362843628      }),
4362943629
Original file line number Diff line number Diff line change @@ -2037,6 +2037,23 @@ export class HttpClient<SecurityDataType = unknown> {
20372037    }, new FormData());
20382038  }
20392039
2040+   protected createUrlEncoded(input: Record<string, unknown>): URLSearchParams {
2041+     if (input instanceof URLSearchParams) {
2042+       return input;
2043+     }
2044+     return Object.keys(input || {}).reduce((searchParams, key) => {
2045+       const property = input[key];
2046+       const propertyContent: any[] =
2047+         property instanceof Array ? property : [property];
2048+ 
2049+       for (const formItem of propertyContent) {
2050+         searchParams.append(key, this.stringifyFormItem(formItem));
2051+       }
2052+ 
2053+       return searchParams;
2054+     }, new URLSearchParams());
2055+   }
2056+ 
20402057  public request = async <T = any, _E = any>({
20412058    secure,
20422059    path,
@@ -2063,6 +2080,15 @@ export class HttpClient<SecurityDataType = unknown> {
20632080      body = this.createFormData(body as Record<string, unknown>);
20642081    }
20652082
2083+     if (
2084+       type === ContentType.UrlEncoded &&
2085+       body &&
2086+       body !== null &&
2087+       typeof body === "object"
2088+     ) {
2089+       body = this.createUrlEncoded(body as Record<string, unknown>);
2090+     }
2091+ 
20662092    if (
20672093      type === ContentType.Text &&
20682094      body &&
Original file line number Diff line number Diff line change @@ -2037,6 +2037,23 @@ export class HttpClient<SecurityDataType = unknown> {
20372037    }, new FormData());
20382038  }
20392039
2040+   protected createUrlEncoded(input: Record<string, unknown>): URLSearchParams {
2041+     if (input instanceof URLSearchParams) {
2042+       return input;
2043+     }
2044+     return Object.keys(input || {}).reduce((searchParams, key) => {
2045+       const property = input[key];
2046+       const propertyContent: any[] =
2047+         property instanceof Array ? property : [property];
2048+ 
2049+       for (const formItem of propertyContent) {
2050+         searchParams.append(key, this.stringifyFormItem(formItem));
2051+       }
2052+ 
2053+       return searchParams;
2054+     }, new URLSearchParams());
2055+   }
2056+ 
20402057  public request = async <T = any, _E = any>({
20412058    secure,
20422059    path,
@@ -2063,6 +2080,15 @@ export class HttpClient<SecurityDataType = unknown> {
20632080      body = this.createFormData(body as Record<string, unknown>);
20642081    }
20652082
2083+     if (
2084+       type === ContentType.UrlEncoded &&
2085+       body &&
2086+       body !== null &&
2087+       typeof body === "object"
2088+     ) {
2089+       body = this.createUrlEncoded(body as Record<string, unknown>);
2090+     }
2091+ 
20662092    if (
20672093      type === ContentType.Text &&
20682094      body &&
Original file line number Diff line number Diff line change @@ -636,7 +636,7 @@ export class Api<
636636        method: "POST", 
637637        body: data, 
638638        secure: true, 
639-         type: ContentType.FormData , 
639+         type: ContentType.UrlEncoded , 
640640        ...params, 
641641      }), 
642642
Original file line number Diff line number Diff line change @@ -637,7 +637,7 @@ export class Api<
637637        method: "POST", 
638638        body: data, 
639639        secure: true, 
640-         type: ContentType.FormData , 
640+         type: ContentType.UrlEncoded , 
641641        ...params, 
642642      }), 
643643
Original file line number Diff line number Diff line change @@ -642,7 +642,7 @@ export class Api<
642642        method: "POST", 
643643        body: data, 
644644        secure: true, 
645-         type: ContentType.FormData , 
645+         type: ContentType.UrlEncoded , 
646646        ...params, 
647647      }), 
648648
    
 
   
 
     
   
   
          
     
  
    
     
 
    
      
     
 
     
    You can’t perform that action at this time.
  
 
    
  
     
    
      
        
     
 
       
      
     
   
 
    
    
  
 
  
 
     
    
0 commit comments