Skip to content

Commit be6b98f

Browse files
committed
Support application/json mediaType for file upload endpoints
1 parent 16ca6bb commit be6b98f

7 files changed

Lines changed: 21 additions & 18 deletions

File tree

src/Dibix.Sdk.CodeGeneration/Lookup/ActionTargetDefinitionResolver.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,7 @@ private static void CollectAdditionalParameters(ActionRequestBody requestBody, A
229229
if (requestBody == null)
230230
return;
231231

232-
if (!requestBody.IsStream(out SourceLocation isStreamLocation))
232+
if (!requestBody.IsFile(out SourceLocation isStreamLocation))
233233
return;
234234

235235
if (requestBody.MediaType == HttpMediaType.Binary && actionTargetDefinition.Parameters.All(x => x.ApiParameterName != SpecialHttpParameterName.MediaType))

src/Dibix.Sdk.CodeGeneration/Model/SchemaExtensions.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ bool MatchesOutputFilter(SchemaDefinition schema)
2929
return schemas;
3030
}
3131

32-
public static bool IsStream(this ActionRequestBody requestBody, out SourceLocation location)
32+
public static bool IsFile(this ActionRequestBody requestBody, out SourceLocation location)
3333
{
3434
if (requestBody.Contract != null && requestBody.Contract.IsStream(out location))
3535
{

src/Dibix.Sdk.CodeGeneration/Output/ApiClientImplementationWriter.cs

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,7 @@ bool CollectParameter(ApiParameter parameter)
237237
writer.Write($"requestMessage.{nameof(HttpRequestMessage.Content)} = new ");
238238

239239
ActionRequestBody requestBody = action.RequestBody;
240-
if (requestBody.IsStream(out _))
240+
if (requestBody.IsFile(out _))
241241
{
242242
writer.WriteRaw($"{nameof(StreamContent)}(body");
243243
}
@@ -249,17 +249,15 @@ bool CollectParameter(ApiParameter parameter)
249249

250250
writer.WriteLineRaw(");");
251251

252-
if (requestBody.IsStream(out _) && requestBody.MediaType != HttpMediaType.Binary)
253-
{
254-
WriteContentType(context, writer, $"\"{requestBody.MediaType}\"");
255-
}
252+
bool wroteContentType = false;
256253

257254
foreach (ApiParameter parameter in parameters.Where(x => x.ParameterLocation == ActionParameterLocation.Body))
258255
{
259256
switch (parameter.ParameterName)
260257
{
261258
case SpecialHttpParameterName.MediaType:
262-
WriteContentType(context, writer, $"{parameter.ParameterName} ?? \"{HttpMediaType.Binary}\"");
259+
WriteContentType(context, writer, $"{parameter.ParameterName} ?? \"{requestBody.MediaType}\"");
260+
wroteContentType = true;
263261
break;
264262

265263
case SpecialHttpParameterName.FileName:
@@ -268,6 +266,11 @@ bool CollectParameter(ApiParameter parameter)
268266
break;
269267
}
270268
}
269+
270+
if (!wroteContentType && requestBody.IsFile(out _))
271+
{
272+
WriteContentType(context, writer, $"\"{requestBody.MediaType}\"");
273+
}
271274
}
272275

273276
writer.WriteLine($"{nameof(HttpResponseMessage)} responseMessage = await client.{nameof(HttpClient.SendAsync)}(requestMessage, cancellationToken).{nameof(Task.ConfigureAwait)}(false);");

src/Dibix.Sdk.CodeGeneration/Registration/ControllerDefinitionProvider.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -285,14 +285,14 @@ private ActionRequestBody ReadBodyValue(SourceLocation bodyPropertyLocation, JOb
285285
SourceLocation? treatAsFile = value.Property("treatAsFile")?.GetSourceInfo();
286286
long? maxContentLength = (long?)value.Property("maxContentLength")?.Value;
287287

288-
if (mediaTypeValue != null && mediaType != HttpMediaType.Json)
289-
{
290-
SourceLocation mediaTypeLocation = mediaTypeValue.GetSourceInfo();
291-
return new ActionRequestBody(ActionDefinitionUtility.CreateStreamTypeReference(mediaTypeLocation), bodyPropertyLocation, mediaType, maxContentLength);
292-
}
293-
294288
if (contractName == null)
295289
{
290+
if (mediaTypeValue != null)
291+
{
292+
SourceLocation mediaTypeLocation = mediaTypeValue.GetSourceInfo();
293+
return new ActionRequestBody(ActionDefinitionUtility.CreateStreamTypeReference(mediaTypeLocation), bodyPropertyLocation, mediaType, maxContentLength);
294+
}
295+
296296
SourceLocation valueLocation = value.GetSourceInfo();
297297
Logger.LogError("Body is missing 'contract' property", valueLocation.Source, valueLocation.Line, valueLocation.Column);
298298
return null;

tests/Dibix.Sdk.Tests.Database/Endpoints/GenericEndpoint.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@
133133
"method": "PUT",
134134
"target": "File.FileUpload",
135135
"body": {
136-
"mediaType": "application/octet-stream",
136+
"mediaType": "application/json",
137137
"maxContentLength": 104857600 // 100 MB
138138
},
139139
"params": {

tests/Dibix.Sdk.Tests/Resources/CodeGeneration/Client.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -350,7 +350,7 @@ public async Task<HttpResponseMessage> FileUploadAsync(System.IO.Stream body, st
350350
HttpRequestMessage requestMessage = new HttpRequestMessage(new HttpMethod("PUT"), "Tests/GenericEndpoint");
351351
requestMessage.Headers.Add("Authorization", $"Bearer {_httpAuthorizationProvider.GetValue("DibixBearer")}");
352352
requestMessage.Content = new StreamContent(body);
353-
requestMessage.Content.Headers.ContentType = new MediaTypeHeaderValue(mediaType ?? "application/octet-stream");
353+
requestMessage.Content.Headers.ContentType = new MediaTypeHeaderValue(mediaType ?? "application/json");
354354
requestMessage.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = fileName };
355355
HttpResponseMessage responseMessage = await client.SendAsync(requestMessage, cancellationToken).ConfigureAwait(false);
356356
return responseMessage;
@@ -420,8 +420,8 @@ public async Task<HttpResponseMessage> UploadJsonAsync(System.IO.Stream body, st
420420
HttpRequestMessage requestMessage = new HttpRequestMessage(new HttpMethod("POST"), "Tests/GenericEndpoint/UploadJson");
421421
requestMessage.Headers.Add("Authorization", $"Bearer {_httpAuthorizationProvider.GetValue("DibixBearer")}");
422422
requestMessage.Content = new StreamContent(body);
423-
requestMessage.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
424423
requestMessage.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = fileName };
424+
requestMessage.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
425425
HttpResponseMessage responseMessage = await client.SendAsync(requestMessage, cancellationToken).ConfigureAwait(false);
426426
return responseMessage;
427427
}

tests/Dibix.Sdk.Tests/Resources/CodeGeneration/Endpoints_OpenApi.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ paths:
3030
operationId: FileUpload
3131
requestBody:
3232
content:
33-
application/octet-stream:
33+
application/json:
3434
schema:
3535
type: string
3636
format: binary

0 commit comments

Comments
 (0)