@@ -36,38 +36,60 @@ public RequestContent(RestClient client, RestRequest request) {
3636 _parameters = new RequestParameters ( _request . Parameters . Union ( _client . DefaultParameters ) ) ;
3737 }
3838
39- public HttpContent BuildContent ( ) {
40- AddFiles ( ) ;
39+ public HttpContent BuildContent ( )
40+ {
4141 var postParameters = _parameters . GetContentParameters ( _request . Method ) . ToArray ( ) ;
42- AddBody ( postParameters . Length > 0 ) ;
43- AddPostParameters ( postParameters ) ;
44- AddHeaders ( ) ;
45-
46- return Content ! ;
47- }
48-
49- void AddFiles ( ) {
50- if ( ! _request . HasFiles ( ) && ! _request . AlwaysMultipartFormData ) return ;
51-
52- var mpContent = CreateMultipartFormDataContent ( ) ;
42+ var postParametersExists = postParameters . Length > 0 ;
43+ var bodyParametersExists = _request . TryGetBodyParameter ( out var bodyParameter ) ;
44+ var filesExists = _request . Files . Any ( ) ;
5345
54- foreach ( var file in _request . Files ) {
55- var stream = file . GetFile ( ) ;
56- _streams . Add ( stream ) ;
57- var fileContent = new StreamContent ( stream ) ;
46+ if ( filesExists )
47+ AddFiles ( ) ;
5848
59- fileContent . Headers . ContentType = file . ContentType . AsMediaTypeHeaderValue ;
49+ if ( bodyParametersExists )
50+ AddBody ( postParametersExists , bodyParameter ! ) ;
6051
61- var dispositionHeader = file . Options . DisableFilenameEncoding
62- ? ContentDispositionHeaderValue . Parse ( $ "form-data; name=\" { file . Name } \" ; filename=\" { file . FileName } \" ")
63- : new ContentDispositionHeaderValue ( "form-data" ) { Name = $ "\" { file . Name } \" ", FileName = $ "\" { file . FileName } \" " } ;
64- if ( ! file . Options . DisableFileNameStar ) dispositionHeader . FileNameStar = file . FileName ;
65- fileContent . Headers . ContentDisposition = dispositionHeader ;
52+ if ( postParametersExists )
53+ AddPostParameters ( postParameters ) ;
6654
67- mpContent . Add ( fileContent ) ;
68- }
55+ AddHeaders ( ) ;
6956
70- Content = mpContent ;
57+ return Content ! ;
58+ }
59+
60+ void AddFiles ( )
61+ {
62+ // File uploading without multipart/form-data
63+ if ( _request . AlwaysSingleFileAsContent && _request . Files . Count == 1 )
64+ {
65+ var fileParameter = _request . Files . First ( ) ;
66+ Content = ToStreamContent ( fileParameter ) ;
67+ return ;
68+ }
69+
70+ var mpContent = new MultipartFormDataContent ( GetOrSetFormBoundary ( ) ) ;
71+
72+ foreach ( var fileParameter in _request . Files )
73+ mpContent . Add ( ToStreamContent ( fileParameter ) ) ;
74+
75+ Content = mpContent ;
76+ }
77+
78+ StreamContent ToStreamContent ( FileParameter fileParameter )
79+ {
80+ var stream = fileParameter . GetFile ( ) ;
81+ _streams . Add ( stream ) ;
82+ var streamContent = new StreamContent ( stream ) ;
83+
84+ streamContent . Headers . ContentType = fileParameter . ContentType . AsMediaTypeHeaderValue ;
85+
86+ var dispositionHeader = fileParameter . Options . DisableFilenameEncoding
87+ ? ContentDispositionHeaderValue . Parse ( $ "form-data; name=\" { fileParameter . Name } \" ; filename=\" { fileParameter . FileName } \" ")
88+ : new ContentDispositionHeaderValue ( "form-data" ) { Name = $ "\" { fileParameter . Name } \" ", FileName = $ "\" { fileParameter . FileName } \" " } ;
89+ if ( ! fileParameter . Options . DisableFileNameStar ) dispositionHeader . FileNameStar = fileParameter . FileName ;
90+ streamContent . Headers . ContentDisposition = dispositionHeader ;
91+
92+ return streamContent ;
7193 }
7294
7395 HttpContent Serialize ( BodyParameter body ) {
@@ -117,9 +139,8 @@ MultipartFormDataContent CreateMultipartFormDataContent() {
117139 return mpContent ;
118140 }
119141
120- void AddBody ( bool hasPostParameters ) {
121- if ( ! _request . TryGetBodyParameter ( out var bodyParameter ) ) return ;
122-
142+ void AddBody ( bool hasPostParameters , BodyParameter bodyParameter )
143+ {
123144 var bodyContent = Serialize ( bodyParameter ) ;
124145
125146 // we need to send the body
0 commit comments