Merge pull request #10 from tiernano/HTTPClient · 721caa4b5e - SVN.BY: Go Git Service
Преглед изворни кода

Merge pull request #10 from tiernano/HTTPClient

fixing #8 and #9
Tiernan OToole пре 8 година
родитељ
комит
721caa4b5e
3 измењених фајлова са 63 додато и 76 уклоњено
  1. 15 1
      B2Uploader/B2Uploader.csproj
  2. 43 73
      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 - 73
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;
234
+            }
235
+            else
236
+            {
237
+                //something went wrong!
238
+                return null;
243
             }
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")
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")
256
         {
253
         {
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")
262
-        {
263
-            string reqId = DateTime.Now.Ticks.ToString("X2");
264
-            Stopwatch st = Stopwatch.StartNew();
265
-            try
254
+            var client = new HttpClient();
255
+           
256
+            foreach (var head in headers)
266
             {
257
             {
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
-                }
258
+                client.DefaultRequestHeaders.Add(head.Item1, head.Item2);
259
+            }
277
 
260
 
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;
261
+            HttpContent content = null;
262
+            if (isFile)
263
+            {
264
+                content = new StreamContent(System.IO.File.OpenRead(data));
265
+                content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue(contentType);
295
             }
266
             }
296
-            catch (Exception ex)
267
+            else
297
             {
268
             {
298
-                logger.Error("ReqId: {1} Error talking to server: {0}", ex.Message, reqId);
299
-                logger.Error("URL: {0}", url);
300
-                throw;
269
+                content = new StringContent(data);
301
             }
270
             }
271
+            var resp = await client.PostAsync(url, content);
272
+            
273
+            resp.EnsureSuccessStatusCode();
274
+            return await resp.Content.ReadAsStringAsync();          
302
         }
275
         }
303
-
304
-        
305
-        
306
         
276
         
307
 
277
 
308
         private static string GetSha1(string fileName)
278
         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>