PowerShell/test/tools/WebListener/Controllers/LinkController.cs

117 lines
4.4 KiB
C#

// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text.RegularExpressions;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Http.Extensions;
using Microsoft.Extensions.Primitives;
using mvc.Models;
namespace mvc.Controllers
{
public class LinkController : Controller
{
public JsonResult Index()
{
if (!Request.Query.TryGetValue("maxlinks", out StringValues maxLinksSV) || !Int32.TryParse(maxLinksSV.FirstOrDefault(), out int maxLinks) || maxLinks < 1)
{
maxLinks = 3;
}
if (!Request.Query.TryGetValue("linknumber", out StringValues linkNumberSV) || !Int32.TryParse(linkNumberSV.FirstOrDefault(), out int linkNumber) || linkNumber < 1)
{
linkNumber = 1;
}
string baseUri = Regex.Replace(UriHelper.GetDisplayUrl(Request), "\\?.*", string.Empty);
string type = Request.Query.TryGetValue("type", out StringValues typeSV) ? typeSV.FirstOrDefault() : "default";
string whitespace = " ";
if (type.ToUpper() == "EXTRAWHITESPACE")
{
whitespace = " ";
}
else if (type.ToUpper() == "NOWHITESPACE")
{
whitespace = string.Empty;
}
var linkList = new List<string>();
if (maxLinks > 1 && linkNumber > 1)
{
linkList.Add(GetLink(baseUri: baseUri, maxLinks: maxLinks, linkNumber: linkNumber - 1, type: type, whitespace: whitespace, rel: "prev"));
}
linkList.Add(GetLink(baseUri: baseUri, maxLinks: maxLinks, linkNumber: maxLinks, type: type, whitespace: whitespace, rel: "last"));
linkList.Add(GetLink(baseUri: baseUri, maxLinks: maxLinks, linkNumber: 1, type: type, whitespace: whitespace, rel: "first"));
linkList.Add(GetLink(baseUri: baseUri, maxLinks: maxLinks, linkNumber: linkNumber, type: type, whitespace: whitespace, rel: "self"));
bool sendMultipleHeaders = false;
bool skipNextLink = false;
switch (type.ToUpper())
{
case "NOURL":
linkList.Add(Constants.NoUrlLinkHeader);
skipNextLink = true;
break;
case "MALFORMED":
linkList.Add(Constants.MalformedUrlLinkHeader);
skipNextLink = true;
break;
case "NOREL":
linkList.Add(Constants.NoRelLinkHeader);
skipNextLink = true;
break;
case "MULTIPLE":
sendMultipleHeaders = true;
break;
default:
break;
}
if (!skipNextLink && maxLinks > 1 && linkNumber < maxLinks)
{
linkList.Add(GetLink(baseUri: baseUri, maxLinks: maxLinks, linkNumber: linkNumber + 1, type: type, whitespace: whitespace, rel: "next"));
}
StringValues linkHeader;
if (sendMultipleHeaders)
{
linkHeader = linkList.ToArray();
}
else
{
linkHeader = string.Join(",", linkList);
}
Response.Headers.Add("Link", linkHeader);
// Generate /Get/ result and append linknumber, maxlinks, and type
var getController = new GetController();
getController.ControllerContext = this.ControllerContext;
var result = getController.Index();
var output = result.Value as Hashtable;
output.Add("linknumber", linkNumber);
output.Add("maxlinks", maxLinks);
output.Add("type", type.FirstOrDefault());
return result;
}
public IActionResult Error()
{
return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
}
private static string GetLink(string baseUri, int maxLinks, int linkNumber, string whitespace, string type, string rel)
{
return string.Format(Constants.LinkUriTemplate, baseUri, maxLinks, linkNumber, type, whitespace, rel);
}
}
}