Skip to content

Commit 5180574

Browse files
authored
Services,Tests: create HS streams on demand (#10)
There are multiple usecases when you need multiple streams for your communication with HS client (e.g sending multiple http requests), this was not supported before and this commit fixes that.
1 parent 0938049 commit 5180574

File tree

3 files changed

+19
-13
lines changed

3 files changed

+19
-13
lines changed

NOnion.Tests/HiddenServicesTests.cs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,8 @@ public async Task BrowseFacebookOverHS()
106106
using TorClient torClient = await TorClient.BootstrapWithGithubAsync(cachePath);
107107

108108
var serviceClient = await TorServiceClient.ConnectAsync(torClient, "facebookwkhpilnemxj7asaniu7vnjjbiltxjqhye3mhbshg7kx5tfyd.onion");
109-
var httpClient = new TorHttpClient(serviceClient.GetStream(), "facebookwkhpilnemxj7asaniu7vnjjbiltxjqhye3mhbshg7kx5tfyd.onion");
109+
var stream = await serviceClient.GetStreamAsync();
110+
var httpClient = new TorHttpClient(stream, "facebookwkhpilnemxj7asaniu7vnjjbiltxjqhye3mhbshg7kx5tfyd.onion");
110111

111112
try
112113
{
@@ -131,8 +132,8 @@ public async Task BrowseFacebookOverHSWithTLS()
131132
using TorClient torClient = await TorClient.BootstrapWithGithubAsync(cachePath);
132133

133134
var serviceClient = await TorServiceClient.ConnectAsync(torClient, "facebookwkhpilnemxj7asaniu7vnjjbiltxjqhye3mhbshg7kx5tfyd.onion:443");
134-
135-
var sslStream = new SslStream(serviceClient.GetStream(), true, (sender, cert, chain, sslPolicyErrors) => true);
135+
var stream = await serviceClient.GetStreamAsync();
136+
var sslStream = new SslStream(stream, true, (sender, cert, chain, sslPolicyErrors) => true);
136137
await sslStream.AuthenticateAsClientAsync(string.Empty, null, SslProtocols.Tls12, false);
137138

138139
var httpClientOverSslStream = new TorHttpClient(sslStream, "www.facebookwkhpilnemxj7asaniu7vnjjbiltxjqhye3mhbshg7kx5tfyd.onion");
@@ -185,7 +186,7 @@ public async Task EstablishAndCommunicateOverHSConnectionOnionStyle()
185186
var clientSide =
186187
Task.Run(async () => {
187188
var serviceClient = await TorServiceClient.ConnectAsync(torClient, host.ExportUrl());
188-
var stream = serviceClient.GetStream();
189+
var stream = await serviceClient.GetStreamAsync();
189190
var lengthBytes = new byte[sizeof(int)];
190191
await ReadExact(stream, lengthBytes, 0, lengthBytes.Length);
191192
var length = BitConverter.ToInt32(lengthBytes);

NOnion/Services/TorServiceClient.fs

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,21 @@ type TorServiceClient =
2424
{
2525
TorClient: TorClient
2626
RendezvousCircuit: TorCircuit
27-
Stream: TorStream
27+
Port: int
2828
}
2929

3030
member self.GetStream() =
31-
self.Stream
31+
async {
32+
// We can't use the "use" keyword since this stream needs
33+
// to outlive this function.
34+
let serviceStream = new TorStream(self.RendezvousCircuit)
35+
do! serviceStream.ConnectToService self.Port |> Async.Ignore
36+
37+
return serviceStream
38+
}
39+
40+
member self.GetStreamAsync() =
41+
self.GetStream() |> Async.StartAsTask
3242

3343
static member ConnectAsync (client: TorClient) (url: string) =
3444
TorServiceClient.Connect client url |> Async.StartAsTask
@@ -475,16 +485,11 @@ type TorServiceClient =
475485
Async.Parallel [ introduceJob; rendezvousJoin ]
476486
|> Async.Ignore
477487

478-
// We can't use the "use" keyword since this stream needs
479-
// to outlive this function.
480-
let serviceStream = new TorStream(rendezvousCircuit)
481-
do! serviceStream.ConnectToService port |> Async.Ignore
482-
483488
return
484489
{
485490
TorClient = client
486491
RendezvousCircuit = rendezvousCircuit
487-
Stream = serviceStream
492+
Port = port
488493
}
489494
| _ ->
490495
return

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ To connect to a hidden service using the Tor network, use the folowing command:
7171
let onionAddress = "facebookwkhpilnemxj7asaniu7vnjjbiltxjqhye3mhbshg7kx5tfyd.onion"
7272
7373
let! serviceClient = TorServiceClient.Connect torClient onionAddress
74-
let stream = serviceClient.GetStream()
74+
let! stream = serviceClient.GetStream()
7575
```
7676
Now, utilize the stream just like any other `System.IO.Stream`:
7777
```

0 commit comments

Comments
 (0)