-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathLinkHeader.cs
More file actions
64 lines (54 loc) · 2.05 KB
/
LinkHeader.cs
File metadata and controls
64 lines (54 loc) · 2.05 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
using System.Text.RegularExpressions;
namespace GithubApi;
public class LinkHeader
{
public string? FirstLink { get; private set; }
public string? PrevLink { get; private set; }
public string? NextLink { get; private set; }
public string? LastLink { get; private set; }
public bool HasNext { get => this.NextLink != null; }
public static LinkHeader LinksFromHeader(HttpResponseMessage httpResponseMessage)
{
LinkHeader linkHeader = new();
if (httpResponseMessage.Headers.Contains("Link"))
{
linkHeader = LinksFromHeader(httpResponseMessage.Headers.GetValues("Link").FirstOrDefault(""));
}
return linkHeader;
}
public static LinkHeader LinksFromHeader(string linkHeaderStr)
{
LinkHeader linkHeader = new();
string[] linkStrings = linkHeaderStr.Split(',');
if (linkStrings.Length != 0)
{
linkHeader = new LinkHeader();
foreach (string linkString in linkStrings)
{
var relMatch = Regex.Match(linkString, "(?<=rel=\").+?(?=\")", RegexOptions.IgnoreCase);
var linkMatch = Regex.Match(linkString, "(?<=<).+?(?=>)", RegexOptions.IgnoreCase);
if (relMatch.Success && linkMatch.Success)
{
string rel = relMatch.Value.ToUpper();
string link = linkMatch.Value;
switch (rel)
{
case "FIRST":
linkHeader.FirstLink = link;
break;
case "PREV":
linkHeader.PrevLink = link;
break;
case "NEXT":
linkHeader.NextLink = link;
break;
case "LAST":
linkHeader.LastLink = link;
break;
}
}
}
}
return linkHeader;
}
}