diff --git a/src/SwaggerProvider.DesignTime/v3/OperationCompiler.fs b/src/SwaggerProvider.DesignTime/v3/OperationCompiler.fs index 4fc643a..43175bc 100644 --- a/src/SwaggerProvider.DesignTime/v3/OperationCompiler.fs +++ b/src/SwaggerProvider.DesignTime/v3/OperationCompiler.fs @@ -358,7 +358,7 @@ type OperationCompiler(schema: OpenApiDocument, defCompiler: DefinitionCompiler, <@ let stream: obj = %%streamObj let msg = %httpRequestMessage - msg.Content <- RuntimeHelpers.toStreamContent(stream) + msg.Content <- RuntimeHelpers.toStreamContent(stream, payloadMime) msg @> | Some(MultipartFormData, formData) -> diff --git a/src/SwaggerProvider.Runtime/RuntimeHelpers.fs b/src/SwaggerProvider.Runtime/RuntimeHelpers.fs index 10bb2ee..05c2396 100644 --- a/src/SwaggerProvider.Runtime/RuntimeHelpers.fs +++ b/src/SwaggerProvider.Runtime/RuntimeHelpers.fs @@ -2,6 +2,7 @@ namespace Swagger.Internal open System open System.Net.Http +open System.Net.Http.Headers open System.Text.Json.Serialization open System.Threading.Tasks @@ -133,9 +134,15 @@ module RuntimeHelpers = let toTextContent(valueStr: string) = new StringContent(valueStr, Text.Encoding.UTF8, "text/plain") - let toStreamContent(boxedStream: obj) = + let toStreamContent(boxedStream: obj, contentType: string) = match boxedStream with - | :? IO.Stream as stream -> new StreamContent(stream) + | :? IO.Stream as stream -> + let content = new StreamContent(stream) + + if (not <| String.IsNullOrEmpty(contentType)) then + content.Headers.ContentType <- MediaTypeHeaderValue(contentType) + + content | _ -> failwith $"Unexpected parameter type {boxedStream.GetType().Name} instead of IO.Stream" let getPropertyValues(object: obj) = diff --git a/tests/Swashbuckle.WebApi.Server/Controllers/FileController.fs b/tests/Swashbuckle.WebApi.Server/Controllers/FileController.fs index 59a5f12..d65afb7 100644 --- a/tests/Swashbuckle.WebApi.Server/Controllers/FileController.fs +++ b/tests/Swashbuckle.WebApi.Server/Controllers/FileController.fs @@ -52,9 +52,13 @@ type ReturnFileController() = [] member this.GetFileLength() = task { - use reader = new StreamReader(this.Request.Body) - let! content = reader.ReadToEndAsync() - return content.Length + + if this.Request.ContentType <> "application/octet-stream" then + return ActionResult(UnsupportedMediaTypeResult()) + else + use reader = new StreamReader(this.Request.Body) + let! content = reader.ReadToEndAsync() + return ActionResult(this.Ok(content.Length)) } [)>]