forked from bonesoul/uhttpsharp
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathHttpResponse.cs
More file actions
96 lines (87 loc) · 3.66 KB
/
Copy pathHttpResponse.cs
File metadata and controls
96 lines (87 loc) · 3.66 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
/*
* Copyright (C) 2011 uhttpsharp project - http://github.com/raistlinthewiz/uhttpsharp
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
using System;
using System.Collections.Generic;
using System.IO;
namespace uhttpsharp
{
public sealed class HttpResponse
{
private readonly Dictionary<int, string> _responseTexts =
new Dictionary<int, string>
{
{200, "OK"},
{302, "Found"},
{303, "See Other"},
{400, "BadRequest"},
{404, "Not Found"},
{502, "Server Busy"},
{500, "Internal Server Error"}
};
public string Protocol { get; private set; }
public string ContentType { get; private set; }
public bool CloseConnection { get; private set; }
public HttpResponseCode Code { get; private set; }
private Stream ContentStream { get; set; }
public HttpResponse(HttpResponseCode code, string content)
: this(code, "text/html; charset=utf-8", StringToStream(content))
{
}
public HttpResponse(string contentType, Stream contentStream)
: this(HttpResponseCode.Ok, contentType, contentStream)
{
}
private HttpResponse(HttpResponseCode code, string contentType, Stream contentStream)
{
Protocol = "HTTP/1.1";
ContentType = contentType;
CloseConnection = false;
Code = code;
ContentStream = contentStream;
}
public static HttpResponse CreateWithMessage(HttpResponseCode code, string message, string body = "")
{
return new HttpResponse(
code,
string.Format(
"<html><head><title>{0}</title></head><body><h1>{1}</h1><hr><b>{0}</b>{2}</body></html>",
HttpServer.Instance.Banner, message, body));
}
private static Stream StringToStream(string content)
{
var stream = new MemoryStream();
var writer = new StreamWriter(stream);
writer.Write(content);
writer.Flush();
return stream;
}
public void WriteResponse(Stream stream)
{
var writer = new StreamWriter(stream) {NewLine = "\r\n"};
writer.WriteLine("{0} {1} {2}", Protocol, (int) Code, _responseTexts[(int) Code]);
writer.WriteLine("Date: {0}", DateTime.UtcNow.ToString("R"));
writer.WriteLine("Server: {0}", HttpServer.Instance.Banner);
writer.WriteLine("Connection: {0}", CloseConnection ? "close" : "Keep-Alive");
writer.WriteLine("Content-Type: {0}", ContentType);
writer.WriteLine("Content-Length: {0}", ContentStream.Length);
writer.WriteLine();
writer.Flush();
ContentStream.Position = 0;
ContentStream.CopyTo(stream);
ContentStream.Close();
}
}
}