From 6c978cc22c47cbdf215fde52d9125b8ac870b415 Mon Sep 17 00:00:00 2001 From: Danny Garber Date: Mon, 19 Jul 2021 21:45:12 -0400 Subject: [PATCH 1/4] implemented Http and Websocket listeners --- Src/ServiceBusRelayUtil.sln | 31 -- Src/ServiceBusRelayUtil/App.config | 68 ----- Src/ServiceBusRelayUtil/App.ico | Bin 25214 -> 0 bytes Src/ServiceBusRelayUtil/DispatcherService.cs | 269 ------------------ Src/ServiceBusRelayUtil/Program.cs | 68 ----- .../Properties/AssemblyInfo.cs | 36 --- .../RawContentTypeMapper.cs | 13 - .../ServiceBusRelayUtil.csproj | 143 ---------- .../ServiceBusRelayUtilConfig.cs | 15 - .../azureservicebusrelaylogo_150.png | Bin 3562 -> 0 bytes Src/ServiceBusRelayUtil/packages.config | 23 -- Src/ServiceBusRelayUtilNetCore/App.ico | Bin 25214 -> 0 bytes .../DispatcherService.cs | 205 ------------- Src/ServiceBusRelayUtilNetCore/Program.cs | 53 ---- .../ServiceBusRelayUtilNetCore.csproj | 29 -- .../appsettings.json | 7 - WMT-Bot.png | Bin 0 -> 61074 bytes features/dannyg | 1 + .../Extensions/StringEx.cs | 2 +- .../WebHeaderCollectionExtensions.cs | 16 ++ .../HttpListener.cs | 203 +++++++++++++ .../Logger.cs | 117 ++++++++ .../Microsoft.HybridConnections.Core.csproj | 12 + .../RelayedHttpListenerRequestSerializer.cs | 141 +++++++++ .../RequestMessage.cs | 17 ++ .../WebSocketListener.cs | 107 +++++++ ...icrosoft.HybridConnections.Listener.csproj | 33 +++ .../Program.cs | 204 +++++++++++++ .../appsettings.json | 13 + .../Microsoft.HybridConnections.Relay.csproj | 31 ++ .../Program.cs | 175 ++++++++++++ .../WebSocketClient.csproj | 4 + .../WebsocketClient.cs | 100 +++++++ .../appsettings.json | 17 ++ src/Microsoft.HybridConnections.sln | 37 +++ 35 files changed, 1229 insertions(+), 961 deletions(-) delete mode 100644 Src/ServiceBusRelayUtil.sln delete mode 100644 Src/ServiceBusRelayUtil/App.config delete mode 100644 Src/ServiceBusRelayUtil/App.ico delete mode 100644 Src/ServiceBusRelayUtil/DispatcherService.cs delete mode 100644 Src/ServiceBusRelayUtil/Program.cs delete mode 100644 Src/ServiceBusRelayUtil/Properties/AssemblyInfo.cs delete mode 100644 Src/ServiceBusRelayUtil/RawContentTypeMapper.cs delete mode 100644 Src/ServiceBusRelayUtil/ServiceBusRelayUtil.csproj delete mode 100644 Src/ServiceBusRelayUtil/ServiceBusRelayUtilConfig.cs delete mode 100644 Src/ServiceBusRelayUtil/azureservicebusrelaylogo_150.png delete mode 100644 Src/ServiceBusRelayUtil/packages.config delete mode 100644 Src/ServiceBusRelayUtilNetCore/App.ico delete mode 100644 Src/ServiceBusRelayUtilNetCore/DispatcherService.cs delete mode 100644 Src/ServiceBusRelayUtilNetCore/Program.cs delete mode 100644 Src/ServiceBusRelayUtilNetCore/ServiceBusRelayUtilNetCore.csproj delete mode 100644 Src/ServiceBusRelayUtilNetCore/appsettings.json create mode 100644 WMT-Bot.png create mode 160000 features/dannyg rename {Src/ServiceBusRelayUtilNetCore => src/Microsoft.HybridConnections.Core}/Extensions/StringEx.cs (92%) create mode 100644 src/Microsoft.HybridConnections.Core/Extensions/WebHeaderCollectionExtensions.cs create mode 100644 src/Microsoft.HybridConnections.Core/HttpListener.cs create mode 100644 src/Microsoft.HybridConnections.Core/Logger.cs create mode 100644 src/Microsoft.HybridConnections.Core/Microsoft.HybridConnections.Core.csproj create mode 100644 src/Microsoft.HybridConnections.Core/RelayedHttpListenerRequestSerializer.cs create mode 100644 src/Microsoft.HybridConnections.Core/RequestMessage.cs create mode 100644 src/Microsoft.HybridConnections.Core/WebSocketListener.cs create mode 100644 src/Microsoft.HybridConnections.Listener/Microsoft.HybridConnections.Listener.csproj create mode 100644 src/Microsoft.HybridConnections.Listener/Program.cs create mode 100644 src/Microsoft.HybridConnections.Listener/appsettings.json create mode 100644 src/Microsoft.HybridConnections.Relay/Microsoft.HybridConnections.Relay.csproj create mode 100644 src/Microsoft.HybridConnections.Relay/Program.cs create mode 100644 src/Microsoft.HybridConnections.Relay/WebSocketClient.csproj create mode 100644 src/Microsoft.HybridConnections.Relay/WebsocketClient.cs create mode 100644 src/Microsoft.HybridConnections.Relay/appsettings.json create mode 100644 src/Microsoft.HybridConnections.sln diff --git a/Src/ServiceBusRelayUtil.sln b/Src/ServiceBusRelayUtil.sln deleted file mode 100644 index d334a17..0000000 --- a/Src/ServiceBusRelayUtil.sln +++ /dev/null @@ -1,31 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.27004.2005 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ServiceBusRelayUtil", "ServiceBusRelayUtil\ServiceBusRelayUtil.csproj", "{B9DA41E3-4E0A-41D6-B7D1-64AB017D4FED}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ServiceBusRelayUtilNetCore", "ServiceBusRelayUtilNetCore\ServiceBusRelayUtilNetCore.csproj", "{9AECFF0E-26C7-4D96-A00A-8A09198711EC}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {B9DA41E3-4E0A-41D6-B7D1-64AB017D4FED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B9DA41E3-4E0A-41D6-B7D1-64AB017D4FED}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B9DA41E3-4E0A-41D6-B7D1-64AB017D4FED}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B9DA41E3-4E0A-41D6-B7D1-64AB017D4FED}.Release|Any CPU.Build.0 = Release|Any CPU - {9AECFF0E-26C7-4D96-A00A-8A09198711EC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9AECFF0E-26C7-4D96-A00A-8A09198711EC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9AECFF0E-26C7-4D96-A00A-8A09198711EC}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9AECFF0E-26C7-4D96-A00A-8A09198711EC}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {2C96A03F-F825-402A-B109-0F1FC60BA3CE} - EndGlobalSection -EndGlobal diff --git a/Src/ServiceBusRelayUtil/App.config b/Src/ServiceBusRelayUtil/App.config deleted file mode 100644 index 496dff6..0000000 --- a/Src/ServiceBusRelayUtil/App.config +++ /dev/null @@ -1,68 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Src/ServiceBusRelayUtil/App.ico b/Src/ServiceBusRelayUtil/App.ico deleted file mode 100644 index f3c2e20ce1ed59f67f9aff31ee81b25df43fd2fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25214 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 diff --git a/Src/ServiceBusRelayUtil/DispatcherService.cs b/Src/ServiceBusRelayUtil/DispatcherService.cs deleted file mode 100644 index 13f81ea..0000000 --- a/Src/ServiceBusRelayUtil/DispatcherService.cs +++ /dev/null @@ -1,269 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Net.Http; -using System.ServiceModel; -using System.ServiceModel.Channels; -using System.ServiceModel.Web; -using System.Text; -using System.Threading; -using System.Threading.Tasks; -using System.Xml; -using Microsoft.ServiceBus.Web; -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; -using Formatting = Newtonsoft.Json.Formatting; - -namespace GaboG.ServiceBusRelayUtil -{ - [ServiceContract(Namespace = "http://samples.microsoft.com/ServiceModel/Relay/")] - [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)] - internal class DispatcherService - { - private static readonly HashSet _httpContentHeaders = new HashSet - { - "Allow", - "Content-Encoding", - "Content-Language", - "Content-Length", - "Content-Location", - "Content-MD5", - "Content-Range", - "Content-Type", - "Expires", - "Last-Modified" - }; - - private readonly ServiceBusRelayUtilConfig _config; - - public DispatcherService(ServiceBusRelayUtilConfig config) - { - _config = config; - } - - [WebGet(UriTemplate = "*")] - [OperationContract(AsyncPattern = true)] - public async Task GetAsync() - { - try - { - var ti0 = DateTime.Now; - Console.WriteLine("In GetAsync:"); - var context = WebOperationContext.Current; - var request = BuildForwardedRequest(context, null); - Console.WriteLine("...calling {0}...", request.RequestUri); - HttpResponseMessage response; - using (var client = new HttpClient()) - { - response = await client.SendAsync(request, CancellationToken.None); - } - - Console.WriteLine("...and back {0:N0} ms...", DateTime.Now.Subtract(ti0).TotalMilliseconds); - Console.WriteLine(""); - - Console.WriteLine("...reading and creating response..."); - CopyHttpResponseMessageToOutgoingResponse(response, context.OutgoingResponse); - var stream = response.Content != null ? await response.Content.ReadAsStreamAsync() : null; - var message = StreamMessageHelper.CreateMessage(MessageVersion.None, "GETRESPONSE", stream ?? new MemoryStream()); - Console.WriteLine("...and done (total time: {0:N0} ms).", DateTime.Now.Subtract(ti0).TotalMilliseconds); - Console.WriteLine(""); - return message; - } - catch (Exception ex) - { - WriteException(ex); - throw; - } - } - - [WebInvoke(UriTemplate = "*", Method = "*")] - [OperationContract(AsyncPattern = true)] - public async Task InvokeAsync(Message msg) - { - try - { - var ti0 = DateTime.Now; - WriteFlowerLine(); - Console.WriteLine("In InvokeAsync:"); - var context = WebOperationContext.Current; - var request = BuildForwardedRequest(context, msg); - Console.WriteLine("...calling {0}", request.RequestUri); - HttpResponseMessage response; - using (var client = new HttpClient()) - { - response = await client.SendAsync(request, CancellationToken.None); - } - - Console.WriteLine("...and done {0:N0} ms...", DateTime.Now.Subtract(ti0).TotalMilliseconds); - - Console.WriteLine("...reading and creating response..."); - CopyHttpResponseMessageToOutgoingResponse(response, context.OutgoingResponse); - var stream = response.Content != null ? await response.Content.ReadAsStreamAsync() : null; - var message = StreamMessageHelper.CreateMessage(MessageVersion.None, "GETRESPONSE", stream ?? new MemoryStream()); - Console.WriteLine("...and done (total time: {0:N0} ms).", DateTime.Now.Subtract(ti0).TotalMilliseconds); - return message; - } - catch (Exception ex) - { - WriteException(ex); - throw; - } - } - - private HttpRequestMessage BuildForwardedRequest(WebOperationContext context, Message msg) - { - var incomingRequest = context.IncomingRequest; - - var mappedUri = new Uri(incomingRequest.UriTemplateMatch.RequestUri.ToString().Replace(_config.RelayAddress.ToString(), _config.TargetAddress.ToString())); - var newRequest = new HttpRequestMessage(new HttpMethod(incomingRequest.Method), mappedUri); - - // Copy headers - var hostHeader = _config.TargetAddress.Host + (_config.TargetAddress.Port != 80 || _config.TargetAddress.Port != 443 ? ":" + _config.TargetAddress.Port : ""); - foreach (var name in incomingRequest.Headers.AllKeys.Where(name => !_httpContentHeaders.Contains(name))) - { - newRequest.Headers.TryAddWithoutValidation(name, name == "Host" ? hostHeader : incomingRequest.Headers.Get(name)); - } - - if (msg != null) - { - Stream messageStream = null; - if (msg.Properties.TryGetValue("WebBodyFormatMessageProperty", out var value)) - { - if (value is WebBodyFormatMessageProperty prop && (prop.Format == WebContentFormat.Json || prop.Format == WebContentFormat.Raw)) - { - messageStream = StreamMessageHelper.GetStream(msg); - } - } - else - { - var ms = new MemoryStream(); - using (var xw = XmlDictionaryWriter.CreateTextWriter(ms, Encoding.UTF8, false)) - { - msg.WriteBodyContents(xw); - } - - ms.Seek(0, SeekOrigin.Begin); - messageStream = ms; - } - - if (messageStream != null) - { - if (_config.BufferRequestContent) - { - var ms1 = new MemoryStream(); - messageStream.CopyTo(ms1); - ms1.Seek(0, SeekOrigin.Begin); - newRequest.Content = new StreamContent(ms1); - } - else - { - var ms1 = new MemoryStream(); - messageStream.CopyTo(ms1); - ms1.Seek(0, SeekOrigin.Begin); - - var debugMs = new MemoryStream(); - ms1.CopyTo(debugMs); - debugMs.Seek(0, SeekOrigin.Begin); - - var result = Encoding.UTF8.GetString(debugMs.ToArray()); - WriteJsonObject(result); - - ms1.Seek(0, SeekOrigin.Begin); - newRequest.Content = new StreamContent(ms1); - } - - foreach (var name in incomingRequest.Headers.AllKeys.Where(name => _httpContentHeaders.Contains(name))) - { - newRequest.Content.Headers.TryAddWithoutValidation(name, incomingRequest.Headers.Get(name)); - } - } - } - - return newRequest; - } - - private static void WriteException(Exception ex) - { - Console.ForegroundColor = ConsoleColor.Red; - Console.WriteLine(ex); - Console.WriteLine(""); - Console.ResetColor(); - } - - private static void WriteJsonObject(string result) - { - Console.ForegroundColor = ConsoleColor.Yellow; - - var formatted = result; - if (IsValidJson(result)) - { - var s = new JsonSerializerSettings - { - Formatting = Formatting.Indented - }; - - dynamic o = JsonConvert.DeserializeObject(result); - formatted = JsonConvert.SerializeObject(o, s); - } - - Console.WriteLine(formatted); - Console.ResetColor(); - } - - private static void WriteFlowerLine() - { - Console.ForegroundColor = ConsoleColor.Green; - Console.WriteLine("\r\n=> {0:MM/dd/yyyy hh:mm:ss.fff tt} {1}", DateTime.Now, new string('*', 80)); - Console.ResetColor(); - } - - private static void CopyHttpResponseMessageToOutgoingResponse(HttpResponseMessage response, OutgoingWebResponseContext outgoingResponse) - { - outgoingResponse.StatusCode = response.StatusCode; - outgoingResponse.StatusDescription = response.ReasonPhrase; - if (response.Content == null) - { - outgoingResponse.SuppressEntityBody = true; - } - - foreach (var kvp in response.Headers) - { - foreach (var value in kvp.Value) - { - outgoingResponse.Headers.Add(kvp.Key, value); - } - } - - if (response.Content != null) - { - foreach (var kvp in response.Content.Headers) - { - foreach (var value in kvp.Value) - { - outgoingResponse.Headers.Add(kvp.Key, value); - } - } - } - } - - private static bool IsValidJson(string strInput) - { - strInput = strInput.Trim(); - if ((!strInput.StartsWith("{") || !strInput.EndsWith("}")) && (!strInput.StartsWith("[") || !strInput.EndsWith("]"))) - { - return false; - } - - try - { - JToken.Parse(strInput); - return true; - } - catch //some other exception - { - return false; - } - } - } -} \ No newline at end of file diff --git a/Src/ServiceBusRelayUtil/Program.cs b/Src/ServiceBusRelayUtil/Program.cs deleted file mode 100644 index 9de1000..0000000 --- a/Src/ServiceBusRelayUtil/Program.cs +++ /dev/null @@ -1,68 +0,0 @@ -using System; -using System.Configuration; -using System.ServiceModel.Channels; -using System.ServiceModel.Web; -using Microsoft.ServiceBus; - -namespace GaboG.ServiceBusRelayUtil -{ - internal class Program - { - // https://github.com/pmhsfelix/WebApi.Explorations.ServiceBusRelayHost - // https://docs.microsoft.com/en-us/azure/service-bus-relay/service-bus-relay-rest-tutorial - private static void Main() - { - var relayNamespace = ConfigurationManager.AppSettings["RelayNamespace"]; - var relayAddress = ServiceBusEnvironment.CreateServiceUri("https", relayNamespace, ConfigurationManager.AppSettings["RelayName"]); - - var config = new ServiceBusRelayUtilConfig - { - RelayAddress = relayAddress, - RelayPolicyName = ConfigurationManager.AppSettings["PolicyName"], - RelayPolicyKey = ConfigurationManager.AppSettings["PolicyKey"], - MaxReceivedMessageSize = long.Parse(ConfigurationManager.AppSettings["MaxReceivedMessageSize"]), - TargetAddress = new Uri(ConfigurationManager.AppSettings["TargetServiceAddress"]) - }; - - var host = CreateWebServiceHost(config, relayAddress); - host.Open(); - - Console.WriteLine("Azure Service Bus is listening at \n\r\t{0}\n\rrouting requests to \n\r\t{1}\n\r\n\r", relayAddress, config.TargetAddress); - Console.WriteLine(); - Console.WriteLine("Press [Enter] to exit"); - Console.ReadLine(); - - host.Close(); - } - - private static WebServiceHost CreateWebServiceHost(ServiceBusRelayUtilConfig config, Uri address) - { - var host = new WebServiceHost(new DispatcherService(config)); - var binding = GetBinding(config.MaxReceivedMessageSize); - var endpoint = host.AddServiceEndpoint(typeof(DispatcherService), binding, address); - var behavior = GetTransportBehavior(config.RelayPolicyName, config.RelayPolicyKey); - endpoint.Behaviors.Add(behavior); - return host; - } - - private static Binding GetBinding(long maxReceivedMessageSize) - { - var webHttpRelayBinding = new WebHttpRelayBinding(EndToEndWebHttpSecurityMode.None, RelayClientAuthenticationType.None) - { - MaxReceivedMessageSize = maxReceivedMessageSize - }; - var bindingElements = webHttpRelayBinding.CreateBindingElements(); - var webMessageEncodingBindingElement = bindingElements.Find(); - webMessageEncodingBindingElement.ContentTypeMapper = new RawContentTypeMapper(); - return new CustomBinding(bindingElements); - } - - private static TransportClientEndpointBehavior GetTransportBehavior(string keyName, string sharedAccessKey) - { - return new TransportClientEndpointBehavior - { - TokenProvider = TokenProvider.CreateSharedAccessSignatureTokenProvider(keyName, sharedAccessKey) - }; - } - } -} \ No newline at end of file diff --git a/Src/ServiceBusRelayUtil/Properties/AssemblyInfo.cs b/Src/ServiceBusRelayUtil/Properties/AssemblyInfo.cs deleted file mode 100644 index 7ac5c7a..0000000 --- a/Src/ServiceBusRelayUtil/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("ServiceBusRelayUtil")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("ServiceBusRelayUtil")] -[assembly: AssemblyCopyright("Copyright © 2017")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("b9da41e3-4e0a-41d6-b7d1-64ab017d4fed")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Src/ServiceBusRelayUtil/RawContentTypeMapper.cs b/Src/ServiceBusRelayUtil/RawContentTypeMapper.cs deleted file mode 100644 index 40289c4..0000000 --- a/Src/ServiceBusRelayUtil/RawContentTypeMapper.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System; -using System.ServiceModel.Channels; - -namespace GaboG.ServiceBusRelayUtil -{ - internal class RawContentTypeMapper : WebContentTypeMapper - { - public override WebContentFormat GetMessageFormatForContentType(string contentType) - { - return WebContentFormat.Raw; - } - } -} \ No newline at end of file diff --git a/Src/ServiceBusRelayUtil/ServiceBusRelayUtil.csproj b/Src/ServiceBusRelayUtil/ServiceBusRelayUtil.csproj deleted file mode 100644 index bc6f885..0000000 --- a/Src/ServiceBusRelayUtil/ServiceBusRelayUtil.csproj +++ /dev/null @@ -1,143 +0,0 @@ - - - - - Debug - AnyCPU - {B9DA41E3-4E0A-41D6-B7D1-64AB017D4FED} - Exe - GaboG.ServiceBusRelayUtil - ServiceBusRelayUtil - v4.7 - 512 - true - - - - - AnyCPU - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - AnyCPU - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - App.ico - - - - ..\packages\Microsoft.Azure.Amqp.2.3.7\lib\net45\Microsoft.Azure.Amqp.dll - - - ..\packages\Microsoft.Azure.ServiceBus.3.3.0\lib\net461\Microsoft.Azure.ServiceBus.dll - - - ..\packages\Microsoft.Azure.Services.AppAuthentication.1.0.3\lib\net452\Microsoft.Azure.Services.AppAuthentication.dll - - - ..\packages\Microsoft.IdentityModel.Clients.ActiveDirectory.3.19.8\lib\net45\Microsoft.IdentityModel.Clients.ActiveDirectory.dll - - - ..\packages\Microsoft.IdentityModel.Clients.ActiveDirectory.3.19.8\lib\net45\Microsoft.IdentityModel.Clients.ActiveDirectory.Platform.dll - - - ..\packages\Microsoft.IdentityModel.Logging.5.2.2\lib\net451\Microsoft.IdentityModel.Logging.dll - - - ..\packages\Microsoft.IdentityModel.Tokens.5.2.2\lib\net451\Microsoft.IdentityModel.Tokens.dll - - - ..\packages\WindowsAzure.ServiceBus.5.1.0\lib\net46\Microsoft.ServiceBus.dll - - - ..\packages\Newtonsoft.Json.10.0.3\lib\net45\Newtonsoft.Json.dll - - - - - - - ..\packages\System.Diagnostics.DiagnosticSource.4.4.1\lib\net46\System.Diagnostics.DiagnosticSource.dll - - - ..\packages\System.IdentityModel.Tokens.Jwt.5.2.2\lib\net451\System.IdentityModel.Tokens.Jwt.dll - - - ..\packages\System.IO.4.3.0\lib\net462\System.IO.dll - - - ..\packages\System.Net.WebSockets.4.3.0\lib\net46\System.Net.WebSockets.dll - - - ..\packages\System.Net.WebSockets.Client.4.3.2\lib\net46\System.Net.WebSockets.Client.dll - - - ..\packages\System.Runtime.4.3.0\lib\net462\System.Runtime.dll - - - - ..\packages\System.Runtime.Serialization.Primitives.4.3.0\lib\net46\System.Runtime.Serialization.Primitives.dll - - - ..\packages\System.Runtime.Serialization.Xml.4.3.0\lib\net46\System.Runtime.Serialization.Xml.dll - - - ..\packages\System.Security.Cryptography.Algorithms.4.3.1\lib\net463\System.Security.Cryptography.Algorithms.dll - - - ..\packages\System.Security.Cryptography.Encoding.4.3.0\lib\net46\System.Security.Cryptography.Encoding.dll - - - ..\packages\System.Security.Cryptography.Primitives.4.3.0\lib\net46\System.Security.Cryptography.Primitives.dll - - - ..\packages\System.Security.Cryptography.X509Certificates.4.3.2\lib\net461\System.Security.Cryptography.X509Certificates.dll - - - - - - - - - - - - - - - - - - - - - - Designer - - - - - - - - - - - This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - - \ No newline at end of file diff --git a/Src/ServiceBusRelayUtil/ServiceBusRelayUtilConfig.cs b/Src/ServiceBusRelayUtil/ServiceBusRelayUtilConfig.cs deleted file mode 100644 index f4944e4..0000000 --- a/Src/ServiceBusRelayUtil/ServiceBusRelayUtilConfig.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; - -namespace GaboG.ServiceBusRelayUtil -{ - public class ServiceBusRelayUtilConfig - { - public string RelayPolicyName { get; set; } - public string RelayPolicyKey { get; set; } - public Uri RelayAddress { get; set; } - - public bool BufferRequestContent { get; set; } - public long MaxReceivedMessageSize { get; set; } - public Uri TargetAddress { get; set; } - } -} \ No newline at end of file diff --git a/Src/ServiceBusRelayUtil/azureservicebusrelaylogo_150.png b/Src/ServiceBusRelayUtil/azureservicebusrelaylogo_150.png deleted file mode 100644 index 3fe665a213009c9ca636bb7ed94f0bfa4c8f2ba9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3562 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 diff --git a/Src/ServiceBusRelayUtil/packages.config b/Src/ServiceBusRelayUtil/packages.config deleted file mode 100644 index 79eb4aa..0000000 --- a/Src/ServiceBusRelayUtil/packages.config +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Src/ServiceBusRelayUtilNetCore/App.ico b/Src/ServiceBusRelayUtilNetCore/App.ico deleted file mode 100644 index f3c2e20ce1ed59f67f9aff31ee81b25df43fd2fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25214 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 diff --git a/Src/ServiceBusRelayUtilNetCore/DispatcherService.cs b/Src/ServiceBusRelayUtilNetCore/DispatcherService.cs deleted file mode 100644 index 1704890..0000000 --- a/Src/ServiceBusRelayUtilNetCore/DispatcherService.cs +++ /dev/null @@ -1,205 +0,0 @@ -using System; -using System.Net; -using System.Net.Http; -using System.Net.Http.Headers; -using System.Threading; -using System.Threading.Tasks; -using GaboG.ServiceBusRelayUtilNetCore.Extensions; -using Microsoft.Azure.Relay; -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; - -namespace GaboG.ServiceBusRelayUtilNetCore - -{ - internal class DispatcherService - { - private readonly HttpClient _httpClient; - private readonly string _hybridConnectionSubPath; - private readonly HybridConnectionListener _listener; - private readonly Uri _targetServiceAddress; - - public DispatcherService(string relayNamespace, string connectionName, string keyName, string key, Uri targetServiceAddress) - { - _targetServiceAddress = targetServiceAddress; - - var tokenProvider = TokenProvider.CreateSharedAccessSignatureTokenProvider(keyName, key); - _listener = new HybridConnectionListener(new Uri($"sb://{relayNamespace}/{connectionName}"), tokenProvider); - - _httpClient = new HttpClient - { - BaseAddress = targetServiceAddress - }; - _httpClient.DefaultRequestHeaders.ExpectContinue = false; - - _hybridConnectionSubPath = _listener.Address.AbsolutePath.EnsureEndsWith("/"); - } - - public async Task OpenAsync(CancellationToken cancelToken) - { - _listener.RequestHandler = ListenerRequestHandler; - await _listener.OpenAsync(cancelToken); - Console.WriteLine("Azure Service Bus is listening on \n\r\t{0}\n\rand routing requests to \n\r\t{1}\n\r\n\r", _listener.Address, _httpClient.BaseAddress); - Console.WriteLine("Press [Enter] to exit"); - } - - public Task CloseAsync(CancellationToken cancelToken) - { - _httpClient.Dispose(); - return _listener.CloseAsync(cancelToken); - } - - private async void ListenerRequestHandler(RelayedHttpListenerContext context) - { - var startTimeUtc = DateTime.UtcNow; - try - { - Console.WriteLine("Calling {0}...", _targetServiceAddress); - var requestMessage = CreateHttpRequestMessage(context); - var responseMessage = await _httpClient.SendAsync(requestMessage); - await SendResponseAsync(context, responseMessage); - await context.Response.CloseAsync(); - } - - catch (Exception ex) - { - LogException(ex); - SendErrorResponse(ex, context); - } - finally - { - LogRequest(startTimeUtc); - } - } - - private async Task SendResponseAsync(RelayedHttpListenerContext context, HttpResponseMessage responseMessage) - { - context.Response.StatusCode = responseMessage.StatusCode; - context.Response.StatusDescription = responseMessage.ReasonPhrase; - foreach (var header in responseMessage.Headers) - { - if (string.Equals(header.Key, "Transfer-Encoding")) - { - continue; - } - - context.Response.Headers.Add(header.Key, string.Join(",", header.Value)); - } - - var responseStream = await responseMessage.Content.ReadAsStreamAsync(); - await responseStream.CopyToAsync(context.Response.OutputStream); - } - - private void SendErrorResponse(Exception ex, RelayedHttpListenerContext context) - { - context.Response.StatusCode = HttpStatusCode.InternalServerError; - context.Response.StatusDescription = $"Internal Server Error: {ex.GetType().FullName}: {ex.Message}"; - context.Response.Close(); - } - - private HttpRequestMessage CreateHttpRequestMessage(RelayedHttpListenerContext context) - { - var requestMessage = new HttpRequestMessage(); - if (context.Request.HasEntityBody) - { - requestMessage.Content = new StreamContent(context.Request.InputStream); - // Experiment to see if I can capture the return message instead of having the bot responding directly (so far it doesn't work). - //var contentStream = new MemoryStream(); - //var writer = new StreamWriter(contentStream); - //var newActivity = requestMessage.Content.ReadAsStringAsync().Result.Replace("https://directline.botframework.com/", "https://localhost:44372/"); - //writer.Write(newActivity); - //writer.Flush(); - //contentStream.Position = 0; - //requestMessage.Content = new StreamContent(contentStream); - var contentType = context.Request.Headers[HttpRequestHeader.ContentType]; - if (!string.IsNullOrEmpty(contentType)) - { - requestMessage.Content.Headers.ContentType = MediaTypeHeaderValue.Parse(contentType); - } - } - - var relativePath = context.Request.Url.GetComponents(UriComponents.PathAndQuery, UriFormat.Unescaped); - relativePath = relativePath.Replace(_hybridConnectionSubPath, string.Empty, StringComparison.OrdinalIgnoreCase); - requestMessage.RequestUri = new Uri(relativePath, UriKind.RelativeOrAbsolute); - requestMessage.Method = new HttpMethod(context.Request.HttpMethod); - - foreach (var headerName in context.Request.Headers.AllKeys) - { - if (string.Equals(headerName, "Host", StringComparison.OrdinalIgnoreCase) || - string.Equals(headerName, "Content-Type", StringComparison.OrdinalIgnoreCase)) - { - // Don't flow these headers here - continue; - } - - requestMessage.Headers.Add(headerName, context.Request.Headers[headerName]); - } - - LogRequestActivity(requestMessage); - - return requestMessage; - } - - private void LogRequest(DateTime startTimeUtc) - { - var stopTimeUtc = DateTime.UtcNow; - //var buffer = new StringBuilder(); - //buffer.Append($"{startTimeUtc.ToString("s", CultureInfo.InvariantCulture)}, "); - //buffer.Append($"\"{context.Request.HttpMethod} {context.Request.Url.GetComponents(UriComponents.PathAndQuery, UriFormat.Unescaped)}\", "); - //buffer.Append($"{(int)context.Response.StatusCode}, "); - //buffer.Append($"{(int)stopTimeUtc.Subtract(startTimeUtc).TotalMilliseconds}"); - //Console.WriteLine(buffer); - - Console.WriteLine("...and back {0:N0} ms...", stopTimeUtc.Subtract(startTimeUtc).TotalMilliseconds); - Console.WriteLine(""); - } - - private void LogRequestActivity(HttpRequestMessage requestMessage) - { - var content = requestMessage.Content.ReadAsStringAsync().Result; - Console.ForegroundColor = ConsoleColor.Yellow; - - var formatted = content; - if (IsValidJson(formatted)) - { - var s = new JsonSerializerSettings - { - Formatting = Formatting.Indented - }; - - dynamic o = JsonConvert.DeserializeObject(content); - formatted = JsonConvert.SerializeObject(o, s); - } - - Console.WriteLine(formatted); - Console.ResetColor(); - } - - private static void LogException(Exception ex) - { - Console.ForegroundColor = ConsoleColor.Red; - Console.WriteLine(ex); - Console.WriteLine(""); - Console.ResetColor(); - } - - private static bool IsValidJson(string strInput) - { - strInput = strInput.Trim(); - if ((!strInput.StartsWith("{") || !strInput.EndsWith("}")) && (!strInput.StartsWith("[") || !strInput.EndsWith("]"))) - { - return false; - } - - try - { - JToken.Parse(strInput); - return true; - } - catch - { - return false; - } - } - } -} \ No newline at end of file diff --git a/Src/ServiceBusRelayUtilNetCore/Program.cs b/Src/ServiceBusRelayUtilNetCore/Program.cs deleted file mode 100644 index e4ba1b7..0000000 --- a/Src/ServiceBusRelayUtilNetCore/Program.cs +++ /dev/null @@ -1,53 +0,0 @@ -using System; -using System.IO; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Extensions.Configuration; - -// https://docs.microsoft.com/en-us/azure/service-bus-relay/service-bus-relay-rest-tutorial -// https://github.com/Azure/azure-relay-dotnet -// https://docs.microsoft.com/en-us/azure/service-bus-relay/relay-hybrid-connections-http-requests-dotnet-get-started - -// This is what I think I need -// https://github.com/Azure/azure-relay/blob/master/samples/hybrid-connections/dotnet/hcreverseproxy/README.md -// https://github.com/Azure/azure-relay/tree/master/samples/hybrid-connections/dotnet/hcreverseproxy - -// Publish -// https://stackoverflow.com/questions/44074121/build-net-core-console-application-to-output-an-exe -// https://docs.microsoft.com/en-us/dotnet/core/rid-catalog - -namespace GaboG.ServiceBusRelayUtilNetCore -{ - public class Program - { - public static IConfiguration Configuration { get; set; } - - public static void Main(string[] args) - { - var builder = new ConfigurationBuilder() - .SetBasePath(AppDomain.CurrentDomain.BaseDirectory) - .AddJsonFile("appsettings.json", true, true) - .AddEnvironmentVariables(); - Configuration = builder.Build(); - - RunAsync().GetAwaiter().GetResult(); - } - - static async Task RunAsync() - { - var relayNamespace = Configuration["RelayNamespace"]; - var connectionName = Configuration["RelayName"]; - var keyName = Configuration["PolicyName"]; - var key = Configuration["PolicyKey"]; - var targetServiceAddress = new Uri(Configuration["TargetServiceAddress"]); - - var hybridProxy = new DispatcherService(relayNamespace, connectionName, keyName, key, targetServiceAddress); - - await hybridProxy.OpenAsync(CancellationToken.None); - - Console.ReadLine(); - - await hybridProxy.CloseAsync(CancellationToken.None); - } - } -} \ No newline at end of file diff --git a/Src/ServiceBusRelayUtilNetCore/ServiceBusRelayUtilNetCore.csproj b/Src/ServiceBusRelayUtilNetCore/ServiceBusRelayUtilNetCore.csproj deleted file mode 100644 index 2d26a18..0000000 --- a/Src/ServiceBusRelayUtilNetCore/ServiceBusRelayUtilNetCore.csproj +++ /dev/null @@ -1,29 +0,0 @@ - - - - Exe - netcoreapp2.1 - App.ico - GaboG.ServiceBusRelayUtilNetCore - - - - - - - - - - - Always - - - - - - - - - - - diff --git a/Src/ServiceBusRelayUtilNetCore/appsettings.json b/Src/ServiceBusRelayUtilNetCore/appsettings.json deleted file mode 100644 index 6429582..0000000 --- a/Src/ServiceBusRelayUtilNetCore/appsettings.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "RelayNamespace": "[Your Namespace].servicebus.windows.net", - "RelayName": "[Your Relay Name]", - "PolicyName": "[Your Shared Access Policy Name]", - "PolicyKey": "[Your Policy's Key]", - "TargetServiceAddress": "http://localhost:[PORT]" -} diff --git a/WMT-Bot.png b/WMT-Bot.png new file mode 100644 index 0000000000000000000000000000000000000000..eacb553b359b9834a1e41d39a930eee6b79543d7 GIT binary patch literal 61074 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 literal 0 HcmV?d00001 diff --git a/features/dannyg b/features/dannyg new file mode 160000 index 0000000..0896658 --- /dev/null +++ b/features/dannyg @@ -0,0 +1 @@ +Subproject commit 08966582e364ed8863c0aab67267c0c177d4b6c8 diff --git a/Src/ServiceBusRelayUtilNetCore/Extensions/StringEx.cs b/src/Microsoft.HybridConnections.Core/Extensions/StringEx.cs similarity index 92% rename from Src/ServiceBusRelayUtilNetCore/Extensions/StringEx.cs rename to src/Microsoft.HybridConnections.Core/Extensions/StringEx.cs index e11dc7c..78a63ca 100644 --- a/Src/ServiceBusRelayUtilNetCore/Extensions/StringEx.cs +++ b/src/Microsoft.HybridConnections.Core/Extensions/StringEx.cs @@ -3,7 +3,7 @@ using System; -namespace GaboG.ServiceBusRelayUtilNetCore.Extensions +namespace Microsoft.ServiceBusBotRelay.Core.Extensions { public static class StringEx { diff --git a/src/Microsoft.HybridConnections.Core/Extensions/WebHeaderCollectionExtensions.cs b/src/Microsoft.HybridConnections.Core/Extensions/WebHeaderCollectionExtensions.cs new file mode 100644 index 0000000..7d0aadb --- /dev/null +++ b/src/Microsoft.HybridConnections.Core/Extensions/WebHeaderCollectionExtensions.cs @@ -0,0 +1,16 @@ +using System.Collections.Generic; + +namespace Microsoft.HybridConnections.Core.Extensions +{ + public static class WebHeaderCollectionExtensions + { + public static IEnumerable> GetHeaders(this System.Net.WebHeaderCollection webHeaderCollection) + { + string[] keys = webHeaderCollection.AllKeys; + for (int i = 0; i < keys.Length; i++) + { + yield return new KeyValuePair(keys[i], webHeaderCollection[keys[i]]); + } + } + } +} diff --git a/src/Microsoft.HybridConnections.Core/HttpListener.cs b/src/Microsoft.HybridConnections.Core/HttpListener.cs new file mode 100644 index 0000000..5db67ad --- /dev/null +++ b/src/Microsoft.HybridConnections.Core/HttpListener.cs @@ -0,0 +1,203 @@ +using Microsoft.Azure.Relay; +using Microsoft.ServiceBusBotRelay.Core.Extensions; +using System; +using System.Net; +using System.Net.Http; +using System.Net.Http.Headers; +using System.Threading; +using System.Threading.Tasks; + +namespace Microsoft.HybridConnections.Core +{ + public class HttpListener + { + private readonly HttpClient _httpClient; + private readonly string _hybridConnectionSubPath; + private readonly HybridConnectionListener _listener; + private readonly string _targetServiceAddress; + + public CancellationTokenSource CTS { get; set; } + + ///

+ /// The constructor + /// + /// + /// + /// + /// + /// + public HttpListener(string relayNamespace, string connectionName, string keyName, string key, string targetServiceAddress, CancellationTokenSource cts) + { + _targetServiceAddress = targetServiceAddress; + CTS = cts; + + var tokenProvider = TokenProvider.CreateSharedAccessSignatureTokenProvider(keyName, key); + _listener = new HybridConnectionListener(new Uri($"sb://{relayNamespace}/{connectionName}"), tokenProvider); + + // Subscribe to the status events. + _listener.Connecting += (o, e) => { Console.WriteLine("Connecting"); }; + _listener.Offline += (o, e) => { Console.WriteLine("Offline"); }; + _listener.Online += (o, e) => { Console.WriteLine("Online"); }; + + _httpClient = new HttpClient + { + BaseAddress = new Uri(targetServiceAddress, UriKind.RelativeOrAbsolute) + }; + _httpClient.DefaultRequestHeaders.ExpectContinue = false; + + _hybridConnectionSubPath = _listener.Address.AbsolutePath.EnsureEndsWith("/"); + + Console.WriteLine($"Http Listener: Http Relay Listener is listening on \n\r\t{_listener.Address}\n\rand routing requests to \n\r\t{_targetServiceAddress}\n\r"); + } + + + /// + /// The constructor + /// + /// + /// + /// + /// + public HttpListener(string relayNamespace, string connectionName, string keyName, string key, CancellationTokenSource cts) + { + CTS = cts; + + var tokenProvider = TokenProvider.CreateSharedAccessSignatureTokenProvider(keyName, key); + _listener = new HybridConnectionListener(new Uri($"sb://{relayNamespace}/{connectionName}"), tokenProvider); + + // Subscribe to the status events. + _listener.Connecting += (o, e) => { Console.WriteLine("Connecting"); }; + _listener.Offline += (o, e) => { Console.WriteLine("Offline"); }; + _listener.Online += (o, e) => { Console.WriteLine("Online"); }; + + Console.WriteLine($"Http Listener: Http Relay Listener is listening on \n\r\t{_listener.Address}\n\rand routing requests to Websocket connection\n\r"); + } + + + + /// + // Opening the listener establishes the control channel to + // the Azure Relay service. The control channel is continuously + // maintained, and is reestablished when connectivity is disrupted. + /// + /// + /// + public async Task OpenAsync(Action relayHandler) + { + _listener.RequestHandler = relayHandler; + await _listener.OpenAsync(CTS.Token); + + Console.WriteLine("Press [Enter] to exit"); + + // Provide callback for a cancellation token that will close the listener. + CTS.Token.Register(() => _listener.CloseAsync(CancellationToken.None)); + } + + /// + /// Starts listening to the messages + /// + /// + public async Task ListenAsync() + { + // Start a new thread that will continuously read the console. + await Console.In.ReadLineAsync().ContinueWith((s) => { CTS.Cancel(); }); + + // Close the listener + await _listener.CloseAsync(); + } + + + /// + /// Closes the listener after you exit the processing loop + /// + /// + /// + public Task CloseAsync() + { + _httpClient.Dispose(); + return _listener.CloseAsync(CTS.Token); + } + + + /// + /// Creates and sends the Http Request message + /// + /// + /// + public async Task SendHttpRequestMessageAsync(RelayedHttpListenerContext context) + { + var requestMessage = new HttpRequestMessage(); + if (context.Request.HasEntityBody) + { + requestMessage.Content = new StreamContent(context.Request.InputStream); + var contentType = context.Request.Headers[HttpRequestHeader.ContentType]; + if (!string.IsNullOrEmpty(contentType)) + { + requestMessage.Content.Headers.ContentType = MediaTypeHeaderValue.Parse(contentType); + } + } + + var relativePath = context.Request.Url.GetComponents(UriComponents.PathAndQuery, UriFormat.Unescaped); + relativePath = relativePath.Replace(_hybridConnectionSubPath, string.Empty, StringComparison.OrdinalIgnoreCase); + requestMessage.RequestUri = new Uri(relativePath, UriKind.RelativeOrAbsolute); + requestMessage.Method = new HttpMethod(context.Request.HttpMethod); + + foreach (var headerName in context.Request.Headers.AllKeys) + { + if (string.Equals(headerName, "Host", StringComparison.OrdinalIgnoreCase) || + string.Equals(headerName, "Content-Type", StringComparison.OrdinalIgnoreCase)) + { + // Don't flow these headers here + continue; + } + + requestMessage.Headers.Add(headerName, context.Request.Headers[headerName]); + } + + await Logger.LogRequestActivityAsync(requestMessage); + + //var requestMessageSer = await RelayedHttpListenerRequestSerializer.SerializeAsync(requestMessage); + //var deserializedRequestMessage = RelayedHttpListenerRequestSerializer.Deserialize(requestMessageSer); + + // Send the request message via Http + return await _httpClient.SendAsync(requestMessage); + } + + + /// + /// Sends the response to the server + /// + /// + /// + /// + public async Task SendResponseAsync(RelayedHttpListenerContext context, HttpResponseMessage responseMessage) + { + context.Response.StatusCode = responseMessage.StatusCode; + context.Response.StatusDescription = responseMessage.ReasonPhrase; + foreach (var header in responseMessage.Headers) + { + if (string.Equals(header.Key, "Transfer-Encoding")) + { + continue; + } + + context.Response.Headers.Add(header.Key, string.Join(",", header.Value)); + } + + var responseStream = await responseMessage.Content.ReadAsStreamAsync(); + await responseStream.CopyToAsync(context.Response.OutputStream); + } + + /// + /// Sends the error response + /// + /// + /// + public void SendErrorResponse(Exception ex, RelayedHttpListenerContext context) + { + context.Response.StatusCode = HttpStatusCode.InternalServerError; + context.Response.StatusDescription = $"Http Listener: Internal Server Error: {ex.GetType().FullName}: {ex.Message}"; + context.Response.Close(); + } + } +} diff --git a/src/Microsoft.HybridConnections.Core/Logger.cs b/src/Microsoft.HybridConnections.Core/Logger.cs new file mode 100644 index 0000000..e290c71 --- /dev/null +++ b/src/Microsoft.HybridConnections.Core/Logger.cs @@ -0,0 +1,117 @@ +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using System; +using System.Net.Http; +using System.Threading.Tasks; + +namespace Microsoft.HybridConnections.Core +{ + public static class Logger + { + + /// + /// Logs the request's starting time + /// + /// + public static void LogRequest(DateTime startTimeUtc) + { + var stopTimeUtc = DateTime.UtcNow; + //var buffer = new StringBuilder(); + //buffer.Append($"{startTimeUtc.ToString("s", CultureInfo.InvariantCulture)}, "); + //buffer.Append($"\"{context.Request.HttpMethod} {context.Request.Url.GetComponents(UriComponents.PathAndQuery, UriFormat.Unescaped)}\", "); + //buffer.Append($"{(int)context.Response.StatusCode}, "); + //buffer.Append($"{(int)stopTimeUtc.Subtract(startTimeUtc).TotalMilliseconds}"); + //Console.WriteLine(buffer); + + Console.WriteLine("...and back {0:N0} ms...", stopTimeUtc.Subtract(startTimeUtc).TotalMilliseconds); + Console.WriteLine(""); + } + + + /// + /// Logs the request activity + /// + /// + public static async Task LogRequestActivityAsync(HttpRequestMessage requestMessage) + { + if (requestMessage.Content == null) return false; + + try + { + var content = await requestMessage.Content.ReadAsStringAsync(); + Console.ForegroundColor = ConsoleColor.Yellow; + + var formatted = content; + if (IsValidJson(formatted)) + { + var s = new JsonSerializerSettings + { + Formatting = Formatting.Indented + }; + + dynamic o = JsonConvert.DeserializeObject(content); + formatted = JsonConvert.SerializeObject(o, s); + } + + Console.WriteLine(formatted); + Console.ResetColor(); + + return true; + } + catch (Exception) + { + return false; + } + } + + /// + /// Logs the exception + /// + /// + public static void LogException(Exception ex) + { + Console.ForegroundColor = ConsoleColor.Red; + Console.WriteLine(ex); + Console.WriteLine(""); + Console.ResetColor(); + } + + + /// + /// Logs the message + /// + /// + public static void LogMessage(string message) + { + Console.ForegroundColor = ConsoleColor.Blue; + Console.WriteLine(message); + Console.WriteLine(""); + Console.ResetColor(); + } + + /// + /// Validates the Json string + /// + /// + /// + private static bool IsValidJson(string strInput) + { + strInput = strInput.Trim(); + if ((!strInput.StartsWith("{") || !strInput.EndsWith("}")) && (!strInput.StartsWith("[") || !strInput.EndsWith("]"))) + { + return false; + } + + try + { + JToken.Parse(strInput); + return true; + } + catch + { + return false; + } + } + + } +} diff --git a/src/Microsoft.HybridConnections.Core/Microsoft.HybridConnections.Core.csproj b/src/Microsoft.HybridConnections.Core/Microsoft.HybridConnections.Core.csproj new file mode 100644 index 0000000..758d114 --- /dev/null +++ b/src/Microsoft.HybridConnections.Core/Microsoft.HybridConnections.Core.csproj @@ -0,0 +1,12 @@ + + + + net5.0 + + + + + + + + diff --git a/src/Microsoft.HybridConnections.Core/RelayedHttpListenerRequestSerializer.cs b/src/Microsoft.HybridConnections.Core/RelayedHttpListenerRequestSerializer.cs new file mode 100644 index 0000000..d23aa67 --- /dev/null +++ b/src/Microsoft.HybridConnections.Core/RelayedHttpListenerRequestSerializer.cs @@ -0,0 +1,141 @@ +using Microsoft.Azure.Relay; +using Microsoft.HybridConnections.Core.Extensions; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using System; +using System.Collections.Generic; +using System.Net.Http; +using System.Threading.Tasks; + +namespace Microsoft.HybridConnections.Core +{ + public static class RelayedHttpListenerRequestSerializer + { + /// + /// Serialize RelayedHttpListenerRequest + /// + /// + /// + public static async Task SerializeAsync(RelayedHttpListenerRequest request) + { + var requestMessage = new RequestMessage + { + Content = await (new StreamContent(request.InputStream)).ReadAsByteArrayAsync(), + HttpMethod = request.HttpMethod, + RemoteEndPoint = request.RemoteEndPoint.Address.ToString(), + Url = request.Url.AbsoluteUri, + HybridConnectionScheme = request.Url.Scheme, + HybridConnectionName = request.Url.Segments[1].Trim('/') + }; + + requestMessage.Headers = requestMessage.Headers ?? new List>>(); + foreach (var header in request.Headers.GetHeaders()) + { + ((List>>)requestMessage.Headers) + .Add(new KeyValuePair>(header.Key, new List { header.Value })); + + } + + return JsonConvert.SerializeObject(requestMessage); + } + + /// + /// Serialize HttpRequestMessage + /// + /// + /// + public static async Task SerializeAsync(HttpRequestMessage request) + { + var requestMessage = new RequestMessage + { + Content = await request.Content.ReadAsByteArrayAsync(), + HttpMethod = request.Method.Method, + RemoteEndPoint = request.RequestUri.ToString(), + Url = request.RequestUri.ToString() + }; + + // populate Headers + foreach (var header in request.Headers) + { + if (string.Equals(header.Key, "Host", StringComparison.OrdinalIgnoreCase) || + string.Equals(header.Key, "Content-Type", StringComparison.OrdinalIgnoreCase)) + { + // Don't flow these headers here + continue; + } + requestMessage.Headers = requestMessage.Headers ?? new List>>(); + ((List>>)requestMessage.Headers) + .Add(new KeyValuePair>(header.Key, header.Value)); + } + + return JsonConvert.SerializeObject(requestMessage); + } + + /// + /// Deserialize the JSON into the HttpRequestMessage + /// + /// + /// + public static HttpRequestMessage Deserialize(string jsonObject) + { + var serializedRequestMessage = JsonConvert.DeserializeObject(jsonObject); + + var requestMessage = new HttpRequestMessage(); + // Get message content + requestMessage.Content = new ByteArrayContent(serializedRequestMessage.Content); + + // populate Headers + foreach (var header in serializedRequestMessage.Headers) + { + if (string.Equals(header.Key, "Host", StringComparison.OrdinalIgnoreCase) || + string.Equals(header.Key, "Content-Type", StringComparison.OrdinalIgnoreCase)) + { + // Don't flow these headers here + continue; + } + requestMessage.Headers.Add(header.Key, header.Value); + } + + requestMessage.Method = new HttpMethod(serializedRequestMessage.HttpMethod); + requestMessage.RequestUri = string.IsNullOrEmpty(serializedRequestMessage.HybridConnectionScheme) ? + new Uri(serializedRequestMessage.Url, UriKind.RelativeOrAbsolute) : + GenerateUriFromSbUrl(serializedRequestMessage.Url, serializedRequestMessage.HybridConnectionScheme, serializedRequestMessage.HybridConnectionName); + + return requestMessage; + + } + + /// + /// Validates the Json string + /// + /// + /// + private static bool IsValidJson(string strInput) + { + strInput = strInput.Trim(); + if ((!strInput.StartsWith("{") || !strInput.EndsWith("}")) && (!strInput.StartsWith("[") || !strInput.EndsWith("]"))) + { + return false; + } + + try + { + JToken.Parse(strInput); + return true; + } + catch + { + return false; + } + } + + + private static Uri GenerateUriFromSbUrl(string sbUrl, string scheme, string connectionName) + { + var httpUri = new Uri(sbUrl.Replace($"{scheme}://", "http://")); + var relativePath = httpUri.GetComponents(UriComponents.PathAndQuery, UriFormat.Unescaped); + relativePath = relativePath.Replace($"/{connectionName}/", string.Empty, StringComparison.OrdinalIgnoreCase); + return new Uri(relativePath, UriKind.RelativeOrAbsolute); + } + } +} diff --git a/src/Microsoft.HybridConnections.Core/RequestMessage.cs b/src/Microsoft.HybridConnections.Core/RequestMessage.cs new file mode 100644 index 0000000..07c0273 --- /dev/null +++ b/src/Microsoft.HybridConnections.Core/RequestMessage.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; + +namespace Microsoft.HybridConnections.Core +{ + [Serializable] + public class RequestMessage + { + public IEnumerable>> Headers { get; set; } + public byte[] Content { get; set; } + public string HttpMethod { get; set; } + public string RemoteEndPoint { get; set; } + public string Url { get; set; } + public string HybridConnectionScheme { get; set; } + public string HybridConnectionName { get; set; } + } +} diff --git a/src/Microsoft.HybridConnections.Core/WebSocketListener.cs b/src/Microsoft.HybridConnections.Core/WebSocketListener.cs new file mode 100644 index 0000000..10d4c61 --- /dev/null +++ b/src/Microsoft.HybridConnections.Core/WebSocketListener.cs @@ -0,0 +1,107 @@ +using Microsoft.Azure.Relay; +using Microsoft.ServiceBusBotRelay.Core.Extensions; +using System; +using System.IO; +using System.Net; +using System.Net.Http; +using System.Net.Http.Headers; +using System.Threading; +using System.Threading.Tasks; + +namespace Microsoft.HybridConnections.Core +{ + public class WebSocketListener + { + private readonly HybridConnectionListener _listener; + + public CancellationTokenSource CTS { get; set; } + + /// + /// The constructor + /// + /// + /// + /// + /// + /// + public WebSocketListener(string relayNamespace, string connectionName, string keyName, string key, CancellationTokenSource cts) + { + CTS = cts; + + var tokenProvider = TokenProvider.CreateSharedAccessSignatureTokenProvider(keyName, key); + _listener = new HybridConnectionListener(new Uri($"sb://{relayNamespace}/{connectionName}"), tokenProvider); + + // Subscribe to the status events. + _listener.Connecting += (o, e) => { Console.WriteLine("Connecting"); }; + _listener.Offline += (o, e) => { Console.WriteLine("Offline"); }; + _listener.Online += (o, e) => { Console.WriteLine("Online"); }; + } + + /// + // Opening the listener establishes the control channel to + // the Azure Relay service. The control channel is continuously + // maintained, and is reestablished when connectivity is disrupted. + /// + /// + public async Task OpenAsync() + { + await _listener.OpenAsync(CTS.Token); + Console.WriteLine($"Websocket Listener: Websocket Listener is listening on \n\r\t{_listener.Address}\n\r"); + Console.WriteLine("Press [Enter] to exit"); + + // trigger cancellation when the user presses enter. Not awaited. +#pragma warning disable CS4014 + CTS.Token.Register(() => _listener.CloseAsync(CancellationToken.None)); + Task.Run(() => Console.In.ReadLineAsync().ContinueWith((s) => { CTS.Cancel(); })); +#pragma warning restore CS4014 + } + + + /// + /// Listener is ready to accept connections after it creates an outbound WebSocket connection + /// + /// + /// + public async Task ListenAsync(Action relayProcessHandler) + { + while (true) + { + // Accept the next available, pending connection request. + // Shutting down the listener will allow a clean exit with + // this method returning null + var relayConnection = await _listener.AcceptConnectionAsync(); + if (relayConnection == null) + { + break; + } + + // The following task processes a new session. We turn off the + // warning here since we intentially don't 'await' + // this call, but rather let the task handling the connection + // run out on its own without holding for it +#pragma warning disable CS4014 + Task.Run(() => + { + // Initiate the connection and process messages + relayProcessHandler(relayConnection, CTS); + }); +#pragma warning restore CS4014 + } + + // close the listener after we exit the processing loop + await _listener.CloseAsync(CTS.Token); + } + + + + /// + /// Closes the listener after you exit the processing loop + /// + /// + /// + public Task CloseAsync() + { + return _listener.CloseAsync(CTS.Token); + } + } +} diff --git a/src/Microsoft.HybridConnections.Listener/Microsoft.HybridConnections.Listener.csproj b/src/Microsoft.HybridConnections.Listener/Microsoft.HybridConnections.Listener.csproj new file mode 100644 index 0000000..87747c8 --- /dev/null +++ b/src/Microsoft.HybridConnections.Listener/Microsoft.HybridConnections.Listener.csproj @@ -0,0 +1,33 @@ + + + + Exe + net5.0 + Microsoft.HybridConnections.Listener + + + + + + + + + PreserveNewest + + + + + + + + + + + + + + + + + + diff --git a/src/Microsoft.HybridConnections.Listener/Program.cs b/src/Microsoft.HybridConnections.Listener/Program.cs new file mode 100644 index 0000000..5d31b38 --- /dev/null +++ b/src/Microsoft.HybridConnections.Listener/Program.cs @@ -0,0 +1,204 @@ +using Microsoft.Azure.Relay; +using Microsoft.Extensions.Configuration; +using Microsoft.HybridConnections.Core; +using System; +using System.IO; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; + +namespace Microsoft.HybridConnections.Listener +{ + /// + /// Main Console App class + /// + public static class Program + { + public static IConfiguration Configuration { get; set; } + public static HttpListener HttpRelayListener { get; set; } + + public static WebSocketListener WebSocketListener { get; set; } + + private static string TargetHttpRelay; + private static bool IsVerboseLogs; + + public static void Main(string[] args) + { + var builder = new ConfigurationBuilder() + .SetBasePath(AppDomain.CurrentDomain.BaseDirectory) + .AddJsonFile("appsettings.json", false, true) + .AddEnvironmentVariables(); + Configuration = builder.Build(); + + RunAsync().GetAwaiter().GetResult(); + } + + private static async Task RunAsync() + { + try + { + var relayNamespace = $"{Configuration["Relay:Namespace"]}.servicebus.windows.net"; + var connectionName = Configuration["Relay:ConnectionName"]; + var keyName = Configuration["Relay:PolicyName"]; + var key = Configuration["Relay:PolicyKey"]; + var IsHttpRelayMode = Configuration["Relay:Mode"].Equals("http", StringComparison.CurrentCultureIgnoreCase); + + TargetHttpRelay = Configuration["Relay:TargetServiceAddress"]; + IsVerboseLogs = bool.Parse(Configuration["Relay:Log:Verbose"]); + + if (IsHttpRelayMode) + { + // Create the Http hybrid proxy listener + HttpRelayListener = new HttpListener(relayNamespace, connectionName, keyName, key, TargetHttpRelay, new CancellationTokenSource()); + + // Opening the listener establishes the control channel to + // the Azure Relay service. The control channel is continuously + // maintained, and is reestablished when connectivity is disrupted. + await HttpRelayListener.OpenAsync(ProcessHttpMessagesHandler); + Console.WriteLine("Http Server listening"); + + // Start a new thread that will continuously read the console. + await HttpRelayListener.ListenAsync(); + + // Return true, if the cancellation was requested, otherwise - false + return HttpRelayListener.CTS.IsCancellationRequested; + } + else // WebSockets Relay Mode + { + // Create the WebSockets hybrid proxy listener + var webSocketListener = new WebSocketListener(relayNamespace, connectionName, keyName, key, new CancellationTokenSource()); + + // Opening the listener establishes the control channel to + // the Azure Relay service. The control channel is continuously + // maintained, and is reestablished when connectivity is disrupted. + await webSocketListener.OpenAsync(); + Console.WriteLine("WebSocket Server listening"); + + // Start a new thread that will continuously read the from the websocket and write to the target Http endpoint. + await webSocketListener.ListenAsync(ProcessWebsocketMessagesHandler); + + // Close Websocket connection + await webSocketListener.CloseAsync(); + + Console.WriteLine("Awaiting for new received messages over websocket connection..."); + + // Return true, if the cancellation was requested, otherwise - false + return webSocketListener.CTS.IsCancellationRequested; + } + } + catch (Exception e) + { + await Console.Error.WriteLineAsync(e.Message); + return true; + } + } + + /// + /// Listener Response Handler + /// + /// + static async void ProcessHttpMessagesHandler(RelayedHttpListenerContext context) + { + var startTimeUtc = DateTime.UtcNow; + + try + { + // Send the request message to the target listener + Console.WriteLine("Sending the request message to {0}...", TargetHttpRelay); + var responseMessage = await HttpRelayListener.SendHttpRequestMessageAsync(context); + + // Send the response message back to the caller + Console.WriteLine("Sending the response message to the context owner..."); + await HttpRelayListener.SendResponseAsync(context, responseMessage); + } + + catch (Exception ex) + { + Logger.LogException(ex); + HttpRelayListener.SendErrorResponse(ex, context); + } + finally + { + Logger.LogRequest(startTimeUtc); + // Confirm the response has been sent + context.Response.StatusCode = System.Net.HttpStatusCode.OK; + context.Response.StatusDescription = "OK"; + using (var sw = new StreamWriter(context.Response.OutputStream)) + { + sw.WriteLine("Response message has been sent"); + } + + // The context MUST be closed here + await context.Response.CloseAsync(); + } + } + + + /// + /// The method initiates the connection. + /// + /// + /// + static async void ProcessWebsocketMessagesHandler(HybridConnectionStream relayConnection, CancellationTokenSource cts) + { + Console.WriteLine("New Websocket session"); + // The connection is a relay fork. + // We put a stream reader on the input stream and a stream writer over to the target connection + // that allows us to read UTF-8 text data that comes from + // the sender and to write text to the target endpoint. + var reader = new StreamReader(relayConnection); + + Console.WriteLine("Awaiting for the input messages..."); + // Read a line of input until the end of the buffer + var data = await reader.ReadToEndAsync(); + + Console.WriteLine($"Received data of the {data.Length} bytes length over websocket connection."); + + // Deserialize the websocket data into HttpRequestMessage + var requestMessage = RelayedHttpListenerRequestSerializer.Deserialize(data); + + // Send the request message to the target listener + Console.WriteLine("Sending the request message to {0}...", TargetHttpRelay); + await SendHttpRequestAsync(requestMessage); + + // If there's no input data, signal that + // you will no longer send data on this connection. + await relayConnection.ShutdownAsync(cts.Token); + + Console.WriteLine("End web socket session"); + + // closing the connection from this end + await relayConnection.CloseAsync(cts.Token); + } + + + /// + /// Creates and sends the Stream message over Http Relay connection + /// + /// + /// + private static async Task SendHttpRequestAsync(HttpRequestMessage requestMessage) + { + try + { + // Send the request message via Http + using (var httpClient = new HttpClient { BaseAddress = new Uri(TargetHttpRelay, UriKind.RelativeOrAbsolute) }) + { + httpClient.DefaultRequestHeaders.ExpectContinue = false; + await httpClient.SendAsync(requestMessage); + } + } + catch (Exception e) + { + Console.Error.WriteLine(e); + throw; + } + + if (IsVerboseLogs) + { + // Log the activity message + await Logger.LogRequestActivityAsync(requestMessage); + } + } + } +} diff --git a/src/Microsoft.HybridConnections.Listener/appsettings.json b/src/Microsoft.HybridConnections.Listener/appsettings.json new file mode 100644 index 0000000..5998eb9 --- /dev/null +++ b/src/Microsoft.HybridConnections.Listener/appsettings.json @@ -0,0 +1,13 @@ +{ + "Relay": { + "Log": { + "Verbose": false + }, + "Namespace": "websocketrelay", + "ConnectionName": "websocketrelay", + "PolicyName": "SendReceiveSASPolicy", + "PolicyKey": "Z7/V1LJ/fsm4c621XXxrHWqVvHwJVPuhx38lLDX2jUY=", + "Mode": "websocket", + "TargetServiceAddress": "http://localhost:3978" + } +} \ No newline at end of file diff --git a/src/Microsoft.HybridConnections.Relay/Microsoft.HybridConnections.Relay.csproj b/src/Microsoft.HybridConnections.Relay/Microsoft.HybridConnections.Relay.csproj new file mode 100644 index 0000000..a0841a0 --- /dev/null +++ b/src/Microsoft.HybridConnections.Relay/Microsoft.HybridConnections.Relay.csproj @@ -0,0 +1,31 @@ + + + + Exe + net5.0 + + + + + + + + + PreserveNewest + + + + + + + + + + + + + + + + + diff --git a/src/Microsoft.HybridConnections.Relay/Program.cs b/src/Microsoft.HybridConnections.Relay/Program.cs new file mode 100644 index 0000000..aafb8b3 --- /dev/null +++ b/src/Microsoft.HybridConnections.Relay/Program.cs @@ -0,0 +1,175 @@ +using Microsoft.Azure.Relay; +using Microsoft.Extensions.Configuration; +using Microsoft.HybridConnections.Core; +using System; +using System.IO; +using System.Threading; +using System.Threading.Tasks; + +namespace Microsoft.HybridConnections.Relay +{ + class Program + { + public static HttpListener HttpRelayListener { get; set; } + + public static WebsocketClient WebsocketClient { get; set; } + + private static bool IsHttpRelayMode; + + private static string ListenerNamespace; + private static string ListenerConnectionName; + private static string ListenerKeyName; + private static string ListenerPolicyName; + private static string ListenerTargetAddress; + + private static string RelayNamespace; + private static string RelayConnectionName; + private static string RelayKeyName; + private static string RelayPolicyName; + + + static void Main(string[] args) + { + var builder = new ConfigurationBuilder() + .SetBasePath(AppDomain.CurrentDomain.BaseDirectory) + .AddJsonFile("appsettings.json", false, true) + .AddEnvironmentVariables(); + var configuration = builder.Build(); + + IsHttpRelayMode = configuration["Listener:Mode"].Equals("http", StringComparison.CurrentCultureIgnoreCase); + + ListenerNamespace = $"{configuration["Listener:Namespace"]}.servicebus.windows.net"; + ListenerConnectionName = configuration["Listener:ConnectionName"]; + ListenerKeyName = configuration["Listener:PolicyName"]; + ListenerPolicyName = configuration["Listener:PolicyKey"]; + ListenerTargetAddress = configuration["Listener:TargetServiceAddress"]; + + RelayNamespace = $"{configuration["Relay:Namespace"]}.servicebus.windows.net"; + RelayConnectionName = configuration["Relay:ConnectionName"]; + RelayKeyName = configuration["Relay:PolicyName"]; + RelayPolicyName = configuration["Relay:PolicyKey"]; + + var retryDelay = Int32.Parse(configuration["Relay:RetryFrequency"]); + + bool cancelConnection = false; + + do + { + cancelConnection = RunAsync().GetAwaiter().GetResult(); + Console.WriteLine($"Retrying to connect in {retryDelay} milliseconds..."); + Thread.Sleep(retryDelay); // sleep for configurable time (in millisec) and then re-try connection again + } while (!cancelConnection); + } + + static async Task RunAsync() + { + try + { + // Create the Http hybrid proxy listener + if (IsHttpRelayMode) + { + // Create Http bi-directional connection with the Http bound target + HttpRelayListener = new HttpListener( + ListenerNamespace, + ListenerConnectionName, + ListenerKeyName, + ListenerPolicyName, + ListenerTargetAddress, + new CancellationTokenSource()); + } + else + { + // Create Http listener one-way connection + HttpRelayListener = new HttpListener( + ListenerNamespace, + ListenerConnectionName, + ListenerKeyName, + ListenerPolicyName, + new CancellationTokenSource()); + } + + // Opening the listener establishes the control channel to + // the Azure Relay service. The control channel is continuously + // maintained, and is reestablished when connectivity is disrupted. + await HttpRelayListener.OpenAsync(ListenerRequestHandler); + Console.WriteLine("Http Server listening"); + + // Start a new thread that will continuously read messages over Http. + await HttpRelayListener.ListenAsync(); + } + catch (Exception e) + { + await Console.Error.WriteLineAsync(e.Message); + throw; + } + + return true; + } + + + + /// + /// Listener Response Handler + /// + /// + static async void ListenerRequestHandler(RelayedHttpListenerContext context) + { + var startTimeUtc = DateTime.UtcNow; + + try + { + if (IsHttpRelayMode) + { + // Send the request message to the target listener + Console.WriteLine("Sending the request message to {0}...", ListenerTargetAddress); + var responseMessage = await HttpRelayListener.SendHttpRequestMessageAsync(context); + + // Send the response status code back to the caller + Console.WriteLine("Return the response's status code back to the caller..."); + await HttpRelayListener.SendResponseAsync(context, responseMessage); + } + else + { + // We'll use the Websocket client to send the content to a Websocket connection listener + // Create the Websocket client + WebsocketClient = new WebsocketClient( + RelayNamespace, + RelayConnectionName, + RelayKeyName, + RelayPolicyName); + + // Initiate the connection + var relayConnection = await WebsocketClient.CreateConnectionAsync(); + if (!relayConnection) + { + // There is no websocket listener that is actively listening to our connections, let's try again later + return; + } + + // Listen to messages on the websocket connection + await WebsocketClient.RelayAsync(context); + + // Close Websocket connection + await WebsocketClient.CloseConnectionAsync(); + } + } + catch (Exception ex) + { + Logger.LogException(ex); + HttpRelayListener.SendErrorResponse(ex, context); + } + finally + { + Logger.LogRequest(startTimeUtc); + // Confirm the response has been sent + using (var sw = new StreamWriter(context.Response.OutputStream)) + { + sw.WriteLine("Response message has been sent"); + } + + // The context MUST be closed here + await context.Response.CloseAsync(); + } + } + } +} diff --git a/src/Microsoft.HybridConnections.Relay/WebSocketClient.csproj b/src/Microsoft.HybridConnections.Relay/WebSocketClient.csproj new file mode 100644 index 0000000..0f14913 --- /dev/null +++ b/src/Microsoft.HybridConnections.Relay/WebSocketClient.csproj @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/src/Microsoft.HybridConnections.Relay/WebsocketClient.cs b/src/Microsoft.HybridConnections.Relay/WebsocketClient.cs new file mode 100644 index 0000000..3b93e5d --- /dev/null +++ b/src/Microsoft.HybridConnections.Relay/WebsocketClient.cs @@ -0,0 +1,100 @@ +using Microsoft.Azure.Relay; +using Microsoft.HybridConnections.Core; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using System; +using System.IO; +using System.Net; +using System.Net.Http; +using System.Net.Http.Headers; +using System.Threading; +using System.Threading.Tasks; + +namespace Microsoft.HybridConnections.Relay +{ + public class WebsocketClient + { + private readonly HybridConnectionClient _client; + private HybridConnectionStream _relayConnection; + + /// + /// Constructor + /// + /// + /// + /// + /// + public WebsocketClient(string relayNamespace, string connectionName, string keyName, string key) + { + // Create a new hybrid connection client + var tokenProvider = TokenProvider.CreateSharedAccessSignatureTokenProvider(keyName, key); + _client = new HybridConnectionClient(new Uri($"sb://{relayNamespace}/{connectionName}"), tokenProvider); + } + + /// + /// Initiate the websocket connection + /// + /// + public async Task CreateConnectionAsync() + { + try + { + _relayConnection = await _client.CreateConnectionAsync(); + Console.WriteLine("Websocket Client: Websocket connection has been established succesfully."); + return true; + } + catch (EndpointNotFoundException) + { + Logger.LogMessage($"Websocket Client: There are no listeners connected for this endpoint: {_client.Address.AbsoluteUri}. Will retry later."); + return false; + } + catch (Exception e) + { + Logger.LogException(e); + return false; + } + } + + /// + /// Send buffer to the websocket listener + /// + /// + /// + public async Task SendAsync(string buffer) + { + using (var writer = new StreamWriter(_relayConnection) { AutoFlush = true }) + { + await writer.WriteAsync(buffer); + } + } + + /// + /// Relay the RelayedHttpListenerContext to the Websocket Listener + /// + /// + /// + public async Task RelayAsync(RelayedHttpListenerContext context) + { + try + { + var requestMessageSer = await RelayedHttpListenerRequestSerializer.SerializeAsync(context.Request); + // Send to the websocket listener + await SendAsync(requestMessageSer); + } + catch (Exception e) + { + Logger.LogException(e); + throw; + } + } + + /// + /// Close the websocket connection + /// + /// + public async Task CloseConnectionAsync() + { + await _relayConnection.CloseAsync(CancellationToken.None); + } + } +} diff --git a/src/Microsoft.HybridConnections.Relay/appsettings.json b/src/Microsoft.HybridConnections.Relay/appsettings.json new file mode 100644 index 0000000..3ca1c81 --- /dev/null +++ b/src/Microsoft.HybridConnections.Relay/appsettings.json @@ -0,0 +1,17 @@ +{ + "Listener": { + "Namespace": "websocketrelay", + "ConnectionName": "httprelay", + "PolicyName": "SendReceiveSASPolicy", + "PolicyKey": "ZCizLYS+Ynr9jvGnHHVFOFyClL140tZhJMXDCUVB1iA=", + "Mode": "websocket", + "TargetServiceAddress": "http://localhost:3978" + }, + "Relay": { + "Namespace": "websocketrelay", + "ConnectionName": "websocketrelay", + "PolicyName": "SendReceiveSASPolicy", + "PolicyKey": "Z7/V1LJ/fsm4c621XXxrHWqVvHwJVPuhx38lLDX2jUY=", + "RetryFrequency": 5000 + } +} \ No newline at end of file diff --git a/src/Microsoft.HybridConnections.sln b/src/Microsoft.HybridConnections.sln new file mode 100644 index 0000000..2ac02ee --- /dev/null +++ b/src/Microsoft.HybridConnections.sln @@ -0,0 +1,37 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.31410.357 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.HybridConnections.Listener", "Microsoft.HybridConnections.Listener\Microsoft.HybridConnections.Listener.csproj", "{B935AFB3-7DBC-463B-8BB7-C23FCBCC92CC}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.HybridConnections.Relay", "Microsoft.HybridConnections.Relay\Microsoft.HybridConnections.Relay.csproj", "{E9049515-08AE-4B2D-8F2E-DC19D820C865}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.HybridConnections.Core", "Microsoft.HybridConnections.Core\Microsoft.HybridConnections.Core.csproj", "{CA1B223D-4BB7-41B2-AE70-67BA527AB284}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {B935AFB3-7DBC-463B-8BB7-C23FCBCC92CC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B935AFB3-7DBC-463B-8BB7-C23FCBCC92CC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B935AFB3-7DBC-463B-8BB7-C23FCBCC92CC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B935AFB3-7DBC-463B-8BB7-C23FCBCC92CC}.Release|Any CPU.Build.0 = Release|Any CPU + {E9049515-08AE-4B2D-8F2E-DC19D820C865}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E9049515-08AE-4B2D-8F2E-DC19D820C865}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E9049515-08AE-4B2D-8F2E-DC19D820C865}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E9049515-08AE-4B2D-8F2E-DC19D820C865}.Release|Any CPU.Build.0 = Release|Any CPU + {CA1B223D-4BB7-41B2-AE70-67BA527AB284}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CA1B223D-4BB7-41B2-AE70-67BA527AB284}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CA1B223D-4BB7-41B2-AE70-67BA527AB284}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CA1B223D-4BB7-41B2-AE70-67BA527AB284}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {2C96A03F-F825-402A-B109-0F1FC60BA3CE} + EndGlobalSection +EndGlobal From d9156cb0a5232c3b056c67309d8a38e438424de0 Mon Sep 17 00:00:00 2001 From: Danny Garber Date: Thu, 22 Jul 2021 01:51:10 -0400 Subject: [PATCH 2/4] Delete appsettings.json --- .../appsettings.json | 17 ----------------- 1 file changed, 17 deletions(-) delete mode 100644 src/Microsoft.HybridConnections.Relay/appsettings.json diff --git a/src/Microsoft.HybridConnections.Relay/appsettings.json b/src/Microsoft.HybridConnections.Relay/appsettings.json deleted file mode 100644 index 3ca1c81..0000000 --- a/src/Microsoft.HybridConnections.Relay/appsettings.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "Listener": { - "Namespace": "websocketrelay", - "ConnectionName": "httprelay", - "PolicyName": "SendReceiveSASPolicy", - "PolicyKey": "ZCizLYS+Ynr9jvGnHHVFOFyClL140tZhJMXDCUVB1iA=", - "Mode": "websocket", - "TargetServiceAddress": "http://localhost:3978" - }, - "Relay": { - "Namespace": "websocketrelay", - "ConnectionName": "websocketrelay", - "PolicyName": "SendReceiveSASPolicy", - "PolicyKey": "Z7/V1LJ/fsm4c621XXxrHWqVvHwJVPuhx38lLDX2jUY=", - "RetryFrequency": 5000 - } -} \ No newline at end of file From bf455f3465a98aafcb24eb64b7f9aef6e8da4c0a Mon Sep 17 00:00:00 2001 From: Danny Garber Date: Thu, 22 Jul 2021 01:51:56 -0400 Subject: [PATCH 3/4] Completed NetPassage client app --- .gitignore | 1 + docs/images/passage.png | Bin 0 -> 125909 bytes docs/passage.drawio | 1 + features/dannyg | 1 - .../HttpListener.cs | 160 ++++---- .../Logger.cs | 102 +++-- .../WebSocketListener.cs | 11 +- .../Program.cs | 204 ---------- .../appsettings.json | 13 - .../Program.cs | 110 +++--- .../WebsocketClient.cs | 7 +- .../appsettings.json | 4 +- .../appsettings.json.template | 19 + src/Microsoft.HybridConnections.sln | 12 +- .../NetPassage.csproj} | 10 +- src/NetPassage/NetPassage.json.template | 19 + src/NetPassage/Program.cs | 352 ++++++++++++++++++ src/NetPassage/appsettings.json.template | 10 + 18 files changed, 635 insertions(+), 401 deletions(-) create mode 100644 docs/images/passage.png create mode 100644 docs/passage.drawio delete mode 160000 features/dannyg delete mode 100644 src/Microsoft.HybridConnections.Listener/Program.cs delete mode 100644 src/Microsoft.HybridConnections.Listener/appsettings.json create mode 100644 src/Microsoft.HybridConnections.Relay/appsettings.json.template rename src/{Microsoft.HybridConnections.Listener/Microsoft.HybridConnections.Listener.csproj => NetPassage/NetPassage.csproj} (76%) create mode 100644 src/NetPassage/NetPassage.json.template create mode 100644 src/NetPassage/Program.cs create mode 100644 src/NetPassage/appsettings.json.template diff --git a/.gitignore b/.gitignore index 940794e..6160e9e 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,7 @@ *.user *.userosscache *.sln.docstates +*.json # User-specific files (MonoDevelop/Xamarin Studio) *.userprefs diff --git a/docs/images/passage.png b/docs/images/passage.png new file mode 100644 index 0000000000000000000000000000000000000000..912460aa787bcbd2262a4140688227e311ea3d2e GIT binary patch literal 125909 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 TOS}N#00dG|fXkQ3ng#z4?!pF^ literal 0 HcmV?d00001 diff --git a/docs/passage.drawio b/docs/passage.drawio new file mode 100644 index 0000000..a384d59 --- /dev/null +++ b/docs/passage.drawio @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/features/dannyg b/features/dannyg deleted file mode 160000 index 0896658..0000000 --- a/features/dannyg +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 08966582e364ed8863c0aab67267c0c177d4b6c8 diff --git a/src/Microsoft.HybridConnections.Core/HttpListener.cs b/src/Microsoft.HybridConnections.Core/HttpListener.cs index 5db67ad..ba64e3f 100644 --- a/src/Microsoft.HybridConnections.Core/HttpListener.cs +++ b/src/Microsoft.HybridConnections.Core/HttpListener.cs @@ -1,5 +1,4 @@ using Microsoft.Azure.Relay; -using Microsoft.ServiceBusBotRelay.Core.Extensions; using System; using System.Net; using System.Net.Http; @@ -11,10 +10,8 @@ namespace Microsoft.HybridConnections.Core { public class HttpListener { - private readonly HttpClient _httpClient; - private readonly string _hybridConnectionSubPath; + private readonly HttpClient _httpClient = null; private readonly HybridConnectionListener _listener; - private readonly string _targetServiceAddress; public CancellationTokenSource CTS { get; set; } @@ -26,54 +23,110 @@ public class HttpListener /// /// /// - public HttpListener(string relayNamespace, string connectionName, string keyName, string key, string targetServiceAddress, CancellationTokenSource cts) + /// + /// + public HttpListener(string relayNamespace, string connectionName, string keyName, string key, string targetServiceAddress, Action eventHandler, CancellationTokenSource cts) { - _targetServiceAddress = targetServiceAddress; CTS = cts; var tokenProvider = TokenProvider.CreateSharedAccessSignatureTokenProvider(keyName, key); _listener = new HybridConnectionListener(new Uri($"sb://{relayNamespace}/{connectionName}"), tokenProvider); // Subscribe to the status events. - _listener.Connecting += (o, e) => { Console.WriteLine("Connecting"); }; - _listener.Offline += (o, e) => { Console.WriteLine("Offline"); }; - _listener.Online += (o, e) => { Console.WriteLine("Online"); }; + _listener.Connecting += (o, e) => { eventHandler("connecting"); }; + _listener.Offline += (o, e) => { eventHandler("offline"); }; + _listener.Online += (o, e) => { eventHandler("online"); }; - _httpClient = new HttpClient + if (!string.IsNullOrEmpty(targetServiceAddress)) { - BaseAddress = new Uri(targetServiceAddress, UriKind.RelativeOrAbsolute) - }; - _httpClient.DefaultRequestHeaders.ExpectContinue = false; - - _hybridConnectionSubPath = _listener.Address.AbsolutePath.EnsureEndsWith("/"); - - Console.WriteLine($"Http Listener: Http Relay Listener is listening on \n\r\t{_listener.Address}\n\rand routing requests to \n\r\t{_targetServiceAddress}\n\r"); + // Send the request message via Http + _httpClient = new HttpClient { BaseAddress = new Uri(targetServiceAddress, UriKind.RelativeOrAbsolute) }; + _httpClient.DefaultRequestHeaders.ExpectContinue = false; + } } /// - /// The constructor + /// Convert RelayedHttpListenerContext into HttpRequestMessage /// - /// + /// /// - /// - /// - public HttpListener(string relayNamespace, string connectionName, string keyName, string key, CancellationTokenSource cts) + /// + public static async Task CreateHttpRequestMessageAsync(RelayedHttpListenerContext context, string connectionName) { - CTS = cts; + var requestMessage = new HttpRequestMessage(); + if (context.Request.HasEntityBody) + { + requestMessage.Content = new StreamContent(context.Request.InputStream); + var contentType = context.Request.Headers[HttpRequestHeader.ContentType]; + if (!string.IsNullOrEmpty(contentType)) + { + requestMessage.Content.Headers.ContentType = MediaTypeHeaderValue.Parse(contentType); + } + } - var tokenProvider = TokenProvider.CreateSharedAccessSignatureTokenProvider(keyName, key); - _listener = new HybridConnectionListener(new Uri($"sb://{relayNamespace}/{connectionName}"), tokenProvider); + var relativePath = context.Request.Url.GetComponents(UriComponents.PathAndQuery, UriFormat.Unescaped); + relativePath = relativePath.Replace($"/{connectionName}/", string.Empty, StringComparison.OrdinalIgnoreCase); + requestMessage.RequestUri = new Uri(relativePath, UriKind.RelativeOrAbsolute); + requestMessage.Method = new HttpMethod(context.Request.HttpMethod); - // Subscribe to the status events. - _listener.Connecting += (o, e) => { Console.WriteLine("Connecting"); }; - _listener.Offline += (o, e) => { Console.WriteLine("Offline"); }; - _listener.Online += (o, e) => { Console.WriteLine("Online"); }; + foreach (var headerName in context.Request.Headers.AllKeys) + { + if (string.Equals(headerName, "Host", StringComparison.OrdinalIgnoreCase) || + string.Equals(headerName, "Content-Type", StringComparison.OrdinalIgnoreCase)) + { + // Don't flow these headers here + continue; + } + + requestMessage.Headers.Add(headerName, context.Request.Headers[headerName]); + } + + await Logger.LogRequestActivityAsync(requestMessage); + + //var requestMessageSer = await RelayedHttpListenerRequestSerializer.SerializeAsync(requestMessage); + //var deserializedRequestMessage = RelayedHttpListenerRequestSerializer.Deserialize(requestMessageSer); + + return requestMessage; + } + + + /// + /// Sends the response to the server + /// + /// + /// + /// + public static async Task SendResponseAsync(RelayedHttpListenerContext context, HttpResponseMessage responseMessage) + { + context.Response.StatusCode = responseMessage.StatusCode; + context.Response.StatusDescription = responseMessage.ReasonPhrase; + foreach (var header in responseMessage.Headers) + { + if (string.Equals(header.Key, "Transfer-Encoding")) + { + continue; + } + + context.Response.Headers.Add(header.Key, string.Join(",", header.Value)); + } - Console.WriteLine($"Http Listener: Http Relay Listener is listening on \n\r\t{_listener.Address}\n\rand routing requests to Websocket connection\n\r"); + var responseStream = await responseMessage.Content.ReadAsStreamAsync(); + await responseStream.CopyToAsync(context.Response.OutputStream); } + /// + /// Sends the error response + /// + /// + /// + public static void SendErrorResponse(Exception ex, RelayedHttpListenerContext context) + { + context.Response.StatusCode = HttpStatusCode.InternalServerError; + context.Response.StatusDescription = $"Http Listener: Internal Server Error: {ex.GetType().FullName}: {ex.Message}"; + context.Response.Close(); + } /// // Opening the listener establishes the control channel to @@ -87,8 +140,6 @@ public async Task OpenAsync(Action relayHandler) _listener.RequestHandler = relayHandler; await _listener.OpenAsync(CTS.Token); - Console.WriteLine("Press [Enter] to exit"); - // Provide callback for a cancellation token that will close the listener. CTS.Token.Register(() => _listener.CloseAsync(CancellationToken.None)); } @@ -114,7 +165,7 @@ public async Task ListenAsync() /// public Task CloseAsync() { - _httpClient.Dispose(); + if (_httpClient != null ) _httpClient.Dispose(); return _listener.CloseAsync(CTS.Token); } @@ -124,7 +175,7 @@ public Task CloseAsync() /// /// /// - public async Task SendHttpRequestMessageAsync(RelayedHttpListenerContext context) + public async Task SendHttpRequestMessageAsync(RelayedHttpListenerContext context, string connectionName) { var requestMessage = new HttpRequestMessage(); if (context.Request.HasEntityBody) @@ -138,7 +189,7 @@ public async Task SendHttpRequestMessageAsync(RelayedHttpLi } var relativePath = context.Request.Url.GetComponents(UriComponents.PathAndQuery, UriFormat.Unescaped); - relativePath = relativePath.Replace(_hybridConnectionSubPath, string.Empty, StringComparison.OrdinalIgnoreCase); + relativePath = relativePath.Replace($"/{connectionName}/", string.Empty, StringComparison.OrdinalIgnoreCase); requestMessage.RequestUri = new Uri(relativePath, UriKind.RelativeOrAbsolute); requestMessage.Method = new HttpMethod(context.Request.HttpMethod); @@ -160,44 +211,7 @@ public async Task SendHttpRequestMessageAsync(RelayedHttpLi //var deserializedRequestMessage = RelayedHttpListenerRequestSerializer.Deserialize(requestMessageSer); // Send the request message via Http - return await _httpClient.SendAsync(requestMessage); - } - - - /// - /// Sends the response to the server - /// - /// - /// - /// - public async Task SendResponseAsync(RelayedHttpListenerContext context, HttpResponseMessage responseMessage) - { - context.Response.StatusCode = responseMessage.StatusCode; - context.Response.StatusDescription = responseMessage.ReasonPhrase; - foreach (var header in responseMessage.Headers) - { - if (string.Equals(header.Key, "Transfer-Encoding")) - { - continue; - } - - context.Response.Headers.Add(header.Key, string.Join(",", header.Value)); - } - - var responseStream = await responseMessage.Content.ReadAsStreamAsync(); - await responseStream.CopyToAsync(context.Response.OutputStream); - } - - /// - /// Sends the error response - /// - /// - /// - public void SendErrorResponse(Exception ex, RelayedHttpListenerContext context) - { - context.Response.StatusCode = HttpStatusCode.InternalServerError; - context.Response.StatusDescription = $"Http Listener: Internal Server Error: {ex.GetType().FullName}: {ex.Message}"; - context.Response.Close(); + return (_httpClient != null) ? await _httpClient.SendAsync(requestMessage) : null; } } } diff --git a/src/Microsoft.HybridConnections.Core/Logger.cs b/src/Microsoft.HybridConnections.Core/Logger.cs index e290c71..723dddd 100644 --- a/src/Microsoft.HybridConnections.Core/Logger.cs +++ b/src/Microsoft.HybridConnections.Core/Logger.cs @@ -1,6 +1,8 @@ using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; +using System.Collections.Generic; +using System.Globalization; using System.Net.Http; using System.Threading.Tasks; @@ -8,33 +10,63 @@ namespace Microsoft.HybridConnections.Core { public static class Logger { + public static List Logs { get; private set; } = new List(); + public static bool IsVerboseLogs { get; set; } + public static int MaxRows { get; set; } + public static int LeftPad { get; set; } + public static int MidPad { get; set; } /// - /// Logs the request's starting time + /// Log Request message /// - /// - public static void LogRequest(DateTime startTimeUtc) + /// + /// + /// + /// + public static void LogRequest(string requestType, string requestAddress, string statusCode, string message) { - var stopTimeUtc = DateTime.UtcNow; - //var buffer = new StringBuilder(); - //buffer.Append($"{startTimeUtc.ToString("s", CultureInfo.InvariantCulture)}, "); - //buffer.Append($"\"{context.Request.HttpMethod} {context.Request.Url.GetComponents(UriComponents.PathAndQuery, UriFormat.Unescaped)}\", "); - //buffer.Append($"{(int)context.Response.StatusCode}, "); - //buffer.Append($"{(int)stopTimeUtc.Subtract(startTimeUtc).TotalMilliseconds}"); - //Console.WriteLine(buffer); - - Console.WriteLine("...and back {0:N0} ms...", stopTimeUtc.Subtract(startTimeUtc).TotalMilliseconds); - Console.WriteLine(""); + var leftSection = $"{DateTime.UtcNow.ToString("s", CultureInfo.InvariantCulture)}: {requestType} {requestAddress}"; + var filler = string.Empty.PadRight((LeftPad - leftSection.Length > 0 ? LeftPad - leftSection.Length : 0) + MidPad); + + Logs.Add($"{leftSection}{filler}{statusCode} {message}"); + + if (Logs.Count >= MaxRows) + { + Logs.RemoveAt(0); + } } + /// + /// Log Request message + /// + /// + /// + /// + /// + /// + public static void LogRequest(string requestType, string requestAddress, string statusCode, string message, Action logsHandler) + { + LogRequest(requestType, requestAddress, statusCode, message); + logsHandler(); + } + + + /// + /// Clear logs + /// + public static void ClearLogs() + { + Logs.Clear(); + } + /// /// Logs the request activity /// /// public static async Task LogRequestActivityAsync(HttpRequestMessage requestMessage) { - if (requestMessage.Content == null) return false; + if (requestMessage.Content == null || !IsVerboseLogs) return false; try { @@ -77,18 +109,6 @@ public static void LogException(Exception ex) } - /// - /// Logs the message - /// - /// - public static void LogMessage(string message) - { - Console.ForegroundColor = ConsoleColor.Blue; - Console.WriteLine(message); - Console.WriteLine(""); - Console.ResetColor(); - } - /// /// Validates the Json string /// @@ -113,5 +133,35 @@ private static bool IsValidJson(string strInput) } } + /// + /// OutputRequestAsync + /// + /// + /// + public static async Task OutputRequestAsync(string messageSent) + { + if (!IsVerboseLogs) return; + + var activityRequest = RelayedHttpListenerRequestSerializer.Deserialize(messageSent); + await LogRequestActivityAsync(activityRequest); + } + + /// + /// Logs the request's starting time + /// + /// + public static void LogPerformanceMetrics(DateTime startTimeUtc) + { + if (!IsVerboseLogs) return; + + var stopTimeUtc = DateTime.UtcNow; + + Logs.Add($"and back {stopTimeUtc.Subtract(startTimeUtc).TotalMilliseconds} ms..."); + + if (Logs.Count >= MaxRows) + { + Logs.RemoveAt(0); + } + } } } diff --git a/src/Microsoft.HybridConnections.Core/WebSocketListener.cs b/src/Microsoft.HybridConnections.Core/WebSocketListener.cs index 10d4c61..2cb1383 100644 --- a/src/Microsoft.HybridConnections.Core/WebSocketListener.cs +++ b/src/Microsoft.HybridConnections.Core/WebSocketListener.cs @@ -23,8 +23,9 @@ public class WebSocketListener /// /// /// + /// /// - public WebSocketListener(string relayNamespace, string connectionName, string keyName, string key, CancellationTokenSource cts) + public WebSocketListener(string relayNamespace, string connectionName, string keyName, string key, Action eventHandler, CancellationTokenSource cts) { CTS = cts; @@ -32,9 +33,9 @@ public WebSocketListener(string relayNamespace, string connectionName, string ke _listener = new HybridConnectionListener(new Uri($"sb://{relayNamespace}/{connectionName}"), tokenProvider); // Subscribe to the status events. - _listener.Connecting += (o, e) => { Console.WriteLine("Connecting"); }; - _listener.Offline += (o, e) => { Console.WriteLine("Offline"); }; - _listener.Online += (o, e) => { Console.WriteLine("Online"); }; + _listener.Connecting += (o, e) => { eventHandler("connecting"); }; + _listener.Offline += (o, e) => { eventHandler("offline"); }; + _listener.Online += (o, e) => { eventHandler("online"); }; } /// @@ -46,8 +47,6 @@ public WebSocketListener(string relayNamespace, string connectionName, string ke public async Task OpenAsync() { await _listener.OpenAsync(CTS.Token); - Console.WriteLine($"Websocket Listener: Websocket Listener is listening on \n\r\t{_listener.Address}\n\r"); - Console.WriteLine("Press [Enter] to exit"); // trigger cancellation when the user presses enter. Not awaited. #pragma warning disable CS4014 diff --git a/src/Microsoft.HybridConnections.Listener/Program.cs b/src/Microsoft.HybridConnections.Listener/Program.cs deleted file mode 100644 index 5d31b38..0000000 --- a/src/Microsoft.HybridConnections.Listener/Program.cs +++ /dev/null @@ -1,204 +0,0 @@ -using Microsoft.Azure.Relay; -using Microsoft.Extensions.Configuration; -using Microsoft.HybridConnections.Core; -using System; -using System.IO; -using System.Net.Http; -using System.Threading; -using System.Threading.Tasks; - -namespace Microsoft.HybridConnections.Listener -{ - /// - /// Main Console App class - /// - public static class Program - { - public static IConfiguration Configuration { get; set; } - public static HttpListener HttpRelayListener { get; set; } - - public static WebSocketListener WebSocketListener { get; set; } - - private static string TargetHttpRelay; - private static bool IsVerboseLogs; - - public static void Main(string[] args) - { - var builder = new ConfigurationBuilder() - .SetBasePath(AppDomain.CurrentDomain.BaseDirectory) - .AddJsonFile("appsettings.json", false, true) - .AddEnvironmentVariables(); - Configuration = builder.Build(); - - RunAsync().GetAwaiter().GetResult(); - } - - private static async Task RunAsync() - { - try - { - var relayNamespace = $"{Configuration["Relay:Namespace"]}.servicebus.windows.net"; - var connectionName = Configuration["Relay:ConnectionName"]; - var keyName = Configuration["Relay:PolicyName"]; - var key = Configuration["Relay:PolicyKey"]; - var IsHttpRelayMode = Configuration["Relay:Mode"].Equals("http", StringComparison.CurrentCultureIgnoreCase); - - TargetHttpRelay = Configuration["Relay:TargetServiceAddress"]; - IsVerboseLogs = bool.Parse(Configuration["Relay:Log:Verbose"]); - - if (IsHttpRelayMode) - { - // Create the Http hybrid proxy listener - HttpRelayListener = new HttpListener(relayNamespace, connectionName, keyName, key, TargetHttpRelay, new CancellationTokenSource()); - - // Opening the listener establishes the control channel to - // the Azure Relay service. The control channel is continuously - // maintained, and is reestablished when connectivity is disrupted. - await HttpRelayListener.OpenAsync(ProcessHttpMessagesHandler); - Console.WriteLine("Http Server listening"); - - // Start a new thread that will continuously read the console. - await HttpRelayListener.ListenAsync(); - - // Return true, if the cancellation was requested, otherwise - false - return HttpRelayListener.CTS.IsCancellationRequested; - } - else // WebSockets Relay Mode - { - // Create the WebSockets hybrid proxy listener - var webSocketListener = new WebSocketListener(relayNamespace, connectionName, keyName, key, new CancellationTokenSource()); - - // Opening the listener establishes the control channel to - // the Azure Relay service. The control channel is continuously - // maintained, and is reestablished when connectivity is disrupted. - await webSocketListener.OpenAsync(); - Console.WriteLine("WebSocket Server listening"); - - // Start a new thread that will continuously read the from the websocket and write to the target Http endpoint. - await webSocketListener.ListenAsync(ProcessWebsocketMessagesHandler); - - // Close Websocket connection - await webSocketListener.CloseAsync(); - - Console.WriteLine("Awaiting for new received messages over websocket connection..."); - - // Return true, if the cancellation was requested, otherwise - false - return webSocketListener.CTS.IsCancellationRequested; - } - } - catch (Exception e) - { - await Console.Error.WriteLineAsync(e.Message); - return true; - } - } - - /// - /// Listener Response Handler - /// - /// - static async void ProcessHttpMessagesHandler(RelayedHttpListenerContext context) - { - var startTimeUtc = DateTime.UtcNow; - - try - { - // Send the request message to the target listener - Console.WriteLine("Sending the request message to {0}...", TargetHttpRelay); - var responseMessage = await HttpRelayListener.SendHttpRequestMessageAsync(context); - - // Send the response message back to the caller - Console.WriteLine("Sending the response message to the context owner..."); - await HttpRelayListener.SendResponseAsync(context, responseMessage); - } - - catch (Exception ex) - { - Logger.LogException(ex); - HttpRelayListener.SendErrorResponse(ex, context); - } - finally - { - Logger.LogRequest(startTimeUtc); - // Confirm the response has been sent - context.Response.StatusCode = System.Net.HttpStatusCode.OK; - context.Response.StatusDescription = "OK"; - using (var sw = new StreamWriter(context.Response.OutputStream)) - { - sw.WriteLine("Response message has been sent"); - } - - // The context MUST be closed here - await context.Response.CloseAsync(); - } - } - - - /// - /// The method initiates the connection. - /// - /// - /// - static async void ProcessWebsocketMessagesHandler(HybridConnectionStream relayConnection, CancellationTokenSource cts) - { - Console.WriteLine("New Websocket session"); - // The connection is a relay fork. - // We put a stream reader on the input stream and a stream writer over to the target connection - // that allows us to read UTF-8 text data that comes from - // the sender and to write text to the target endpoint. - var reader = new StreamReader(relayConnection); - - Console.WriteLine("Awaiting for the input messages..."); - // Read a line of input until the end of the buffer - var data = await reader.ReadToEndAsync(); - - Console.WriteLine($"Received data of the {data.Length} bytes length over websocket connection."); - - // Deserialize the websocket data into HttpRequestMessage - var requestMessage = RelayedHttpListenerRequestSerializer.Deserialize(data); - - // Send the request message to the target listener - Console.WriteLine("Sending the request message to {0}...", TargetHttpRelay); - await SendHttpRequestAsync(requestMessage); - - // If there's no input data, signal that - // you will no longer send data on this connection. - await relayConnection.ShutdownAsync(cts.Token); - - Console.WriteLine("End web socket session"); - - // closing the connection from this end - await relayConnection.CloseAsync(cts.Token); - } - - - /// - /// Creates and sends the Stream message over Http Relay connection - /// - /// - /// - private static async Task SendHttpRequestAsync(HttpRequestMessage requestMessage) - { - try - { - // Send the request message via Http - using (var httpClient = new HttpClient { BaseAddress = new Uri(TargetHttpRelay, UriKind.RelativeOrAbsolute) }) - { - httpClient.DefaultRequestHeaders.ExpectContinue = false; - await httpClient.SendAsync(requestMessage); - } - } - catch (Exception e) - { - Console.Error.WriteLine(e); - throw; - } - - if (IsVerboseLogs) - { - // Log the activity message - await Logger.LogRequestActivityAsync(requestMessage); - } - } - } -} diff --git a/src/Microsoft.HybridConnections.Listener/appsettings.json b/src/Microsoft.HybridConnections.Listener/appsettings.json deleted file mode 100644 index 5998eb9..0000000 --- a/src/Microsoft.HybridConnections.Listener/appsettings.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "Relay": { - "Log": { - "Verbose": false - }, - "Namespace": "websocketrelay", - "ConnectionName": "websocketrelay", - "PolicyName": "SendReceiveSASPolicy", - "PolicyKey": "Z7/V1LJ/fsm4c621XXxrHWqVvHwJVPuhx38lLDX2jUY=", - "Mode": "websocket", - "TargetServiceAddress": "http://localhost:3978" - } -} \ No newline at end of file diff --git a/src/Microsoft.HybridConnections.Relay/Program.cs b/src/Microsoft.HybridConnections.Relay/Program.cs index aafb8b3..74f6e4b 100644 --- a/src/Microsoft.HybridConnections.Relay/Program.cs +++ b/src/Microsoft.HybridConnections.Relay/Program.cs @@ -2,7 +2,6 @@ using Microsoft.Extensions.Configuration; using Microsoft.HybridConnections.Core; using System; -using System.IO; using System.Threading; using System.Threading.Tasks; @@ -14,8 +13,6 @@ class Program public static WebsocketClient WebsocketClient { get; set; } - private static bool IsHttpRelayMode; - private static string ListenerNamespace; private static string ListenerConnectionName; private static string ListenerKeyName; @@ -36,7 +33,7 @@ static void Main(string[] args) .AddEnvironmentVariables(); var configuration = builder.Build(); - IsHttpRelayMode = configuration["Listener:Mode"].Equals("http", StringComparison.CurrentCultureIgnoreCase); + Logger.IsVerboseLogs = bool.Parse(configuration["Log:Verbose"]); ListenerNamespace = $"{configuration["Listener:Namespace"]}.servicebus.windows.net"; ListenerConnectionName = configuration["Listener:ConnectionName"]; @@ -66,27 +63,15 @@ static async Task RunAsync() try { // Create the Http hybrid proxy listener - if (IsHttpRelayMode) - { - // Create Http bi-directional connection with the Http bound target - HttpRelayListener = new HttpListener( - ListenerNamespace, - ListenerConnectionName, - ListenerKeyName, - ListenerPolicyName, - ListenerTargetAddress, - new CancellationTokenSource()); - } - else - { - // Create Http listener one-way connection - HttpRelayListener = new HttpListener( - ListenerNamespace, - ListenerConnectionName, - ListenerKeyName, - ListenerPolicyName, - new CancellationTokenSource()); - } + // Create Http bi-directional connection with the Http bound target + HttpRelayListener = new HttpListener( + ListenerNamespace, + ListenerConnectionName, + ListenerKeyName, + ListenerPolicyName, + "", + HttpEventHandler, + new CancellationTokenSource()); // Opening the listener establishes the control channel to // the Azure Relay service. The control channel is continuously @@ -118,58 +103,53 @@ static async void ListenerRequestHandler(RelayedHttpListenerContext context) try { - if (IsHttpRelayMode) + // We'll use the Websocket client to send the content to a Websocket connection listener + // Create the Websocket client + WebsocketClient = new WebsocketClient( + RelayNamespace, + RelayConnectionName, + RelayKeyName, + RelayPolicyName); + + // Initiate the connection + var relayConnection = await WebsocketClient.CreateConnectionAsync(); + if (!relayConnection) { - // Send the request message to the target listener - Console.WriteLine("Sending the request message to {0}...", ListenerTargetAddress); - var responseMessage = await HttpRelayListener.SendHttpRequestMessageAsync(context); - - // Send the response status code back to the caller - Console.WriteLine("Return the response's status code back to the caller..."); - await HttpRelayListener.SendResponseAsync(context, responseMessage); - } - else - { - // We'll use the Websocket client to send the content to a Websocket connection listener - // Create the Websocket client - WebsocketClient = new WebsocketClient( - RelayNamespace, - RelayConnectionName, - RelayKeyName, - RelayPolicyName); - - // Initiate the connection - var relayConnection = await WebsocketClient.CreateConnectionAsync(); - if (!relayConnection) - { - // There is no websocket listener that is actively listening to our connections, let's try again later - return; - } - - // Listen to messages on the websocket connection - await WebsocketClient.RelayAsync(context); - - // Close Websocket connection - await WebsocketClient.CloseConnectionAsync(); + // There is no websocket listener that is actively listening to our connections, let's try again later + return; } + + // Listen to messages on the websocket connection + var messageSent = await WebsocketClient.RelayAsync(context); + + await Logger.OutputRequestAsync(messageSent); + + // Close Websocket connection + await WebsocketClient.CloseConnectionAsync(); } catch (Exception ex) { Logger.LogException(ex); - HttpRelayListener.SendErrorResponse(ex, context); + HttpListener.SendErrorResponse(ex, context); } finally { - Logger.LogRequest(startTimeUtc); - // Confirm the response has been sent - using (var sw = new StreamWriter(context.Response.OutputStream)) - { - sw.WriteLine("Response message has been sent"); - } - + Logger.LogPerformanceMetrics(startTimeUtc); // The context MUST be closed here await context.Response.CloseAsync(); } } + + /// + /// Outputs the Http listener's event messages + /// + /// + static void HttpEventHandler(string eventMessage) + { + Logger.LogRequest("Http", ListenerTargetAddress, $"\u001b[36m {System.Net.HttpStatusCode.OK} \u001b[0m", eventMessage); + Console.WriteLine(eventMessage); + } + + } } diff --git a/src/Microsoft.HybridConnections.Relay/WebsocketClient.cs b/src/Microsoft.HybridConnections.Relay/WebsocketClient.cs index 3b93e5d..15ac014 100644 --- a/src/Microsoft.HybridConnections.Relay/WebsocketClient.cs +++ b/src/Microsoft.HybridConnections.Relay/WebsocketClient.cs @@ -40,12 +40,11 @@ public async Task CreateConnectionAsync() try { _relayConnection = await _client.CreateConnectionAsync(); - Console.WriteLine("Websocket Client: Websocket connection has been established succesfully."); return true; } catch (EndpointNotFoundException) { - Logger.LogMessage($"Websocket Client: There are no listeners connected for this endpoint: {_client.Address.AbsoluteUri}. Will retry later."); + Logger.LogRequest("WebSocket", _client.Address.LocalPath, "\u001b[30m Failed \u001b[0m", $"There are no listeners connected for this endpoint: {_client.Address.AbsoluteUri}."); return false; } catch (Exception e) @@ -73,13 +72,15 @@ public async Task SendAsync(string buffer) /// /// /// - public async Task RelayAsync(RelayedHttpListenerContext context) + public async Task RelayAsync(RelayedHttpListenerContext context) { try { var requestMessageSer = await RelayedHttpListenerRequestSerializer.SerializeAsync(context.Request); // Send to the websocket listener await SendAsync(requestMessageSer); + + return requestMessageSer; } catch (Exception e) { diff --git a/src/Microsoft.HybridConnections.Relay/appsettings.json b/src/Microsoft.HybridConnections.Relay/appsettings.json index 3ca1c81..fdbd4b0 100644 --- a/src/Microsoft.HybridConnections.Relay/appsettings.json +++ b/src/Microsoft.HybridConnections.Relay/appsettings.json @@ -1,10 +1,12 @@ { + "Log": { + "Verbose": true + }, "Listener": { "Namespace": "websocketrelay", "ConnectionName": "httprelay", "PolicyName": "SendReceiveSASPolicy", "PolicyKey": "ZCizLYS+Ynr9jvGnHHVFOFyClL140tZhJMXDCUVB1iA=", - "Mode": "websocket", "TargetServiceAddress": "http://localhost:3978" }, "Relay": { diff --git a/src/Microsoft.HybridConnections.Relay/appsettings.json.template b/src/Microsoft.HybridConnections.Relay/appsettings.json.template new file mode 100644 index 0000000..c59288f --- /dev/null +++ b/src/Microsoft.HybridConnections.Relay/appsettings.json.template @@ -0,0 +1,19 @@ +{ + "Log": { + "Verbose": true | false + }, + "Listener": { + "Namespace": "", + "ConnectionName": "", + "PolicyName": "", + "PolicyKey": "", + "TargetServiceAddress": "" + }, + "Relay": { + "Namespace": "", + "ConnectionName": "", + "PolicyName": "", + "PolicyKey": "", + "RetryFrequency": 5000 + } +} diff --git a/src/Microsoft.HybridConnections.sln b/src/Microsoft.HybridConnections.sln index 2ac02ee..35bd3b5 100644 --- a/src/Microsoft.HybridConnections.sln +++ b/src/Microsoft.HybridConnections.sln @@ -3,22 +3,18 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 16 VisualStudioVersion = 16.0.31410.357 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.HybridConnections.Listener", "Microsoft.HybridConnections.Listener\Microsoft.HybridConnections.Listener.csproj", "{B935AFB3-7DBC-463B-8BB7-C23FCBCC92CC}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.HybridConnections.Relay", "Microsoft.HybridConnections.Relay\Microsoft.HybridConnections.Relay.csproj", "{E9049515-08AE-4B2D-8F2E-DC19D820C865}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.HybridConnections.Core", "Microsoft.HybridConnections.Core\Microsoft.HybridConnections.Core.csproj", "{CA1B223D-4BB7-41B2-AE70-67BA527AB284}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetPassage", "NetPassage\NetPassage.csproj", "{C69711F5-7E40-4222-812A-4A88D3CC5519}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {B935AFB3-7DBC-463B-8BB7-C23FCBCC92CC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B935AFB3-7DBC-463B-8BB7-C23FCBCC92CC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B935AFB3-7DBC-463B-8BB7-C23FCBCC92CC}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B935AFB3-7DBC-463B-8BB7-C23FCBCC92CC}.Release|Any CPU.Build.0 = Release|Any CPU {E9049515-08AE-4B2D-8F2E-DC19D820C865}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E9049515-08AE-4B2D-8F2E-DC19D820C865}.Debug|Any CPU.Build.0 = Debug|Any CPU {E9049515-08AE-4B2D-8F2E-DC19D820C865}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -27,6 +23,10 @@ Global {CA1B223D-4BB7-41B2-AE70-67BA527AB284}.Debug|Any CPU.Build.0 = Debug|Any CPU {CA1B223D-4BB7-41B2-AE70-67BA527AB284}.Release|Any CPU.ActiveCfg = Release|Any CPU {CA1B223D-4BB7-41B2-AE70-67BA527AB284}.Release|Any CPU.Build.0 = Release|Any CPU + {C69711F5-7E40-4222-812A-4A88D3CC5519}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C69711F5-7E40-4222-812A-4A88D3CC5519}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C69711F5-7E40-4222-812A-4A88D3CC5519}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C69711F5-7E40-4222-812A-4A88D3CC5519}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/src/Microsoft.HybridConnections.Listener/Microsoft.HybridConnections.Listener.csproj b/src/NetPassage/NetPassage.csproj similarity index 76% rename from src/Microsoft.HybridConnections.Listener/Microsoft.HybridConnections.Listener.csproj rename to src/NetPassage/NetPassage.csproj index 87747c8..4c20b39 100644 --- a/src/Microsoft.HybridConnections.Listener/Microsoft.HybridConnections.Listener.csproj +++ b/src/NetPassage/NetPassage.csproj @@ -1,23 +1,27 @@ - + Exe net5.0 - Microsoft.HybridConnections.Listener + + PreserveNewest + + PreserveNewest + + - diff --git a/src/NetPassage/NetPassage.json.template b/src/NetPassage/NetPassage.json.template new file mode 100644 index 0000000..f044c4a --- /dev/null +++ b/src/NetPassage/NetPassage.json.template @@ -0,0 +1,19 @@ +{ + "Relay": { + "Mode": " | " + }, + "Http": { + "Namespace": "", + "ConnectionName": "", + "PolicyName": "", + "PolicyKey": "", + "TargetServiceAddress": "" + }, + "WebSocket": { + "Namespace": "", + "ConnectionName": "", + "PolicyName": "", + "PolicyKey": "", + "TargetServiceAddress": "" + } +} diff --git a/src/NetPassage/Program.cs b/src/NetPassage/Program.cs new file mode 100644 index 0000000..2444c9e --- /dev/null +++ b/src/NetPassage/Program.cs @@ -0,0 +1,352 @@ +using Microsoft.Azure.Relay; +using Microsoft.Extensions.Configuration; +using Microsoft.HybridConnections.Core; +using System; +using System.Collections.Generic; +using System.IO; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; + +namespace NetPassage +{ + class Program + { + private static bool KeepRunning = true; + private static IConfiguration AppConfig; + private static IConfiguration UserConfig; + private static string LeftSectionFiller; + private static string MidSectionFiller; + private static string ConnectionName; + private static string TargetHttpRelay; + private static bool IsHttpRelayMode; + private static string ConnectionStatus = "offline"; + + static void Main(string[] args) + { + Console.CancelKeyPress += (sender, eventArgs) => { + // call methods to clean up + eventArgs.Cancel = true; + Program.KeepRunning = false; + }; + + AppConfig = new ConfigurationBuilder() + .SetBasePath(AppDomain.CurrentDomain.BaseDirectory) + .AddJsonFile("appsettings.json", false, true) + .AddEnvironmentVariables() + .Build(); + + ShowHeader(AppConfig); + + // Set format + Logger.MaxRows = int.Parse(AppConfig["App:MessageRows"]); + Logger.LeftPad = int.Parse(AppConfig["App:LeftPad"]); + Logger.MidPad = int.Parse(AppConfig["App:MidPad"]); + LeftSectionFiller = string.Empty.PadRight(Logger.LeftPad, ' '); + MidSectionFiller = string.Empty.PadRight(Logger.MidPad, ' '); + + if (args.Length < 1) + { + ShowError("Missing configuration file"); + Environment.Exit(0); + } + + UserConfig = new ConfigurationBuilder() + .AddJsonFile(args[0], false, true) + .Build(); + + IsHttpRelayMode = UserConfig["Relay:Mode"].Equals("http", StringComparison.CurrentCultureIgnoreCase); + + var configHeader = IsHttpRelayMode ? "Http" : "WebSocket"; + + var relayNamespace = $"{UserConfig[$"{configHeader}:Namespace"]}.servicebus.windows.net"; + var keyName = UserConfig[$"{configHeader}:PolicyName"]; + var key = UserConfig[$"{configHeader}:PolicyKey"]; + + ConnectionName = UserConfig[$"{configHeader}:ConnectionName"]; + TargetHttpRelay = UserConfig[$"{configHeader}:TargetServiceAddress"]; + + try + { + while (Program.KeepRunning) + { + ShowAll(); + // Do your work in here, in small chunks. + // If you literally just want to wait until ctrl-c, + // not doing anything, see the answer using set-reset events. + if (IsHttpRelayMode) + { + // Create the Http hybrid proxy listener + var httpRelayListener = new HttpListener( + relayNamespace, + ConnectionName, + keyName, + key, + TargetHttpRelay, + ConnectionEventHandler, + new CancellationTokenSource()); + + // Opening the listener establishes the control channel to + // the Azure Relay service. The control channel is continuously + // maintained, and is reestablished when connectivity is disrupted. + Program.KeepRunning = RunHttpRelayAsync(httpRelayListener).GetAwaiter().GetResult(); + } + else // WebSockets Relay Mode + { + // Create the WebSockets hybrid proxy listener + var webSocketListener = new WebSocketListener( + relayNamespace, + ConnectionName, + keyName, + key, + ConnectionEventHandler, + new CancellationTokenSource()); + + // Opening the listener establishes the control channel to + // the Azure Relay service. The control channel is continuously + // maintained, and is reestablished when connectivity is disrupted. + Program.KeepRunning = RunWebSocketRelayAsync(webSocketListener).GetAwaiter().GetResult(); + } + } + } + catch (Exception e) + { + ShowError(e.Message); + } + } + + /// + /// RunHttpRelayAsync + /// + /// + /// + static async Task RunHttpRelayAsync(HttpListener httpRelayListener) + { + await httpRelayListener.OpenAsync(ProcessHttpMessagesHandler); + + // Start a new thread that will continuously read the console. + await httpRelayListener.ListenAsync(); + + // Close the connection + await httpRelayListener.CloseAsync(); + + // Return false, if the cancellation was requested, otherwise - true + return !httpRelayListener.CTS.IsCancellationRequested; + } + + /// + /// RunWebsocketRelayAsync + /// + /// + /// + static async Task RunWebSocketRelayAsync(WebSocketListener webSocketListener) + { + // Opening the listener establishes the control channel to + // the Azure Relay service. The control channel is continuously + // maintained, and is reestablished when connectivity is disrupted. + await webSocketListener.OpenAsync(); + + // Start a new thread that will continuously read the from the websocket and write to the target Http endpoint. + await webSocketListener.ListenAsync(ProcessWebSocketMessagesHandler); + + // Close Websocket connection + await webSocketListener.CloseAsync(); + + // Return true, if the cancellation was requested, otherwise - false + return webSocketListener.CTS.IsCancellationRequested; + } + + /// + /// Listener Response Handler + /// + /// + static async void ProcessHttpMessagesHandler(RelayedHttpListenerContext context) + { + var startTimeUtc = DateTime.UtcNow; + + try + { + // Send the request message to the target listener + var requestMessage = await HttpListener.CreateHttpRequestMessageAsync(context, ConnectionName); + var responseMessage = await SendHttpRequestAsync(requestMessage); + Logger.LogRequest(requestMessage.Method.Method, requestMessage.RequestUri.LocalPath, $"\u001b[32m {responseMessage.StatusCode} \u001b[0m", $"Forwarded to {TargetHttpRelay}.", ShowAll); + + // Send the response message back to the caller + // await HttpListener.SendResponseAsync(context, responseMessage); + } + catch (RelayException re) + { + Logger.LogRequest("Http", ConnectionName, $"\u001b[31m {System.Net.HttpStatusCode.ServiceUnavailable} \u001b[0m", re.Message, ShowAll); + } + catch (Exception e) + { + Logger.LogRequest("Http", ConnectionName, $"\u001b[31m {e.GetType().Name} \u001b[0m", e.Message, ShowAll); + HttpListener.SendErrorResponse(e, context); + } + finally + { + Logger.LogPerformanceMetrics(startTimeUtc); + // The context MUST be closed here + await context.Response.CloseAsync(); + } + } + + + /// + /// The method initiates the connection. + /// + /// + /// + static async void ProcessWebSocketMessagesHandler(HybridConnectionStream relayConnection, CancellationTokenSource cts) + { + try + { + // The connection is a relay fork. + // We put a stream reader on the input stream and a stream writer over to the target connection + // that allows us to read UTF-8 text data that comes from + // the sender and to write text to the target endpoint. + var reader = new StreamReader(relayConnection); + + // Read a line of input until the end of the buffer + var data = await reader.ReadToEndAsync(); + + Logger.LogRequest("WebSocket", ConnectionName, $"\u001b[36m {System.Net.HttpStatusCode.Redirect} \u001b[0m", $"Received {data.Length} bytes from {relayConnection.TrackingContext.Address}", ShowAll); + + // Deserialize the websocket data into HttpRequestMessage + var requestMessage = RelayedHttpListenerRequestSerializer.Deserialize(data); + + // Send the request message to the target listener + var responseMessage = await SendHttpRequestAsync(requestMessage); + Logger.LogRequest(requestMessage.Method.Method, requestMessage.RequestUri.LocalPath, $"\u001b[32m {responseMessage.StatusCode} \u001b[0m", $"Forwarded to {TargetHttpRelay}.", ShowAll); + } + catch (RelayException re) + { + Logger.LogRequest("WebSocket", ConnectionName, $"\u001b[31m {System.Net.HttpStatusCode.ServiceUnavailable} \u001b[0m", re.Message, ShowAll); + } + catch (Exception e) + { + Logger.LogRequest("WebSocket", ConnectionName, $"\u001b[31m {e.GetType().Name} \u001b[0m", e.Message, ShowAll); + } + finally + { + // If there's no input data, signal that + // you will no longer send data on this connection. + await relayConnection.ShutdownAsync(cts.Token); + + // closing the connection from this end + await relayConnection.CloseAsync(cts.Token); + } + } + + + /// + /// Creates and sends the Stream message over Http Relay connection + /// + /// + /// + static async Task SendHttpRequestAsync(HttpRequestMessage requestMessage) + { + try + { + // Send the request message via Http + using (var httpClient = new HttpClient { BaseAddress = new Uri(TargetHttpRelay, UriKind.RelativeOrAbsolute) }) + { + httpClient.DefaultRequestHeaders.ExpectContinue = false; + return await httpClient.SendAsync(requestMessage); + } + } + catch (Exception e) + { + Console.Error.WriteLine(e); + throw; + } + } + + static void ShowAll() + { + Console.Clear(); + ShowHeader(AppConfig); + ShowConfiguration(UserConfig); + ShowRequestsHeader(); + + List logs = new List(); + logs.AddRange(Logger.Logs); + logs.Reverse(); + + foreach (var message in logs) + { + Console.WriteLine(message); + } + } + + static void ShowHeader(IConfiguration config) + { + var appName = config["App:Name"]; + var author = config["App:Author"]; + var version = config["App:Version"]; + + Console.ForegroundColor = ConsoleColor.Cyan; + Console.Write(appName); + Console.ForegroundColor = ConsoleColor.White; + Console.Write(" by "); + Console.ForegroundColor = ConsoleColor.Cyan; + Console.WriteLine(author); + Console.WriteLine($"Version: {version}"); + Console.ResetColor(); + Console.WriteLine("\n\r\n\r"); + } + + static void ShowError(string message) + { + Console.ForegroundColor = ConsoleColor.Red; + Console.WriteLine(message); + Console.WriteLine(""); + Console.ResetColor(); + } + + static void ShowConfiguration(IConfiguration config) + { + var relayNamespace = $"sb://{config["Relay:Namespace"]}.servicebus.windows.net"; + var IsHttpRelayMode = config["Relay:Mode"].Equals("http", StringComparison.CurrentCultureIgnoreCase); + + Console.ForegroundColor = ConsoleColor.White; + Console.WriteLine($"{LeftSectionFiller}{MidSectionFiller}(Ctrl+C to quit)"); + Console.ForegroundColor = ConsoleColor.Green; + var title = "Session Status"; + var filler = string.Empty.PadRight(LeftSectionFiller.Length - title.Length > 0 ? LeftSectionFiller.Length - title.Length : 0); + Console.WriteLine($"{title}{filler}{MidSectionFiller}{ConnectionStatus}"); + + Console.ForegroundColor = ConsoleColor.White; + title = "Azure Relay Namespace"; + filler = string.Empty.PadRight(LeftSectionFiller.Length - title.Length > 0 ? LeftSectionFiller.Length - title.Length : 0); + Console.WriteLine($"{title}{filler}{MidSectionFiller}{relayNamespace}"); + + title = IsHttpRelayMode? "Http Forwarding" : "Websocket Forwarding"; + filler = string.Empty.PadRight(LeftSectionFiller.Length - title.Length > 0 ? LeftSectionFiller.Length - title.Length : 0); + Console.WriteLine($"{title}{filler}{MidSectionFiller}{relayNamespace}/{ConnectionName} {(char)29} {TargetHttpRelay}"); + } + + /// + /// Show Request Logs Header + /// + static void ShowRequestsHeader() + { + Console.ForegroundColor = ConsoleColor.White; + Console.WriteLine("\n\r\n\r"); + Console.WriteLine(IsHttpRelayMode ? "HTTP Requests" : "Websocket Requests"); + Console.WriteLine("___________________"); + Console.WriteLine("\n\r"); + } + + + /// + /// Outputs the listener's event messages + /// + /// + static void ConnectionEventHandler(string eventMessage) + { + ConnectionStatus = eventMessage; + ShowAll(); + } + } +} diff --git a/src/NetPassage/appsettings.json.template b/src/NetPassage/appsettings.json.template new file mode 100644 index 0000000..191ecf2 --- /dev/null +++ b/src/NetPassage/appsettings.json.template @@ -0,0 +1,10 @@ +{ + "App": { + "Name": "NetPassage", + "Author": "Microsoft", + "Version": "1.0.0", + "MessageRows": 10, + "LeftPad": 50, + "MidPad": 20 + } +} \ No newline at end of file From 0c1ca6cefc831fee16e061b5d1b04916be390acf Mon Sep 17 00:00:00 2001 From: Danny Garber Date: Thu, 22 Jul 2021 02:27:05 -0400 Subject: [PATCH 4/4] Added Readme --- README.md | 162 ++++++++++++++----------------- WMT-Bot.png | Bin 61074 -> 0 bytes docs/images/WebSocketConsole.png | Bin 0 -> 150123 bytes 3 files changed, 74 insertions(+), 88 deletions(-) delete mode 100644 WMT-Bot.png create mode 100644 docs/images/WebSocketConsole.png diff --git a/README.md b/README.md index ef9c25e..52bddf5 100644 --- a/README.md +++ b/README.md @@ -1,114 +1,100 @@ # Overview -A relay utility for bots based on Azure Service Bus. -This utility allows you to forward a message sent to a bot hosted on any channel to your local machine. +**NetPassage** allows you to expose a web service, such as Microsoft Bot running on your local machine or on the private network to the public cloud endpoint, such as Bot Channel Registration Messaging endpoint, for example, via Azure Service Bus Relay. + +This client side utility supports both `Http` and `WebSocket` connectivity with the cloud based Relay. It is useful for debug scenarios or for more complex situations where the BotEmulator is not enough (i.e.: you use the WebChat control hosted on a site and you need to receive ChannelData in your requests). -## Acknowledgments -Part of this code is based on the work that [Pedro Felix](https://github.com/pmhsfelix) did in his project [here](https://github.com/pmhsfelix/WebApi.Explorations.ServiceBusRelayHost). +When you start `NetPassage`, it will display a UI in your terminal with the public URL of your tunnel and other status and metrics information about connections made over your tunnel. -# How to configure and run the utility -### Building with .Net Framework +![UI Terminal](docs/images/WebSocketConsole.png) -1. Once the solution has been cloned to your machine, open the solution in Visual Studio. +## Architecture -2. In Solution Explorer, expand the **ServiceBusRelayUtil** folder. - -3. Open the **App.config** file and replace the following values with those from your service bus (not the hybrid connection). - - a. "RelayNamespace" is the name of your service bus created earlier. Enter the value in place of **[Your Namespace]**. - - b. "RelayName" is the name of the shared access policy created in steps 9 through 11 during the service bus set up process. Enter the value in place of **[Your Relay Name]**. - - c. "PolicyName" is the value to the shared access policy created in steps 9 through 11 during the service bus set up process. Enter the value in place of **[Your Shared Access Policy Name]**. - - d. "PolicyKey" is the WCF relay to be used. Remember, this relay is programmatically created and only exists on your machine. Create a new, unused name and enter the value in place of **[Your Policy's Key]**. - - e. "TargetServiceAddress" sets the port to be used for localhost. The address and port number should match the address and port used by your bot. Enter a value in place of the "TODO" string part. For example, "http://localhost:[PORT]". - -4. Before testing the relay, your Azure Web Bot's messaging endpoint must be updated to match the relay. - - a. Login to the Azure portal and open your Web App Bot. - - b. Select **Settings** under Bot management to open the settings blade. - - c. In the **Messaging endpoint** field, enter the service bus namespace and relay. The relay should match the relay name entered in the **App.config** file and should not exist in Azure. - - d. Append **"/api/messages"** to the end to create the full endpoint to be used. For example, “https://example-service-bus.servicebus.windows.net/wcf-example-relay/api/messages". - - e. Click **Save** when completed. - -5. In Visual Studio, press **F5** to run the project. - -6. Open and run your locally hosted bot. - -7. Test your bot on a channel (Test in Web Chat, Skype, Teams, etc.). User data is captured and logged as activity occurs. +`NetPassage`uses Microsoft Azure Service Bus Relay to tunnel all incoming +messages thru the Relay's hybrid connections (either Websocket or Http) and to +the remotely running (e.g. local) `NetPassage`client utility's listener, as +shown in the architecture diagram below: - - When using the Bot Framework Emulator: The endpoint entered in Emulator must be the service bus endpoint saved in your Azure Web Bot **Settings** blade, under **Messaging Endpoint**. +![Architecture](docs/images/passage.png) -8. Once testing is completed, you can compile the project into an executable. +## How to configure and run the utility - a. Right click the project folder in Visual Studio and select **Build**. +The `NetPassage` utility is constructed from the following parts: - b. The .exe will output to the **/bin/debug** folder, along with other necessary files, located in the project’s directory folder. All the files are necessary to run and should be included when moving the .exe to a new folder/location. - - The **app.config** is in the same folder and can be edited as credentials change without needing to recompile the project. +1. NetPassage client console app +2. Microsoft.HybridConnectionsRelay a server side job (deployed to Azure) +3. Microsoft.HybridConnections.Core -### Building with .Net Core +### Building with Microsoft Visual Studio 2019 + +>Note: If you plan on using only Http tunnel protocol, then you would only need to build the NetPassage and Microsoft.HybridConnections.Core projects. Then you would start NetPassage project only. 1. Once the solution has been cloned to your machine, open the solution in Visual Studio. -2. In Solution Explorer, expand the **ServiceBusRelayUtilNetCore** folder. - -3. Open the **appsettings.json** file and replace the following values with those from your service bus hybrid connection. - - a. "RelayNamespace" is the name of your service bus created earlier. Enter the value in place of **[Your Namespace]**. - - b. "RelayName" is the name of the hybrid connection created in step 12. Enter the value in place of **[Your Relay Name]**. - - c. "PolicyName" is the name of the shared access policy created in steps 9 through 11 during the service bus set up process. Enter the value in place of **[Your Shared Access Policy Name]**. - - d. "PolicyKey" is the value to the shared access policy created in steps 9 through 11 during the service bus set up process. Enter the value in place of **[Your Policy's Key]**. - - e. "TargetServiceAddress" sets the port to be used for localhost. The address and port number should match the address and port used by your bot. Enter a value in place of the **"http://localhost:[PORT]"**. For example, "http://localhost:3978". - -4. Before testing the relay, your Azure Web App Bot's messaging endpoint must be updated to match the relay. - - a. Login to the Azure portal and open your Web App Bot. - - b. Select **Settings** under Bot management to open the settings blade. - - c. In the **Messaging endpoint** field, enter the service bus namespace and relay. - - d. Append **"/api/messages"** to the end to create the full endpoint to be used. For example, “https://example-service-bus.servicebus.windows.net/hc1/api/messages". - - e. Click **Save** when completed. - -5. In Visual Studio, press **F5** to run the project. - -6. Open and run your locally hosted bot. - -7. Test your bot on a channel (Test in Web Chat, Skype, Teams, etc.). User data is captured and logged as activity occurs. +2. In Solution Explorer, expand the **NetPassage** folder. - - When using the Bot Framework Emulator: The endpoint entered in Emulator must be the service bus endpoint saved in your Azure Web Bot **Settings** blade, under **Messaging Endpoint**. +3. Clone the **NetPassage.json.template** file into **NetPassage.json** and replace the following values with those from your Azure Service +Bus. + + a. `Namespace` is the name of your Azure Service Bus Relay. Enter the same value for both Http and Websocket sections. + + b. Under **Http** section, `ConnectionName` is the name of the Hybrid Connection used for Http relay. And Under **Websocket** section, `ConnectionName` is the name of the Hybrid Connection used for Websocket relay. + + c. "PolicyName" is the value to the shared access policy for each of the Hybrid Connections you've entered earlier. + + d. "PolicyKey" is the secret key value for the shared access policy. + + e. "TargetServiceAddress" sets the port to be used for localhost. The address and port number should match the address and port used by your bot. For example, `http:/localhost:[PORT]`. + +If you're going to use the `Websocket` relay, you'd also need to update the values in the **appsettings.json** for the `Microsoft.HybridConnections.Relay` project. + +1. In Solution Explorer, expand the **Microsoft.HybridConnections.Relay** folder. + +2. Clone the **appsettings.json.template** file into **appsettings.json** and replace the following values with those from your Azure Service +Bus. -8. Once testing is completed, you can compile the project into an executable. + a. `Namespace` is the name of your Azure Service Bus Relay. Enter the same value for both Http and Websocket sections. - a. Right click the project folder in Visual Studio and select **Publish**. + b. Under **Listener** section, `ConnectionName` is the name of the Hybrid Connection used for Http relay. And Under **Relay** section, `ConnectionName` is the name of the Hybrid Connection used for Websocket relay. - b. For **Pick a publish Target**, select **Folder**. + c. "PolicyName" is the value to the shared access policy for each of the Hybrid Connections you've entered earlier. - c. For **Folder or File Share**, choose an output location or keep the default. + d. "PolicyKey" is the secret key value for the shared access policy. - d. Click **Create Profile** to create a publish profile. + e. "TargetServiceAddress" sets the port to be used for localhost. The address and port number should match the address and port used by your bot. For example, `http:/localhost:[PORT]`. - e. Click **Configure...** to change the build configuration and change the following: +Before testing the relay, your Azure Web Bot's messaging endpoint must be updated to match the relay. - - **Configuration** to "Debug | Any CPU" - - **Deployment Mode** to "Self-contained" - - **Target Runtime** to "win-x64" +1. Login to the Azure portal and open your Web App Bot. + +2. Select **Settings** under Bot management to open the settings blade. + +3. In the **Messaging endpoint** field, enter the service bus namespace and relay. The relay should match the relay `ConnectionName` entered in the **NetPassage.json** file and should not exist in Azure. + +4. Append **"/api/messages"** to the end to create the full endpoint to be used. For example, `https://example-service-bus.servicebus.windows.net/websocketrelay/api/messages`. + +5. Click **Save** when completed. + +Now, back to the Visual Studio. + +1. In Visual Studio, if you want to run in `Websocket` mode, make sure both `NetPassage` and `Microsoft.HybridConnections.Relay` projects are selected to start. Then, press **F5** to run both projects. +And, if you're planning on using only `Http` mode, you should only run `NetPassage` project. + +2. Open and run your locally hosted bot. + +3. Test your bot on a channel (Test in Web Chat, Skype, Teams, etc.). User data is captured and logged as activity occurs. + + - When using the Bot Framework Emulator: The endpoint entered in Emulator must be the service bus endpoint saved in your Azure Web Bot **Settings** blade, under **Messaging Endpoint**. + +4. Once testing is completed, you can compile the project into an executable. + + a. Right click the project folder in Visual Studio and select **Build**. + + b. The .exe will output to the **/bin/debug** folder, along with other necessary files, located in the project’s directory folder. All the files are necessary to run and should be included when moving the .exe to a new folder/location. + - The **app.config** is in the same folder and can be edited as credentials change without needing to recompile the project. - f. Click **Save** and then **Publish** +## Acknowledgments - g. The .exe will output to the **/bin/debug** folder, along with other necessary files, located in the project’s directory folder. All the files are necessary to run and should be included when moving the .exe to a new folder/location. - - The **appsettings.json** is in the same folder and can be edited as credentials change without needing to recompile the project. +Part of this code is based on the work that [Gabo Gilabert](https://github.com/gabog) did in his project [here](https://github.com/gabog/AzureServiceBusBotRelay). diff --git a/WMT-Bot.png b/WMT-Bot.png deleted file mode 100644 index eacb553b359b9834a1e41d39a930eee6b79543d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 61074 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 diff --git a/docs/images/WebSocketConsole.png b/docs/images/WebSocketConsole.png new file mode 100644 index 0000000000000000000000000000000000000000..aa1677d7804f85704b00e10995b275bc019ec649 GIT binary patch literal 150123 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 V55%a`F^rGCqjm2lLgUHn{|m)X*oy!F literal 0 HcmV?d00001