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
       <Private>True</Private>
64
       <Private>True</Private>
65
     </Reference>
65
     </Reference>
66
     <Reference Include="NLog, Version=4.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL">
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
       <Private>True</Private>
68
       <Private>True</Private>
69
     </Reference>
69
     </Reference>
70
     <Reference Include="System" />
70
     <Reference Include="System" />
71
     <Reference Include="System.Core" />
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
     <Reference Include="System.Xml.Linq" />
81
     <Reference Include="System.Xml.Linq" />
73
     <Reference Include="System.Data.DataSetExtensions" />
82
     <Reference Include="System.Data.DataSetExtensions" />
74
     <Reference Include="Microsoft.CSharp" />
83
     <Reference Include="Microsoft.CSharp" />
104
     </PropertyGroup>
113
     </PropertyGroup>
105
     <Error Condition="!Exists('$(SolutionDir)\.nuget\NuGet.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\.nuget\NuGet.targets'))" />
114
     <Error Condition="!Exists('$(SolutionDir)\.nuget\NuGet.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\.nuget\NuGet.targets'))" />
106
   </Target>
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
   <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
121
   <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
108
        Other similar extension points exist, see Microsoft.Common.targets.
122
        Other similar extension points exist, see Microsoft.Common.targets.
109
   <Target Name="BeforeBuild">
123
   <Target Name="BeforeBuild">

+ 43 - 74
B2Uploader/Program.cs

8
 using System.IO;
8
 using System.IO;
9
 using System.Linq;
9
 using System.Linq;
10
 using System.Net;
10
 using System.Net;
11
+using System.Net.Http;
11
 using System.Security.Cryptography;
12
 using System.Security.Cryptography;
12
 using System.Text;
13
 using System.Text;
13
 using System.Threading;
14
 using System.Threading;
42
         static Logger logger = LogManager.GetCurrentClassLogger();
43
         static Logger logger = LogManager.GetCurrentClassLogger();
43
         static void Main(string[] args)
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
             var existCode = result.MapResult(options => {
48
             var existCode = result.MapResult(options => {
49
                 if (!Directory.Exists(options.Directory))
49
                 if (!Directory.Exists(options.Directory))
61
                 {
61
                 {
62
                     logger.Debug("Listing Buckets");
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
                 var bucket = buckets.buckets.First();
66
                 var bucket = buckets.buckets.First();
67
 
67
 
134
                         while (!uploaded && retries < 3)
134
                         while (!uploaded && retries < 3)
135
                         {
135
                         {
136
                             try {
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
                                 var response = UploadFile(uploadURL.authorizationToken, "b2/x-auto", s, uploadURL.uploadUrl);
138
                                 var response = UploadFile(uploadURL.authorizationToken, "b2/x-auto", s, uploadURL.uploadUrl);
139
                                 if(response != null)
139
                                 if(response != null)
140
                                 {
140
                                 {
176
             return JsonConvert.DeserializeObject<AuthorizeResponse>(responseString);
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
             var headers = GetAuthHeaders(authToken);
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
         static List<Tuple<string,string>> GetAuthHeaders(string authToken)
188
         static List<Tuple<string,string>> GetAuthHeaders(string authToken)
192
             return headers;
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
             var headers = GetAuthHeaders(authToken); 
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
         static string getValidFilename(string input)
202
         static string getValidFilename(string input)
204
         {
203
         {
223
             headers.Add(new Tuple<string, string>("X-Bz-File-Name", fileName));
222
             headers.Add(new Tuple<string, string>("X-Bz-File-Name", fileName));
224
             headers.Add(new Tuple<string, string>("X-Bz-Content-Sha1", sha1));
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
         static ListFileNamesResponse ListFileNames(ListFileNamesRequest request, string apiUrl, string authToken)
243
         static ListFileNamesResponse ListFileNames(ListFileNamesRequest request, string apiUrl, string authToken)
247
         {
244
         {
248
             var headers = GetAuthHeaders(authToken);
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
             return JsonConvert.DeserializeObject<ListFileNamesResponse>(responseString);
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
         private static string GetSha1(string fileName)
277
         private static string GetSha1(string fileName)

+ 5 - 2
B2Uploader/packages.config

1
 <?xml version="1.0" encoding="utf-8"?>
1
 <?xml version="1.0" encoding="utf-8"?>
2
 <packages>
2
 <packages>
3
   <package id="CommandLineParser" version="2.0.275-beta" targetFramework="net45" />
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
   <package id="Newtonsoft.Json" version="7.0.1" targetFramework="net452" />
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
   <package id="NLog.Schema" version="4.2.1" targetFramework="net45" />
10
   <package id="NLog.Schema" version="4.2.1" targetFramework="net45" />
8
 </packages>
11
 </packages>