using new HTTP Client for requests. Moving lots of stuff to Async... · aceb5c46e5 - SVN.BY: Go Git Service
Browse Source

using new HTTP Client for requests. Moving lots of stuff to Async...

Tiernan OToole 8 years ago
parent
commit
aceb5c46e5
3 changed files with 63 additions and 77 deletions
  1. 15 1
      B2Uploader/B2Uploader.csproj
  2. 43 74
      B2Uploader/Program.cs
  3. 5 2
      B2Uploader/packages.config

+ 15 - 1
B2Uploader/B2Uploader.csproj

@@ -64,11 +64,20 @@
64 64
       <Private>True</Private>
65 65
     </Reference>
66 66
     <Reference Include="NLog, Version=4.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL">
67
-      <HintPath>..\packages\NLog.4.2.2\lib\net45\NLog.dll</HintPath>
67
+      <HintPath>..\packages\NLog.4.2.3\lib\net45\NLog.dll</HintPath>
68 68
       <Private>True</Private>
69 69
     </Reference>
70 70
     <Reference Include="System" />
71 71
     <Reference Include="System.Core" />
72
+    <Reference Include="System.Net.Http.Extensions, Version=2.2.29.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
73
+      <HintPath>..\packages\Microsoft.Net.Http.2.2.29\lib\net45\System.Net.Http.Extensions.dll</HintPath>
74
+      <Private>True</Private>
75
+    </Reference>
76
+    <Reference Include="System.Net.Http.Primitives, Version=4.2.29.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
77
+      <HintPath>..\packages\Microsoft.Net.Http.2.2.29\lib\net45\System.Net.Http.Primitives.dll</HintPath>
78
+      <Private>True</Private>
79
+    </Reference>
80
+    <Reference Include="System.Net.Http.WebRequest" />
72 81
     <Reference Include="System.Xml.Linq" />
73 82
     <Reference Include="System.Data.DataSetExtensions" />
74 83
     <Reference Include="Microsoft.CSharp" />
@@ -104,6 +113,11 @@
104 113
     </PropertyGroup>
105 114
     <Error Condition="!Exists('$(SolutionDir)\.nuget\NuGet.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\.nuget\NuGet.targets'))" />
106 115
   </Target>
116
+  <Import Project="..\packages\Microsoft.Bcl.Build.1.0.14\tools\Microsoft.Bcl.Build.targets" Condition="Exists('..\packages\Microsoft.Bcl.Build.1.0.14\tools\Microsoft.Bcl.Build.targets')" />
117
+  <Target Name="EnsureBclBuildImported" BeforeTargets="BeforeBuild" Condition="'$(BclBuildImported)' == ''">
118
+    <Error Condition="!Exists('..\packages\Microsoft.Bcl.Build.1.0.14\tools\Microsoft.Bcl.Build.targets')" Text="This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=317567." HelpKeyword="BCLBUILD2001" />
119
+    <Error Condition="Exists('..\packages\Microsoft.Bcl.Build.1.0.14\tools\Microsoft.Bcl.Build.targets')" Text="The build restored NuGet packages. Build the project again to include these packages in the build. For more information, see http://go.microsoft.com/fwlink/?LinkID=317568." HelpKeyword="BCLBUILD2002" />
120
+  </Target>
107 121
   <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
108 122
        Other similar extension points exist, see Microsoft.Common.targets.
109 123
   <Target Name="BeforeBuild">

+ 43 - 74
B2Uploader/Program.cs

@@ -8,6 +8,7 @@ using System.Diagnostics;
8 8
 using System.IO;
9 9
 using System.Linq;
10 10
 using System.Net;
11
+using System.Net.Http;
11 12
 using System.Security.Cryptography;
12 13
 using System.Text;
13 14
 using System.Threading;
@@ -42,8 +43,7 @@ namespace B2Uploader
42 43
         static Logger logger = LogManager.GetCurrentClassLogger();
43 44
         static void Main(string[] args)
44 45
         {
45
-            var result = CommandLine.Parser.Default.ParseArguments<CmdLineOptions>(args);
46
-                      
46
+            var result = CommandLine.Parser.Default.ParseArguments<CmdLineOptions>(args);                      
47 47
 
48 48
             var existCode = result.MapResult(options => {
49 49
                 if (!Directory.Exists(options.Directory))
@@ -61,7 +61,7 @@ namespace B2Uploader
61 61
                 {
62 62
                     logger.Debug("Listing Buckets");
63 63
                 }
64
-                var buckets = ListBuckets(new ListBucketsRequest() { accountId = auth.accountId }, auth.authorizationToken, auth.apiUrl);
64
+                var buckets = ListBuckets(new ListBucketsRequest() { accountId = auth.accountId }, auth.authorizationToken, auth.apiUrl).Result;
65 65
 
66 66
                 var bucket = buckets.buckets.First();
67 67
 
@@ -134,7 +134,7 @@ namespace B2Uploader
134 134
                         while (!uploaded && retries < 3)
135 135
                         {
136 136
                             try {
137
-                                var uploadURL = GetUploadURL(new GetUploadURLRequest { bucketId = bucket.bucketId }, auth.apiUrl, auth.authorizationToken);
137
+                                var uploadURL = GetUploadURL(new GetUploadURLRequest { bucketId = bucket.bucketId }, auth.apiUrl, auth.authorizationToken).Result;
138 138
                                 var response = UploadFile(uploadURL.authorizationToken, "b2/x-auto", s, uploadURL.uploadUrl);
139 139
                                 if(response != null)
140 140
                                 {
@@ -176,13 +176,13 @@ namespace B2Uploader
176 176
             return JsonConvert.DeserializeObject<AuthorizeResponse>(responseString);
177 177
         }
178 178
 
179
-        static ListBucketsResponse ListBuckets(ListBucketsRequest request, string authToken, string apiUrl)
179
+        static async Task<ListBucketsResponse> ListBuckets(ListBucketsRequest request, string authToken, string apiUrl)
180 180
         {
181 181
             var headers = GetAuthHeaders(authToken);
182 182
 
183
-            string responseString = MakeRequest(apiUrl + "/b2api/v1/b2_list_buckets", headers, JsonConvert.SerializeObject(request));
184
-
185
-            return JsonConvert.DeserializeObject<ListBucketsResponse>(responseString);
183
+            string responseString = await MakeRequest2(apiUrl + "/b2api/v1/b2_list_buckets", headers, JsonConvert.SerializeObject(request));
184
+            
185
+            return  await Task.Factory.StartNew(() => JsonConvert.DeserializeObject<ListBucketsResponse>(responseString));
186 186
         }
187 187
 
188 188
         static List<Tuple<string,string>> GetAuthHeaders(string authToken)
@@ -192,13 +192,12 @@ namespace B2Uploader
192 192
             return headers;
193 193
         }
194 194
 
195
-        static GetUploadURLResponse GetUploadURL(GetUploadURLRequest request, string apiUrl, string authToken)
195
+        static async Task<GetUploadURLResponse> GetUploadURL(GetUploadURLRequest request, string apiUrl, string authToken)
196 196
         {
197
-
198 197
             var headers = GetAuthHeaders(authToken); 
199
-            string responseString = MakeRequest(apiUrl + "/b2api/v1/b2_get_upload_url", headers, JsonConvert.SerializeObject(request));
200
-            
201
-            return JsonConvert.DeserializeObject<GetUploadURLResponse>(responseString);
198
+            string responseString = await MakeRequest2(apiUrl + "/b2api/v1/b2_get_upload_url", headers, JsonConvert.SerializeObject(request));
199
+
200
+            return await Task.Factory.StartNew(() => JsonConvert.DeserializeObject<GetUploadURLResponse>(responseString));
202 201
         }
203 202
         static string getValidFilename(string input)
204 203
         {
@@ -223,86 +222,56 @@ namespace B2Uploader
223 222
             headers.Add(new Tuple<string, string>("X-Bz-File-Name", fileName));
224 223
             headers.Add(new Tuple<string, string>("X-Bz-Content-Sha1", sha1));
225 224
 
226
-            using (FileStream fs = System.IO.File.OpenRead(filePath))
227
-            {
228
-
229
-                string responseString = MakeRequest(uploadUrl, headers, fs, contentType);
225
+            
226
+            string responseString = MakeRequest2(uploadUrl, headers, filePath, true, contentType).Result;
230 227
 
231
-                var resp = JsonConvert.DeserializeObject<UploadFileResponse>(responseString);
228
+            var resp = JsonConvert.DeserializeObject<UploadFileResponse>(responseString);
232 229
 
233
-                if (resp.contentSha1 == sha1)
234
-                {
235
-                    Console.WriteLine(responseString);
236
-                    return resp;
237
-                }
238
-                else
239
-                {
240
-                    //something went wrong!
241
-                    return null;
242
-                }
230
+            if (resp.contentSha1 == sha1)
231
+            {
232
+                Console.WriteLine(responseString);
233
+                return resp;
243 234
             }
235
+            else
236
+            {
237
+                //something went wrong!
238
+                return null;
239
+            }
240
+            
244 241
         }
245 242
 
246 243
         static ListFileNamesResponse ListFileNames(ListFileNamesRequest request, string apiUrl, string authToken)
247 244
         {
248 245
             var headers = GetAuthHeaders(authToken);
249
-            string responseString =  MakeRequest(string.Format("{0}/b2api/v1/b2_list_file_names", apiUrl), headers, JsonConvert.SerializeObject(request));
246
+            string responseString =  MakeRequest2(string.Format("{0}/b2api/v1/b2_list_file_names", apiUrl), headers, JsonConvert.SerializeObject(request)).Result;
250 247
 
251 248
             return JsonConvert.DeserializeObject<ListFileNamesResponse>(responseString);
252 249
         }
253 250
 
254 251
 
255
-        static string MakeRequest(string url, List<Tuple<string,string>> headers, string data, string contentType = "application/json; charset=urf-8")
256
-        {
257
-            MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(data));
258
-            return MakeRequest(url, headers, ms, contentType);
259
-        }
260
-        
261
-        static string MakeRequest(string url, List<Tuple<string,string>> headers, Stream data, string contentType="application/json; charset=utf-8")
252
+        static async Task<string> MakeRequest2(string url, List<Tuple<string, string>> headers, string data, bool isFile = false, string contentType = "application/json; charset=utf-8")
262 253
         {
263
-            string reqId = DateTime.Now.Ticks.ToString("X2");
264
-            Stopwatch st = Stopwatch.StartNew();
265
-            try
254
+            var client = new HttpClient();
255
+            
256
+            HttpRequestMessage message = new HttpRequestMessage(HttpMethod.Post, url);
257
+            foreach (var head in headers)
266 258
             {
267
-                
268
-                logger.Debug("Starting RequestID: {0}", reqId);
269
-                HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
270
-
271
-                req.Method = "POST";
272
-
273
-                foreach (var head in headers)
274
-                {
275
-                    req.Headers.Add(head.Item1, head.Item2);
276
-                }
277
-
278
-                using (var stream = req.GetRequestStream())
279
-                {
280
-                    
281
-                    data.Position = 0;
282
-
283
-                    req.ContentType = contentType;
284
-                    
285
-                    data.CopyTo(stream);
286
-                    data.Flush();
287
-                    
288
-                    stream.Close();
289
-                }
290
-                WebResponse response = (HttpWebResponse)req.GetResponse();
291
-                var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();
292
-                response.Close();
293
-                Console.WriteLine("RequId: {0} MakeRequest Took {1}ms",reqId, st.ElapsedMilliseconds);
294
-                return responseString;
259
+                message.Headers.Add(head.Item1, head.Item2);
295 260
             }
296
-            catch (Exception ex)
261
+            if (isFile)
297 262
             {
298
-                logger.Error("ReqId: {1} Error talking to server: {0}", ex.Message, reqId);
299
-                logger.Error("URL: {0}", url);
300
-                throw;
263
+                message.Content = new StreamContent(System.IO.File.OpenRead(data));
264
+            }
265
+            else
266
+            {
267
+                message.Content = new StringContent(data);
301 268
             }
302
-        }
303 269
 
304
-        
305
-        
270
+            var resp = await client.SendAsync(message);
271
+
272
+            resp.EnsureSuccessStatusCode();
273
+            return await resp.Content.ReadAsStringAsync();          
274
+        }
306 275
         
307 276
 
308 277
         private static string GetSha1(string fileName)

+ 5 - 2
B2Uploader/packages.config

@@ -1,8 +1,11 @@
1 1
 <?xml version="1.0" encoding="utf-8"?>
2 2
 <packages>
3 3
   <package id="CommandLineParser" version="2.0.275-beta" targetFramework="net45" />
4
+  <package id="Microsoft.Bcl" version="1.1.10" targetFramework="net45" />
5
+  <package id="Microsoft.Bcl.Build" version="1.0.14" targetFramework="net45" />
6
+  <package id="Microsoft.Net.Http" version="2.2.29" targetFramework="net45" />
4 7
   <package id="Newtonsoft.Json" version="7.0.1" targetFramework="net452" />
5
-  <package id="NLog" version="4.2.2" targetFramework="net45" />
6
-  <package id="NLog.Config" version="4.2.2" targetFramework="net45" />
8
+  <package id="NLog" version="4.2.3" targetFramework="net45" />
9
+  <package id="NLog.Config" version="4.2.3" targetFramework="net45" />
7 10
   <package id="NLog.Schema" version="4.2.1" targetFramework="net45" />
8 11
 </packages>