Skip to content

Commit

Permalink
Change Private Ports Implementation
Browse files Browse the repository at this point in the history
  • Loading branch information
xingyang-li committed Mar 19, 2024
1 parent 2f83dcb commit e09ef2f
Show file tree
Hide file tree
Showing 2 changed files with 76 additions and 22 deletions.
42 changes: 33 additions & 9 deletions src/SwiftTestingFrameworkAPI/Controllers/PrivatePortsController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@
using Microsoft.AspNetCore.Mvc;
using SwiftTestingFrameworkAPI.Utils;
using System;
using System.Net.Sockets;
using System.Net;
using System.Text;

namespace SwiftTestingFrameworkAPI.Controllers
{
Expand Down Expand Up @@ -38,21 +41,42 @@ public ObjectResult RequestSite()

string stringAddr = Environment.GetEnvironmentVariable("WEBSITE_PRIVATE_IP") ?? string.Empty;
string stringPort = Environment.GetEnvironmentVariable("WEBSITE_PRIVATE_PORTS") ?? string.Empty;
IPAddress hostIP = IPAddress.Parse(stringAddr);
IPEndPoint ep = new IPEndPoint(hostIP.Address, Int32.Parse(stringPort));

Check warning on line 45 in src/SwiftTestingFrameworkAPI/Controllers/PrivatePortsController.cs

View workflow job for this annotation

GitHub Actions / build-api-app

'IPAddress.Address' is obsolete: 'IPAddress.Address is address family dependent and has been deprecated. Use IPAddress.Equals to perform comparisons.'

Check warning on line 45 in src/SwiftTestingFrameworkAPI/Controllers/PrivatePortsController.cs

View workflow job for this annotation

GitHub Actions / build-api-app

'IPAddress.Address' is obsolete: 'IPAddress.Address is address family dependent and has been deprecated. Use IPAddress.Equals to perform comparisons.'

try
{
p = Helper.StartProcess("tcpping.exe", stringAddr + ":" + stringPort);
using Socket client = new (
ep.AddressFamily,
SocketType.Stream,
ProtocolType.Tcp
);

if (p.ExitCode == 0)
client.Connect(ep);
while (true)
{
testResponse = new TestResponse(Constants.ApiVersion, TestName, "Success", p.StdOutput, string.Empty);
return StatusCode(200, testResponse);
}
else
{
testResponse = new TestResponse(Constants.ApiVersion, TestName, "Failure", string.Empty, p.StdError);
return StatusCode(555, testResponse);
// Send message.
var message = "Hello world! <|EOM|>";
var messageBytes = Encoding.UTF8.GetBytes(message);
client.Send(messageBytes, SocketFlags.None);
Console.WriteLine($"Socket client sent message: \"{message}\"");

// Receive ack.
var buffer = new byte[1_024];
var received = client.Receive(buffer, SocketFlags.None);
var response = Encoding.UTF8.GetString(buffer, 0, received);
if (response == "<|ACK|>")
{
Console.WriteLine(
$"Socket client received acknowledgment: \"{response}\"");
break;
}
}

client.Shutdown(SocketShutdown.Both);

testResponse = new TestResponse(Constants.ApiVersion, TestName, "Success", "Message Sent", string.Empty);
return StatusCode(200, testResponse);
}
catch (Exception ex)
{
Expand Down
56 changes: 43 additions & 13 deletions src/SwiftTestingFrameworkAPI/Lifetime.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using System.Net.Sockets;
using System.Net;
using System.Text;

namespace SwiftTestingFrameworkAPI
{
Expand All @@ -23,7 +24,7 @@ public LifetimeService(
public Task StartAsync(CancellationToken cancellationToken)
{
_logger.LogInformation("StartAsync has been called.");

Task.Run(async () => { await ListenOnPrivatePort(); });
return Task.CompletedTask;
}

Expand All @@ -35,11 +36,27 @@ public Task StopAsync(CancellationToken cancellationToken)
}

private void OnStarted()
{
_logger.LogInformation("OnStarted has been called.");
}

private void OnStopping()
{
_logger.LogInformation("OnStopping has been called.");
}

private void OnStopped()
{
listenSocket.Close();
_logger.LogInformation("OnStopped has been called.");
}

public async Task ListenOnPrivatePort()
{
// Add services to the container.
listenSocket = new Socket(AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
SocketType.Stream,
ProtocolType.Tcp);

// bind the listening socket to the port
string stringAddr = Environment.GetEnvironmentVariable("WEBSITE_PRIVATE_IP") ?? string.Empty;
Expand All @@ -50,18 +67,31 @@ private void OnStarted()

// start listening
listenSocket.Listen();
_logger.LogInformation("OnStarted has been called.");
}

private void OnStopping()
{
_logger.LogInformation("OnStopping has been called.");
}
while (true)
{

private void OnStopped()
{
listenSocket.Close();
_logger.LogInformation("OnStopped has been called.");
var handler = await listenSocket.AcceptAsync();
// Receive message.
var buffer = new byte[1_024];
var received = await handler.ReceiveAsync(buffer, SocketFlags.None);
var response = Encoding.UTF8.GetString(buffer, 0, received);

var eom = "<|EOM|>";
if (response.IndexOf(eom) > -1 /* is end of message */)
{
Console.WriteLine(
$"Socket server received message: \"{response.Replace(eom, "")}\"");

var ackMessage = "<|ACK|>";
var echoBytes = Encoding.UTF8.GetBytes(ackMessage);
await handler.SendAsync(echoBytes, 0);
Console.WriteLine(
$"Socket server sent acknowledgment: \"{ackMessage}\"");

handler.Close();
}
}
}
}
}

0 comments on commit e09ef2f

Please sign in to comment.