9
9
using System . Threading . Tasks ;
10
10
using Titanium . Web . Proxy . Helpers ;
11
11
using Titanium . Web . Proxy . Models ;
12
+ using System . Linq ;
13
+ using Titanium . Web . Proxy . Extensions ;
12
14
13
15
namespace Titanium . Web . Proxy . Network
14
16
{
15
17
public class Request
16
18
{
17
- public string Method { get ; internal set ; }
18
- public Uri RequestUri { get ; internal set ; }
19
- public string HttpVersion { get ; internal set ; }
19
+ public string Method { get ; set ; }
20
+ public Uri RequestUri { get ; set ; }
21
+ public string HttpVersion { get ; set ; }
20
22
21
- public string Status { get ; internal set ; }
22
- public int ContentLength { get ; internal set ; }
23
- public bool SendChunked { get ; internal set ; }
24
- public string ContentType { get ; internal set ; }
25
- public bool KeepAlive { get ; internal set ; }
26
- public string Hostname { get ; internal set ; }
23
+ public string Host
24
+ {
25
+ get
26
+ {
27
+ var host = RequestHeaders . FirstOrDefault ( x => x . Name . ToLower ( ) == "host" ) ;
28
+ if ( host != null )
29
+ return host . Value ;
30
+ return null ;
31
+ }
32
+ set
33
+ {
34
+ var host = RequestHeaders . FirstOrDefault ( x => x . Name . ToLower ( ) == "host" ) ;
35
+ if ( host != null )
36
+ host . Value = value ;
37
+ else
38
+ RequestHeaders . Add ( new HttpHeader ( "Host" , value ) ) ;
39
+ }
40
+ }
27
41
28
- public string Url { get ; internal set ; }
42
+ public int ContentLength
43
+ {
44
+ get
45
+ {
46
+ var header = RequestHeaders . FirstOrDefault ( x => x . Name . ToLower ( ) == "content-length" ) ;
47
+
48
+ if ( header == null )
49
+ return 0 ;
50
+
51
+ int contentLen ;
52
+ int . TryParse ( header . Value , out contentLen ) ;
53
+ if ( contentLen != 0 )
54
+ return contentLen ;
55
+
56
+ return 0 ;
57
+ }
58
+ set
59
+ {
60
+ var header = RequestHeaders . FirstOrDefault ( x => x . Name . ToLower ( ) == "content-length" ) ;
61
+
62
+ if ( header != null )
63
+ header . Value = value . ToString ( ) ;
64
+ else
65
+ RequestHeaders . Add ( new HttpHeader ( "content-length" , value . ToString ( ) ) ) ;
66
+ }
67
+ }
68
+
69
+ public string ContentType
70
+ {
71
+ get
72
+ {
73
+ var header = RequestHeaders . FirstOrDefault ( x => x . Name . ToLower ( ) == "content-type" ) ;
74
+ if ( header != null )
75
+ return header . Value ;
76
+ return null ;
77
+ }
78
+ set
79
+ {
80
+ var header = RequestHeaders . FirstOrDefault ( x => x . Name . ToLower ( ) == "content-type" ) ;
81
+
82
+ if ( header != null )
83
+ header . Value = value . ToString ( ) ;
84
+ else
85
+ RequestHeaders . Add ( new HttpHeader ( "content-type" , value . ToString ( ) ) ) ;
86
+ }
87
+
88
+ }
89
+
90
+ public bool SendChunked
91
+ {
92
+ get
93
+ {
94
+ var header = RequestHeaders . FirstOrDefault ( x => x . Name . ToLower ( ) == "transfer-encoding" ) ;
95
+ if ( header != null ) return header . Value . ToLower ( ) . Contains ( "chunked" ) ;
96
+ return false ;
97
+ }
98
+ }
99
+
100
+ public string Url { get { return RequestUri . OriginalString ; } }
101
+
102
+ internal Encoding Encoding { get { return this . GetEncoding ( ) ; } }
29
103
30
- internal Encoding Encoding { get ; set ; }
31
- internal bool IsAlive { get ; set ; }
32
104
internal bool CancelRequest { get ; set ; }
105
+
33
106
internal byte [ ] RequestBody { get ; set ; }
34
107
internal string RequestBodyString { get ; set ; }
35
108
internal bool RequestBodyRead { get ; set ; }
36
- internal bool UpgradeToWebSocket { get ; set ; }
37
- public List < HttpHeader > RequestHeaders { get ; internal set ; }
38
109
internal bool RequestLocked { get ; set ; }
39
110
111
+ internal bool UpgradeToWebSocket
112
+ {
113
+ get
114
+ {
115
+ var header = RequestHeaders . FirstOrDefault ( x => x . Name . ToLower ( ) == "upgrade" ) ;
116
+ if ( header == null )
117
+ return false ;
118
+
119
+ if ( header . Value . ToLower ( ) == "websocket" )
120
+ return true ;
121
+
122
+ return false ;
123
+
124
+ }
125
+ }
126
+
127
+ public List < HttpHeader > RequestHeaders { get ; set ; }
128
+
129
+
40
130
public Request ( )
41
131
{
42
132
this . RequestHeaders = new List < HttpHeader > ( ) ;
@@ -46,29 +136,32 @@ public Request()
46
136
47
137
public class Response
48
138
{
139
+ public string ResponseStatusCode { get ; set ; }
140
+ public string ResponseStatusDescription { get ; set ; }
49
141
50
142
internal Encoding Encoding { get ; set ; }
51
143
internal Stream ResponseStream { get ; set ; }
52
144
internal byte [ ] ResponseBody { get ; set ; }
53
145
internal string ResponseBodyString { get ; set ; }
54
146
internal bool ResponseBodyRead { get ; set ; }
55
147
internal bool ResponseLocked { get ; set ; }
56
- public List < HttpHeader > ResponseHeaders { get ; internal set ; }
57
148
internal string CharacterSet { get ; set ; }
58
149
internal string ContentEncoding { get ; set ; }
59
150
internal string HttpVersion { get ; set ; }
60
- public string ResponseStatusCode { get ; internal set ; }
61
- public string ResponseStatusDescription { get ; internal set ; }
62
151
internal bool ResponseKeepAlive { get ; set ; }
152
+
63
153
public string ContentType { get ; internal set ; }
154
+
64
155
internal int ContentLength { get ; set ; }
65
156
internal bool IsChunked { get ; set ; }
66
157
158
+ public List < HttpHeader > ResponseHeaders { get ; internal set ; }
159
+
67
160
public Response ( )
68
161
{
69
162
this . ResponseHeaders = new List < HttpHeader > ( ) ;
70
163
this . ResponseKeepAlive = true ;
71
- }
164
+ }
72
165
}
73
166
74
167
public class HttpWebSession
@@ -129,7 +222,7 @@ public void ReceiveResponse()
129
222
{
130
223
var httpResult = ProxyClient . ServerStreamReader . ReadLine ( ) . Split ( new char [ ] { ' ' } , 3 ) ;
131
224
132
- if ( string . IsNullOrEmpty ( httpResult [ 0 ] ) )
225
+ if ( string . IsNullOrEmpty ( httpResult [ 0 ] ) )
133
226
{
134
227
var s = ProxyClient . ServerStreamReader . ReadLine ( ) ;
135
228
}
0 commit comments