forked from ServiceStack/ServiceStack
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathServiceExtensions.cs
More file actions
106 lines (94 loc) · 3.12 KB
/
ServiceExtensions.cs
File metadata and controls
106 lines (94 loc) · 3.12 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
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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
using System;
using System.Net;
using ServiceStack.CacheAccess;
using ServiceStack.CacheAccess.Providers;
using ServiceStack.Common.Web;
using ServiceStack.Redis;
using ServiceStack.ServiceHost;
using ServiceStack.ServiceInterface.Auth;
using ServiceStack.Text;
using ServiceStack.WebHost.Endpoints;
namespace ServiceStack.ServiceInterface
{
public static class ServiceExtensions
{
public static string AddQueryParam(this string url, string key, string val)
{
var prefix = url.IndexOf('?') == -1 ? "?" : "&";
return url + prefix + key + "=" + val.UrlEncode();
}
public static IHttpResult Redirect(this IServiceBase service, string url)
{
return service.Redirect(url, "Moved Temporarily");
}
public static IHttpResult Redirect(this IServiceBase service, string url, string message)
{
return new HttpResult(HttpStatusCode.Redirect, message) {
ContentType = service.RequestContext.ResponseContentType,
Headers = {
{ HttpHeaders.Location, url }
},
};
}
public static IHttpResult AuthenticationRequired(this IServiceBase service)
{
return new HttpResult {
StatusCode = HttpStatusCode.Unauthorized,
ContentType = service.RequestContext.ResponseContentType,
Headers = {
{ HttpHeaders.WwwAuthenticate, "OAuth realm=\"{0}\"".Fmt(AuthService.DefaultOAuthRealm) }
},
};
}
public static string GetSessionId(this IServiceBase service)
{
var req = service.RequestContext.Get<IHttpRequest>();
var id = req.GetPermanentSessionId();
if (id == null)
throw new ArgumentNullException("Session not set. Is Session being set in RequestFilters?");
return id;
}
/// <summary>
/// If they don't have an ICacheClient configured use an In Memory one.
/// </summary>
private static readonly MemoryCacheClient DefaultCache = new MemoryCacheClient { DontDispose = true };
public static ICacheClient GetCacheClient(this IServiceBase service)
{
return service.TryResolve<ICacheClient>()
?? (ICacheClient)service.TryResolve<IRedisClientsManager>()
?? DefaultCache;
}
public static ICacheClient GetCacheClient(this IAppHost appHost)
{
return appHost.TryResolve<ICacheClient>()
?? (ICacheClient)appHost.TryResolve<IRedisClientsManager>()
?? DefaultCache;
}
public static void SaveSession(this IServiceBase service, IOAuthSession session)
{
using (var cache = service.GetCacheClient())
{
var sessionKey = AuthService.GetSessionKey(service.GetSessionId());
cache.Set(sessionKey, session);
}
}
public static IOAuthSession GetSession(this IServiceBase service)
{
using (var cache = service.GetCacheClient())
{
return GetSession(cache, service.GetSessionId());
}
}
public static IOAuthSession GetSession(this ICacheClient cache, string sessionId)
{
var session = cache.Get<IOAuthSession>(AuthService.GetSessionKey(sessionId));
if (session == null)
{
session = AuthService.SessionFactory();
session.Id = sessionId;
session.CreatedAt = session.LastModified = DateTime.UtcNow;
}
return session;
}
}
}