This repository has been archived by the owner on Apr 15, 2023. It is now read-only.
/
NancyRequestDelegate.cs
88 lines (76 loc) · 3.2 KB
/
NancyRequestDelegate.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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Nancy;
using Kayak.Http;
using Nancy.Helpers;
using System.IO;
namespace CloudlogCAT.HttpServer
{
internal sealed class NancyRequestDelegate : IHttpRequestDelegate
{
private INancyEngine m_Engine;
public NancyRequestDelegate(INancyEngine engine)
{
m_Engine = engine;
}
public void OnRequest(HttpRequestHead head, Kayak.IDataProducer body, IHttpResponseDelegate response)
{
BufferedConsumer requestConsumer = new BufferedConsumer(bodyStream => RequestReadCompleted(head, bodyStream, response), RequestReadError);
body.Connect(requestConsumer);
}
private void RequestReadCompleted(HttpRequestHead head, Stream requestStream, IHttpResponseDelegate response)
{
#warning wrong hard-coded base URI
Uri baseUri = new Uri("http://localhost:8083/");
Uri requestUrl = new Uri(baseUri, head.Uri);
Url nancyUrl = new Url
{
Scheme = requestUrl.Scheme,
HostName = requestUrl.Host,
Port = requestUrl.IsDefaultPort ? null : (int?)requestUrl.Port,
BasePath = baseUri.AbsolutePath.TrimEnd('/'),
Path = HttpUtility.UrlDecode(head.Uri),
Query = requestUrl.Query,
Fragment = requestUrl.Fragment,
};
Dictionary<string, IEnumerable<string>> headers = new Dictionary<string, IEnumerable<string>>();
foreach (var kvp in head.Headers)
headers[kvp.Key] = new List<string> { kvp.Value };
Request req = new Request(
head.Method,
nancyUrl,
Nancy.IO.RequestStream.FromStream(requestStream, requestStream.Length),
headers,
null);
m_Engine.HandleRequest(req, context => RequestProcessingCompleted(context, response), ex => RequestProcessingError(ex, response));
}
private void RequestReadError(Exception ex)
{
throw new NotImplementedException();
}
private void RequestProcessingCompleted(NancyContext context, IHttpResponseDelegate response)
{
HttpResponseHead responseHead = new HttpResponseHead {
Headers = context.Response.Headers,
Status = context.Response.StatusCode.ToString()
};
byte[] responseBodyData;
using (MemoryStream ms = new MemoryStream())
{
context.Response.Contents(ms);
//ms.Seek(0, SeekOrigin.Begin);
responseBodyData = ms.ToArray();
}
responseHead.Headers["Content-Type"] = context.Response.ContentType;
responseHead.Headers["Content-Length"] = responseBodyData.LongLength.ToString();
BufferedProducer bodyDataProducer = new BufferedProducer (responseBodyData);
response.OnResponse(responseHead, bodyDataProducer);
}
private void RequestProcessingError(Exception ex, IHttpResponseDelegate response)
{
throw new NotImplementedException();
}
}
}