Skip to content

Commit

Permalink
Minor fix
Browse files Browse the repository at this point in the history
  • Loading branch information
sanchitmehta committed Nov 30, 2020
1 parent 979d8c9 commit 1fd3241
Showing 1 changed file with 58 additions and 10 deletions.
68 changes: 58 additions & 10 deletions Kudu.Services/DebugExtension/InstanceController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.Extensions.Caching.Memory;
using System;
using System.Collections.Generic;
using System.Linq;
Expand All @@ -14,6 +15,7 @@ namespace Kudu.Services.DebugExtension
public class InstanceController : Controller
{
private static readonly HttpClient _httpClient = new HttpClient();
//private static readonly MemoryCache _cache = new MemoryCache();

[HttpGet]
public async Task<List<PodInstance>> GetInstances()
Expand All @@ -26,7 +28,49 @@ public async Task<List<PodInstance>> GetInstances()
return null;
}

[Route("{instanceId}/webssh")]
/*
[Route("{instanceId}/remotedebug")]
public IActionResult RemoteDebug(string instanceId)
{
var instances = K8SEDeploymentHelper.GetInstances(K8SEDeploymentHelper.GetAppName(HttpContext));
PodInstance instance = null;
if (instances.Count > 0)
{
instance = instances.Where(i => i.Name.Equals(instanceId, System.StringComparison.OrdinalIgnoreCase)).FirstOrDefault();
}
if (instances.Count > 0 && instanceId.Equals("any", System.StringComparison.OrdinalIgnoreCase))
{
instance = instances[0];
}
if (instance == null)
{
return "Invalid instance";
}
using (Socket testSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
{
testSocket.SetSocketOption(SocketOptionLevel.Tcp, SocketOptionName.NoDelay, true);
testSocket.Connect(new IPEndPoint(IPAddress.Parse(ipAddress), debugPort));
context.Response.StatusCode = 200;
_logger.LogInformation("GetStats success " + ipAddress + ":" + debugPort);
if (IsV2StatusAPIRequest)
{
var response = new LSiteStatusResponse(lSiteStatus, debugPort, true);
var json = JsonConvert.SerializeObject(response);
await context.Response.WriteAsync(json);
}
else
{
await context.Response.WriteAsync("SUCCESS:" + debugPort);
}
}
}
*/

[Route("{instanceId}/webssh/host")]
public async Task<string> SSH(string instanceId)
{
if(K8SEDeploymentHelper.IsK8SEEnvironment())
Expand All @@ -48,12 +92,8 @@ public async Task<string> SSH(string instanceId)
return "Invalid instance";
}

HttpContext.Request.Headers["WEBSHITE_SSH_USER"] = "root";
HttpContext.Request.Headers["WEBSHITE_SSH_PASSWORD"] = "Docker!";
HttpContext.Request.Headers["WEBSHITE_SSH_IP"] = instance.IpAddress;

var targetUri = BuildTargetUri(HttpContext.Request, instanceId);
var targetRequestMessage = CreateTargetMessage(HttpContext, targetUri);
var targetRequestMessage = CreateTargetMessage(HttpContext, targetUri, instance);

using (var responseMessage = await _httpClient.SendAsync(targetRequestMessage, HttpCompletionOption.ResponseHeadersRead, HttpContext.RequestAborted))
{
Expand All @@ -65,7 +105,7 @@ public async Task<string> SSH(string instanceId)
return null;
}

private HttpRequestMessage CreateTargetMessage(HttpContext context, Uri targetUri)
private HttpRequestMessage CreateTargetMessage(HttpContext context, Uri targetUri, PodInstance instance)
{
var requestMessage = new HttpRequestMessage();
CopyFromOriginalRequestContentAndHeaders(context, requestMessage);
Expand All @@ -74,6 +114,10 @@ private HttpRequestMessage CreateTargetMessage(HttpContext context, Uri targetUr
requestMessage.Headers.Host = targetUri.Host;
requestMessage.Method = GetMethod(context.Request.Method);

requestMessage.Headers.Add("WEBSITE_SSH_USER", "root");
requestMessage.Headers.Add("WEBSITE_SSH_PASSWORD", "Docker!");
requestMessage.Headers.Add("WEBSITE_SSH_IP", instance.IpAddress);

return requestMessage;
}

Expand Down Expand Up @@ -124,11 +168,15 @@ private static HttpMethod GetMethod(string method)
private Uri BuildTargetUri(HttpRequest request, string instanceId)
{
Uri targetUri = null;

if (request.Path.StartsWithSegments($"/instance/{instanceId}", out var remainingPath))
var scheme = request.Scheme;
if(scheme.Equals("https", StringComparison.OrdinalIgnoreCase))
{
scheme = "http";
}
if (request.Path.StartsWithSegments($"/instances/{instanceId}", out var remainingPath))
{
Console.WriteLine("PATH STRING : " + remainingPath);
targetUri = new Uri("localhost:3000" + remainingPath);
targetUri = new Uri($"{scheme}://localhost:3000" + remainingPath);
}

return targetUri;
Expand Down

0 comments on commit 1fd3241

Please sign in to comment.