Skip to content

Commit

Permalink
Network, Http: replace timeout function
Browse files Browse the repository at this point in the history
  • Loading branch information
aarani committed Nov 7, 2021
1 parent c047ba1 commit 9a1c0ce
Show file tree
Hide file tree
Showing 7 changed files with 51 additions and 60 deletions.
3 changes: 1 addition & 2 deletions NOnion/Http/TorHttpClient.fs
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,7 @@ type TorHttpClient (stream: TorStream, host: string) =

let! httpResponse =
receiveAll Array.empty
|> Async.StartAsTask
|> AsyncUtil.AwaitTaskWithTimeout Constants.HttpResponseTimeout
|> FSharpUtil.WithTimeout Constants.HttpResponseTimeout

let header, body =
let delimiter =
Expand Down
1 change: 0 additions & 1 deletion NOnion/NOnion.fsproj
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@
<Compile Include="Exceptions.fs" />
<Compile Include="HandshakeType.fs" />
<Compile Include="Utility\FSharpUtil.fs" />
<Compile Include="Utility\AsyncUtil.fs" />
<Compile Include="Utility\StreamUtil.fs" />
<Compile Include="Utility\SemaphoreLocker.fs" />
<Compile Include="Utility\Base64Util.fs" />
Expand Down
23 changes: 12 additions & 11 deletions NOnion/Network/TorCircuit.fs
Original file line number Diff line number Diff line change
Expand Up @@ -337,8 +337,8 @@ type TorCircuit

return!
completionTask
|> AsyncUtil.AwaitTaskWithTimeout
Constants.CircuitOperationTimeout
|> Async.AwaitTask
|> FSharpUtil.WithTimeout Constants.CircuitOperationTimeout
}

member self.Extend (nodeDetail: CircuitNodeDetail) =
Expand Down Expand Up @@ -412,8 +412,8 @@ type TorCircuit

return!
completionTask
|> AsyncUtil.AwaitTaskWithTimeout
Constants.CircuitOperationTimeout
|> Async.AwaitTask
|> FSharpUtil.WithTimeout Constants.CircuitOperationTimeout

}

Expand Down Expand Up @@ -483,8 +483,8 @@ type TorCircuit

return!
completionTask
|> AsyncUtil.AwaitTaskWithTimeout
Constants.CircuitOperationTimeout
|> Async.AwaitTask
|> FSharpUtil.WithTimeout Constants.CircuitOperationTimeout
}

member self.RegisterAsRendezvousPoint (cookie: array<byte>) =
Expand Down Expand Up @@ -526,8 +526,8 @@ type TorCircuit

return!
completionTask
|> AsyncUtil.AwaitTaskWithTimeout
Constants.CircuitOperationTimeout
|> Async.AwaitTask
|> FSharpUtil.WithTimeout Constants.CircuitOperationTimeout
}

member self.ExtendAsync nodeDetail =
Expand Down Expand Up @@ -570,8 +570,8 @@ type TorCircuit

return!
completionTask
|> AsyncUtil.AwaitTaskWithTimeout
Constants.CircuitOperationTimeout
|> Async.AwaitTask
|> FSharpUtil.WithTimeout Constants.CircuitOperationTimeout
}

member self.WaitingForRendezvousJoin
Expand Down Expand Up @@ -609,7 +609,8 @@ type TorCircuit

return!
completionTask
|> AsyncUtil.AwaitTaskWithTimeout (TimeSpan.FromMinutes 2.)
|> Async.AwaitTask
|> FSharpUtil.WithTimeout (TimeSpan.FromMinutes 2.)
}

member self.Rendezvous
Expand Down
8 changes: 3 additions & 5 deletions NOnion/Network/TorGuard.fs
Original file line number Diff line number Diff line change
Expand Up @@ -58,8 +58,8 @@ type TorGuard private (client: TcpClient, sslStream: SslStream) =
SslProtocols.Tls12,
false
)
|> AsyncUtil.AwaitNonGenericTaskWithTimeout
Constants.CircuitOperationTimeout
|> Async.AwaitTask
|> FSharpUtil.WithTimeout Constants.CircuitOperationTimeout

ipEndpoint.ToString ()
|> sprintf "TorGuard: ssl connection to %s guard node authenticated"
Expand Down Expand Up @@ -281,9 +281,7 @@ type TorGuard private (client: TcpClient, sslStream: SslStream) =
TorLogger.Log "TorGuard: finished handshake process"
//TODO: do security checks on handshake data
}
|> Async.StartAsTask
|> AsyncUtil.AwaitNonGenericTaskWithTimeout
Constants.CircuitOperationTimeout
|> FSharpUtil.WithTimeout Constants.CircuitOperationTimeout

member internal __.RegisterCircuit (circuit: ITorCircuit) : uint16 =
let rec createCircuitId (retry: int) =
Expand Down
8 changes: 4 additions & 4 deletions NOnion/Network/TorStream.fs
Original file line number Diff line number Diff line change
Expand Up @@ -140,8 +140,8 @@ type TorStream (circuit: TorCircuit) =

return!
connectionProcessTcs
|> AsyncUtil.AwaitTaskWithTimeout
Constants.StreamCreationTimeout
|> Async.AwaitTask
|> FSharpUtil.WithTimeout Constants.StreamCreationTimeout
}

member self.ConnectToDirectory () =
Expand Down Expand Up @@ -174,8 +174,8 @@ type TorStream (circuit: TorCircuit) =

return!
connectionProcessTcs
|> AsyncUtil.AwaitTaskWithTimeout
Constants.StreamCreationTimeout
|> Async.AwaitTask
|> FSharpUtil.WithTimeout Constants.StreamCreationTimeout
}

member self.ConnectToDirectoryAsync () =
Expand Down
37 changes: 0 additions & 37 deletions NOnion/Utility/AsyncUtil.fs

This file was deleted.

31 changes: 31 additions & 0 deletions NOnion/Utility/FSharpUtil.fs
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,34 @@ module FSharpUtil =
(ExceptionDispatchInfo.Capture ex).Throw ()
failwith "Should be unreachable"
ex

type private Either<'Val, 'Err when 'Err :> Exception> =
| FailureResult of 'Err
| SuccessfulValue of 'Val

let WithTimeout (timeSpan: TimeSpan) (job: Async<'R>) : Async<'R> =
async {
let read =
async {
let! value = job
return value |> SuccessfulValue |> Some
}

let delay =
async {
let total = int timeSpan.TotalMilliseconds
do! Async.Sleep total
return FailureResult <| TimeoutException () |> Some
}

let! dummyOption = Async.Choice ([ read; delay ])

match dummyOption with
| Some theResult ->
match theResult with
| SuccessfulValue r -> return r
| FailureResult _ -> return raise <| TimeoutErrorException
| None ->
// none of the jobs passed to Async.Choice returns None
return failwith "unreachable"
}

0 comments on commit 9a1c0ce

Please sign in to comment.