Implement HttpResponseMessage return type (#40)

This commit is contained in:
Patrick Stevens
2023-12-29 18:44:23 +00:00
committed by GitHub
parent 9e9744d37b
commit 346d6e8321
5 changed files with 139 additions and 0 deletions

View File

@@ -10,6 +10,8 @@ open System
open System.Threading
open System.Threading.Tasks
open System.IO
open System.Net
open System.Net.Http
open RestEase
/// Module for constructing a REST client.
@@ -279,4 +281,84 @@ module PureGymApi =
return node
}
|> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct))
member _.GetResponseMessage (ct : CancellationToken option) =
async {
let! ct = Async.CancellationToken
let uri =
System.Uri (client.BaseAddress, System.Uri ("endpoint", System.UriKind.Relative))
let httpMessage =
new System.Net.Http.HttpRequestMessage (
Method = System.Net.Http.HttpMethod.Get,
RequestUri = uri
)
let! response = client.SendAsync (httpMessage, ct) |> Async.AwaitTask
let response = response.EnsureSuccessStatusCode ()
let node = response
return node
}
|> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct))
member _.GetResponseMessage' (ct : CancellationToken option) =
async {
let! ct = Async.CancellationToken
let uri =
System.Uri (client.BaseAddress, System.Uri ("endpoint", System.UriKind.Relative))
let httpMessage =
new System.Net.Http.HttpRequestMessage (
Method = System.Net.Http.HttpMethod.Get,
RequestUri = uri
)
let! response = client.SendAsync (httpMessage, ct) |> Async.AwaitTask
let response = response.EnsureSuccessStatusCode ()
let node = response
return node
}
|> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct))
member _.GetResponseMessage'' (ct : CancellationToken option) =
async {
let! ct = Async.CancellationToken
let uri =
System.Uri (client.BaseAddress, System.Uri ("endpoint", System.UriKind.Relative))
let httpMessage =
new System.Net.Http.HttpRequestMessage (
Method = System.Net.Http.HttpMethod.Get,
RequestUri = uri
)
let! response = client.SendAsync (httpMessage, ct) |> Async.AwaitTask
let response = response.EnsureSuccessStatusCode ()
let node = response
return node
}
|> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct))
member _.GetResponseMessage''' (ct : CancellationToken option) =
async {
let! ct = Async.CancellationToken
let uri =
System.Uri (client.BaseAddress, System.Uri ("endpoint", System.UriKind.Relative))
let httpMessage =
new System.Net.Http.HttpRequestMessage (
Method = System.Net.Http.HttpMethod.Get,
RequestUri = uri
)
let! response = client.SendAsync (httpMessage, ct) |> Async.AwaitTask
let response = response.EnsureSuccessStatusCode ()
let node = response
return node
}
|> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct))
}

View File

@@ -4,6 +4,8 @@ open System
open System.Threading
open System.Threading.Tasks
open System.IO
open System.Net
open System.Net.Http
open RestEase
[<WoofWare.Myriad.Plugins.HttpClient>]
@@ -39,3 +41,15 @@ type IPureGymApi =
[<Get "endpoint">]
abstract GetStream'' : ?ct : CancellationToken -> Task<Stream>
[<Get "endpoint">]
abstract GetResponseMessage : ?ct : CancellationToken -> Task<System.Net.Http.HttpResponseMessage>
[<Get "endpoint">]
abstract GetResponseMessage' : ?ct : CancellationToken -> Task<Net.Http.HttpResponseMessage>
[<Get "endpoint">]
abstract GetResponseMessage'' : ?ct : CancellationToken -> Task<Http.HttpResponseMessage>
[<Get "endpoint">]
abstract GetResponseMessage''' : ?ct : CancellationToken -> Task<HttpResponseMessage>

View File

@@ -56,3 +56,33 @@ module TestReturnTypes =
let buf = Array.zeroCreate 10
stream.Read (buf, 0, 10) |> shouldEqual 4
Array.take 4 buf |> shouldEqual result
[<TestCase "GetResponseMessage">]
[<TestCase "GetResponseMessage'">]
[<TestCase "GetResponseMessage''">]
[<TestCase "GetResponseMessage'''">]
let ``HttpResponseMessage return`` (case : string) =
let mutable responseMessage = None
let proc (message : HttpRequestMessage) : HttpResponseMessage Async =
async {
message.Method |> shouldEqual HttpMethod.Get
let content = new StringContent ("a response!")
let resp = new HttpResponseMessage (HttpStatusCode.OK)
resp.Content <- content
responseMessage <- Some resp
return resp
}
use client = HttpClientMock.make (Uri "https://example.com") proc
let api = PureGymApi.make client
let message =
match case with
| "GetResponseMessage" -> api.GetResponseMessage().Result
| "GetResponseMessage'" -> api.GetResponseMessage'().Result
| "GetResponseMessage''" -> api.GetResponseMessage''().Result
| "GetResponseMessage'''" -> api.GetResponseMessage'''().Result
| _ -> failwith $"unrecognised case: %s{case}"
Object.ReferenceEquals (message, Option.get responseMessage) |> shouldEqual true

View File

@@ -116,6 +116,17 @@ module internal SynTypePatterns =
| _ -> None
| _ -> None
let (|HttpResponseMessage|_|) (fieldType : SynType) : unit option =
match fieldType with
| SynType.LongIdent ident ->
match ident.LongIdent |> List.map (fun i -> i.idText) with
| [ "System" ; "Net" ; "Http" ; "HttpResponseMessage" ]
| [ "Net" ; "Http" ; "HttpResponseMessage" ]
| [ "Http" ; "HttpResponseMessage" ]
| [ "HttpResponseMessage" ] -> Some ()
| _ -> None
| _ -> None
let (|Stream|_|) (fieldType : SynType) : unit option =
match fieldType with
| SynType.LongIdent ident ->

View File

@@ -331,6 +331,7 @@ module internal HttpClientGenerator =
let returnExpr =
match info.ReturnType with
| HttpResponseMessage
| String
| Stream -> SynExpr.CreateIdentString "node"
| _ ->
@@ -400,6 +401,7 @@ module internal HttpClientGenerator =
)
)
match info.ReturnType with
| HttpResponseMessage -> yield Let ("node", SynExpr.CreateIdentString "response")
| String ->
yield
LetBang (