1
- /*
1
+ /*
2
2
MIT LICENSE
3
3
4
4
Copyright 2017 Digital Ruby, LLC - http://www.digitalruby.com
@@ -14,7 +14,6 @@ The above copyright notice and this permission notice shall be included in all c
14
14
using System . Collections . Generic ;
15
15
using System . IO ;
16
16
using System . Net ;
17
- using System . Text ;
18
17
using System . Threading . Tasks ;
19
18
20
19
namespace ExchangeSharp
@@ -27,79 +26,93 @@ public sealed class APIRequestMaker : IAPIRequestMaker
27
26
{
28
27
private readonly IAPIRequestHandler api ;
29
28
30
- private class InternalHttpWebRequest : IHttpWebRequest
29
+ internal class InternalHttpWebRequest : IHttpWebRequest
31
30
{
32
- internal readonly HttpWebRequest request ;
31
+ internal readonly HttpWebRequest Request ;
32
+ internal static WebProxy Proxy ;
33
+
34
+ static InternalHttpWebRequest ( )
35
+ {
36
+ var httpProxy = Environment . GetEnvironmentVariable ( "http_proxy" ) ;
37
+ httpProxy ??= Environment . GetEnvironmentVariable ( "HTTP_PROXY" ) ;
38
+
39
+ if ( string . IsNullOrEmpty ( httpProxy ) )
40
+ return ;
41
+
42
+ var uri = new Uri ( httpProxy ) ;
43
+ Proxy = new WebProxy ( uri ) ;
44
+ }
33
45
34
46
public InternalHttpWebRequest ( Uri fullUri )
35
47
{
36
- request = ( HttpWebRequest . Create ( fullUri ) as HttpWebRequest ?? throw new NullReferenceException ( "Failed to create HttpWebRequest" ) ) ;
37
- request . KeepAlive = false ;
48
+ Request = ( HttpWebRequest . Create ( fullUri ) as HttpWebRequest ?? throw new NullReferenceException ( "Failed to create HttpWebRequest" ) ) ;
49
+ Request . Proxy = Proxy ;
50
+ Request . KeepAlive = false ;
38
51
}
39
52
40
53
public void AddHeader ( string header , string value )
41
54
{
42
55
switch ( header . ToStringLowerInvariant ( ) )
43
56
{
44
57
case "content-type" :
45
- request . ContentType = value ;
58
+ Request . ContentType = value ;
46
59
break ;
47
60
48
61
case "content-length" :
49
- request . ContentLength = value . ConvertInvariant < long > ( ) ;
62
+ Request . ContentLength = value . ConvertInvariant < long > ( ) ;
50
63
break ;
51
64
52
65
case "user-agent" :
53
- request . UserAgent = value ;
66
+ Request . UserAgent = value ;
54
67
break ;
55
68
56
69
case "accept" :
57
- request . Accept = value ;
70
+ Request . Accept = value ;
58
71
break ;
59
72
60
73
case "connection" :
61
- request . Connection = value ;
74
+ Request . Connection = value ;
62
75
break ;
63
76
64
77
default :
65
- request . Headers [ header ] = value ;
78
+ Request . Headers [ header ] = value ;
66
79
break ;
67
80
}
68
81
}
69
82
70
83
public Uri RequestUri
71
84
{
72
- get { return request . RequestUri ; }
85
+ get { return Request . RequestUri ; }
73
86
}
74
87
75
88
public string Method
76
89
{
77
- get { return request . Method ; }
78
- set { request . Method = value ; }
90
+ get { return Request . Method ; }
91
+ set { Request . Method = value ; }
79
92
}
80
93
81
94
public int Timeout
82
95
{
83
- get { return request . Timeout ; }
84
- set { request . Timeout = value ; }
96
+ get { return Request . Timeout ; }
97
+ set { Request . Timeout = value ; }
85
98
}
86
99
87
100
public int ReadWriteTimeout
88
101
{
89
- get { return request . ReadWriteTimeout ; }
90
- set { request . ReadWriteTimeout = value ; }
102
+ get { return Request . ReadWriteTimeout ; }
103
+ set { Request . ReadWriteTimeout = value ; }
91
104
}
92
105
93
106
public async Task WriteAllAsync ( byte [ ] data , int index , int length )
94
107
{
95
- using ( Stream stream = await request . GetRequestStreamAsync ( ) )
108
+ using ( Stream stream = await Request . GetRequestStreamAsync ( ) )
96
109
{
97
110
await stream . WriteAsync ( data , 0 , data . Length ) ;
98
111
}
99
112
}
100
113
}
101
114
102
- private class InternalHttpWebResponse : IHttpWebResponse
115
+ internal class InternalHttpWebResponse : IHttpWebResponse
103
116
{
104
117
private readonly HttpWebResponse response ;
105
118
@@ -175,7 +188,7 @@ public async Task<string> MakeRequestAsync(string url, string? baseUrl = null, D
175
188
try
176
189
{
177
190
RequestStateChanged ? . Invoke ( this , RequestMakerState . Begin , uri . AbsoluteUri ) ; // when start make a request we send the uri, this helps developers to track the http requests.
178
- response = await request . request . GetResponseAsync ( ) as HttpWebResponse ;
191
+ response = await request . Request . GetResponseAsync ( ) as HttpWebResponse ;
179
192
if ( response == null )
180
193
{
181
194
throw new APIException ( "Unknown response from server" ) ;
@@ -191,16 +204,19 @@ public async Task<string> MakeRequestAsync(string url, string? baseUrl = null, D
191
204
}
192
205
using ( Stream responseStream = response . GetResponseStream ( ) )
193
206
using ( StreamReader responseStreamReader = new StreamReader ( responseStream ) )
194
- responseString = responseStreamReader . ReadToEnd ( ) ;
207
+ responseString = responseStreamReader . ReadToEnd ( ) ;
208
+
195
209
if ( response . StatusCode != HttpStatusCode . OK )
196
210
{
197
- // 404 maybe return empty responseString
198
- if ( string . IsNullOrWhiteSpace ( responseString ) )
199
- {
211
+ // 404 maybe return empty responseString
212
+ if ( string . IsNullOrWhiteSpace ( responseString ) )
213
+ {
200
214
throw new APIException ( string . Format ( "{0} - {1}" , response . StatusCode . ConvertInvariant < int > ( ) , response . StatusCode ) ) ;
201
- }
202
- throw new APIException ( responseString ) ;
215
+ }
216
+
217
+ throw new APIException ( responseString ) ;
203
218
}
219
+
204
220
api . ProcessResponse ( new InternalHttpWebResponse ( response ) ) ;
205
221
RequestStateChanged ? . Invoke ( this , RequestMakerState . Finished , responseString ) ;
206
222
}
0 commit comments