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