99using System . Threading . Tasks ;
1010using Titanium . Web . Proxy . Helpers ;
1111using Titanium . Web . Proxy . Models ;
12+ using System . Linq ;
13+ using Titanium . Web . Proxy . Extensions ;
1214
1315namespace Titanium . Web . Proxy . Network
1416{
1517 public class Request
1618 {
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 ; }
2022
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+ }
2741
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 ( ) ; } }
29103
30- internal Encoding Encoding { get ; set ; }
31- internal bool IsAlive { get ; set ; }
32104 internal bool CancelRequest { get ; set ; }
105+
33106 internal byte [ ] RequestBody { get ; set ; }
34107 internal string RequestBodyString { get ; set ; }
35108 internal bool RequestBodyRead { get ; set ; }
36- internal bool UpgradeToWebSocket { get ; set ; }
37- public List < HttpHeader > RequestHeaders { get ; internal set ; }
38109 internal bool RequestLocked { get ; set ; }
39110
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+
40130 public Request ( )
41131 {
42132 this . RequestHeaders = new List < HttpHeader > ( ) ;
@@ -46,29 +136,32 @@ public Request()
46136
47137 public class Response
48138 {
139+ public string ResponseStatusCode { get ; set ; }
140+ public string ResponseStatusDescription { get ; set ; }
49141
50142 internal Encoding Encoding { get ; set ; }
51143 internal Stream ResponseStream { get ; set ; }
52144 internal byte [ ] ResponseBody { get ; set ; }
53145 internal string ResponseBodyString { get ; set ; }
54146 internal bool ResponseBodyRead { get ; set ; }
55147 internal bool ResponseLocked { get ; set ; }
56- public List < HttpHeader > ResponseHeaders { get ; internal set ; }
57148 internal string CharacterSet { get ; set ; }
58149 internal string ContentEncoding { get ; set ; }
59150 internal string HttpVersion { get ; set ; }
60- public string ResponseStatusCode { get ; internal set ; }
61- public string ResponseStatusDescription { get ; internal set ; }
62151 internal bool ResponseKeepAlive { get ; set ; }
152+
63153 public string ContentType { get ; internal set ; }
154+
64155 internal int ContentLength { get ; set ; }
65156 internal bool IsChunked { get ; set ; }
66157
158+ public List < HttpHeader > ResponseHeaders { get ; internal set ; }
159+
67160 public Response ( )
68161 {
69162 this . ResponseHeaders = new List < HttpHeader > ( ) ;
70163 this . ResponseKeepAlive = true ;
71- }
164+ }
72165 }
73166
74167 public class HttpWebSession
@@ -129,7 +222,7 @@ public void ReceiveResponse()
129222 {
130223 var httpResult = ProxyClient . ServerStreamReader . ReadLine ( ) . Split ( new char [ ] { ' ' } , 3 ) ;
131224
132- if ( string . IsNullOrEmpty ( httpResult [ 0 ] ) )
225+ if ( string . IsNullOrEmpty ( httpResult [ 0 ] ) )
133226 {
134227 var s = ProxyClient . ServerStreamReader . ReadLine ( ) ;
135228 }
0 commit comments