-
Notifications
You must be signed in to change notification settings - Fork 116
/
VersionFinder.cs
91 lines (79 loc) · 2.68 KB
/
VersionFinder.cs
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
using System.Linq;
using System.Net.Http;
namespace Apress.Recipes.WebApi
{
public class VersionFinder
{
private static bool NeedsAcceptVersioning(HttpRequestMessage request, out string version)
{
if (request.Headers.Accept.Any())
{
var acceptHeaderVersion =
request.Headers.Accept.FirstOrDefault(x => x.MediaType.Contains("vnd.apress.recipes.webapi"));
if (acceptHeaderVersion != null && acceptHeaderVersion.MediaType.Contains("-v") &&
acceptHeaderVersion.MediaType.Contains("+"))
{
version = acceptHeaderVersion.MediaType.Between("-v", "+");
return true;
}
}
version = null;
return false;
}
private static bool NeedsHeaderVersioning(HttpRequestMessage request, out string version)
{
if (request.Headers.Contains("ApiVersion"))
{
version = request.Headers.GetValues("ApiVersion").FirstOrDefault();
if (version != null)
{
return true;
}
}
version = null;
return false;
}
private static bool NeedsUriVersioning(HttpRequestMessage request, out string version)
{
var routeData = request.GetRouteData();
if (routeData != null)
{
object versionFromRoute;
if (routeData.Values.TryGetValue("version", out versionFromRoute))
{
version = versionFromRoute as string;
if (!string.IsNullOrWhiteSpace(version))
{
return true;
}
}
}
version = null;
return false;
}
private static int VersionToInt(string versionString)
{
int version;
if (string.IsNullOrEmpty(versionString) || !int.TryParse(versionString, out version))
return 0;
return version;
}
public int GetVersionFromRequest(HttpRequestMessage request)
{
string version;
if (NeedsUriVersioning(request, out version))
{
return VersionToInt(version);
}
if (NeedsAcceptVersioning(request, out version))
{
return VersionToInt(version);
}
if (NeedsHeaderVersioning(request, out version))
{
return VersionToInt(version);
}
return 0;
}
}
}