|
@@ -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)
|