-
Notifications
You must be signed in to change notification settings - Fork 72
Expand file tree
/
Copy pathAsyncResourceHandler.cs
More file actions
89 lines (73 loc) · 2.89 KB
/
AsyncResourceHandler.cs
File metadata and controls
89 lines (73 loc) · 2.89 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
using System.IO;
using System.Text;
using Xilium.CefGlue;
using Xilium.CefGlue.Common.Handlers;
namespace WebViewControl {
internal class AsyncResourceHandler : DefaultResourceHandler {
private CefCallback responseCallback;
private bool autoDisposeStream;
private object SyncRoot { get; } = new object();
protected override RequestHandlingFashion ProcessRequestAsync(CefRequest request, CefCallback callback) {
lock (SyncRoot) {
if (Response == null && string.IsNullOrEmpty(RedirectUrl)) {
responseCallback = callback;
return RequestHandlingFashion.ContinueAsync;
}
return RequestHandlingFashion.Continue;
}
}
public void SetResponse(string response, string mimeType = null) {
var responseStream = GetMemoryStream(response, Encoding.UTF8, includePreamble: true);
SetResponse(responseStream, mimeType, autoDisposeStream);
}
public void SetResponse(Stream response, string mimeType = null, bool autoDisposeStream = false) {
lock (SyncRoot) {
Response = response;
MimeType = mimeType;
this.autoDisposeStream = autoDisposeStream;
}
}
public void RedirectTo(string targetUrl) {
lock (SyncRoot) {
RedirectUrl = targetUrl;
}
}
public void Continue() {
lock (SyncRoot) {
if (responseCallback != null) {
using (responseCallback) {
responseCallback.Continue();
}
}
}
}
public static DefaultResourceHandler FromText(string text) {
var handler = new AsyncResourceHandler();
handler.SetResponse(text);
return handler;
}
private static MemoryStream GetMemoryStream(string text, Encoding encoding, bool includePreamble = true) {
if (includePreamble) {
var preamble = encoding.GetPreamble();
var bytes = encoding.GetBytes(text);
var memoryStream = new MemoryStream(preamble.Length + bytes.Length);
memoryStream.Write(preamble, 0, preamble.Length);
memoryStream.Write(bytes, 0, bytes.Length);
memoryStream.Position = 0;
return memoryStream;
}
return new MemoryStream(encoding.GetBytes(text));
}
protected override void Dispose(bool disposing) {
base.Dispose(disposing);
if (autoDisposeStream) {
var response = Response;
if (response != null) {
lock (SyncRoot) {
response.Dispose();
}
}
}
}
}
}