@@ -22,8 +22,8 @@ use bytes::Buf;
22
22
use chrono:: Utc ;
23
23
use http:: header:: HeaderValue ;
24
24
use http:: header:: { self } ;
25
- use http:: Method ;
26
25
use http:: Request ;
26
+ use http:: { Method , Response } ;
27
27
use serde:: Deserialize ;
28
28
use serde:: Serialize ;
29
29
use tokio:: sync:: Mutex ;
@@ -198,7 +198,6 @@ impl AliyunDriveCore {
198
198
} )
199
199
. map_err ( new_json_serialize_error) ?;
200
200
let req = req
201
- // Inject operation to the request.
202
201
. extension ( Operation :: Read )
203
202
. body ( Buffer :: from ( body) )
204
203
. map_err ( new_request_build_error) ?;
@@ -264,7 +263,6 @@ impl AliyunDriveCore {
264
263
} )
265
264
. map_err ( new_json_serialize_error) ?;
266
265
let req = Request :: post ( format ! ( "{}/adrive/v1.0/openFile/create" , self . endpoint) )
267
- // Inject operation to the request.
268
266
. extension ( Operation :: Write )
269
267
. body ( Buffer :: from ( body) )
270
268
. map_err ( new_request_build_error) ?;
@@ -282,27 +280,40 @@ impl AliyunDriveCore {
282
280
. await
283
281
}
284
282
285
- pub async fn get_download_url ( & self , file_id : & str ) -> Result < String > {
283
+ async fn get_download_url ( & self , file_id : & str ) -> Result < String > {
286
284
let ( token, drive_id) = self . get_token_and_drive ( ) . await ?;
287
285
let body = serde_json:: to_vec ( & FileRequest {
288
286
drive_id : & drive_id,
289
287
file_id,
290
288
} )
291
289
. map_err ( new_json_serialize_error) ?;
290
+
292
291
let req = Request :: post ( format ! (
293
292
"{}/adrive/v1.0/openFile/getDownloadUrl" ,
294
293
self . endpoint
295
294
) )
296
- // Inject operation to the request.
297
295
. extension ( Operation :: Read )
298
296
. body ( Buffer :: from ( body) )
299
297
. map_err ( new_request_build_error) ?;
298
+
300
299
let res = self . send ( req, token. as_deref ( ) ) . await ?;
300
+
301
301
let output: GetDownloadUrlResponse =
302
302
serde_json:: from_reader ( res. reader ( ) ) . map_err ( new_json_serialize_error) ?;
303
+
303
304
Ok ( output. url )
304
305
}
305
306
307
+ pub async fn download ( & self , file_id : & str , range : BytesRange ) -> Result < Response < HttpBody > > {
308
+ let download_url = self . get_download_url ( file_id) . await ?;
309
+ let req = Request :: get ( download_url)
310
+ . extension ( Operation :: Read )
311
+ . header ( header:: RANGE , range. to_header ( ) )
312
+ . body ( Buffer :: new ( ) )
313
+ . map_err ( new_request_build_error) ?;
314
+ self . info . http_client ( ) . fetch ( req) . await
315
+ }
316
+
306
317
pub async fn move_path ( & self , file_id : & str , to_parent_file_id : & str ) -> Result < ( ) > {
307
318
let ( token, drive_id) = self . get_token_and_drive ( ) . await ?;
308
319
let body = serde_json:: to_vec ( & MovePathRequest {
@@ -313,7 +324,6 @@ impl AliyunDriveCore {
313
324
} )
314
325
. map_err ( new_json_serialize_error) ?;
315
326
let req = Request :: post ( format ! ( "{}/adrive/v1.0/openFile/move" , self . endpoint) )
316
- // Inject operation to the request.
317
327
. extension ( Operation :: Write )
318
328
. body ( Buffer :: from ( body) )
319
329
. map_err ( new_request_build_error) ?;
@@ -331,7 +341,6 @@ impl AliyunDriveCore {
331
341
} )
332
342
. map_err ( new_json_serialize_error) ?;
333
343
let req = Request :: post ( format ! ( "{}/adrive/v1.0/openFile/update" , self . endpoint) )
334
- // Inject operation to the request.
335
344
. extension ( Operation :: Write )
336
345
. body ( Buffer :: from ( body) )
337
346
. map_err ( new_request_build_error) ?;
@@ -354,7 +363,6 @@ impl AliyunDriveCore {
354
363
} )
355
364
. map_err ( new_json_serialize_error) ?;
356
365
let req = Request :: post ( format ! ( "{}/adrive/v1.0/openFile/copy" , self . endpoint) )
357
- // Inject operation to the request.
358
366
. extension ( Operation :: Copy )
359
367
. body ( Buffer :: from ( body) )
360
368
. map_err ( new_request_build_error) ?;
@@ -369,7 +377,6 @@ impl AliyunDriveCore {
369
377
} )
370
378
. map_err ( new_json_serialize_error) ?;
371
379
let req = Request :: post ( format ! ( "{}/adrive/v1.0/openFile/delete" , self . endpoint) )
372
- // Inject operation to the request.
373
380
. extension ( Operation :: Delete )
374
381
. body ( Buffer :: from ( body) )
375
382
. map_err ( new_request_build_error) ?;
@@ -392,22 +399,12 @@ impl AliyunDriveCore {
392
399
} )
393
400
. map_err ( new_json_serialize_error) ?;
394
401
let req = Request :: post ( format ! ( "{}/adrive/v1.0/openFile/list" , self . endpoint) )
395
- // Inject operation to the request.
396
402
. extension ( Operation :: List )
397
403
. body ( Buffer :: from ( body) )
398
404
. map_err ( new_request_build_error) ?;
399
405
self . send ( req, token. as_deref ( ) ) . await
400
406
}
401
407
402
- pub async fn upload ( & self , upload_url : & str , body : Buffer ) -> Result < Buffer > {
403
- let req = Request :: put ( upload_url)
404
- // Inject operation to the request.
405
- . extension ( Operation :: Write )
406
- . body ( body)
407
- . map_err ( new_request_build_error) ?;
408
- self . send ( req, None ) . await
409
- }
410
-
411
408
pub async fn complete ( & self , file_id : & str , upload_id : & str ) -> Result < Buffer > {
412
409
let ( token, drive_id) = self . get_token_and_drive ( ) . await ?;
413
410
let body = serde_json:: to_vec ( & CompleteRequest {
@@ -417,41 +414,67 @@ impl AliyunDriveCore {
417
414
} )
418
415
. map_err ( new_json_serialize_error) ?;
419
416
let req = Request :: post ( format ! ( "{}/adrive/v1.0/openFile/complete" , self . endpoint) )
420
- // Inject operation to the request.
421
417
. extension ( Operation :: Write )
422
418
. body ( Buffer :: from ( body) )
423
419
. map_err ( new_request_build_error) ?;
424
420
self . send ( req, token. as_deref ( ) ) . await
425
421
}
426
422
427
- pub async fn get_upload_url (
423
+ async fn get_upload_url (
428
424
& self ,
429
425
file_id : & str ,
430
426
upload_id : & str ,
431
- part_number : Option < usize > ,
432
- ) -> Result < Buffer > {
427
+ part_number : usize ,
428
+ ) -> Result < String > {
433
429
let ( token, drive_id) = self . get_token_and_drive ( ) . await ?;
434
- let part_info_list = part_number. map ( |part_number| {
435
- vec ! [ PartInfoItem {
436
- part_number: Some ( part_number) ,
437
- } ]
438
- } ) ;
430
+ let part_info_list = vec ! [ PartInfoItem {
431
+ part_number: Some ( part_number) ,
432
+ } ] ;
439
433
let body = serde_json:: to_vec ( & GetUploadRequest {
440
434
drive_id : & drive_id,
441
435
file_id,
442
436
upload_id,
443
- part_info_list,
437
+ part_info_list : Some ( part_info_list ) ,
444
438
} )
445
439
. map_err ( new_json_serialize_error) ?;
440
+
446
441
let req = Request :: post ( format ! (
447
442
"{}/adrive/v1.0/openFile/getUploadUrl" ,
448
443
self . endpoint
449
444
) )
450
- // Inject operation to the request.
451
445
. extension ( Operation :: Write )
452
446
. body ( Buffer :: from ( body) )
453
447
. map_err ( new_request_build_error) ?;
454
- self . send ( req, token. as_deref ( ) ) . await
448
+
449
+ let res = self . send ( req, token. as_deref ( ) ) . await ?;
450
+
451
+ let mut output: UploadUrlResponse =
452
+ serde_json:: from_reader ( res. reader ( ) ) . map_err ( new_json_deserialize_error) ?;
453
+
454
+ let Some ( upload_url) = output
455
+ . part_info_list
456
+ . take ( )
457
+ . map ( |mut list| list. swap_remove ( 0 ) )
458
+ . map ( |part_info| part_info. upload_url )
459
+ else {
460
+ return Err ( Error :: new ( ErrorKind :: Unexpected , "cannot find upload_url" ) ) ;
461
+ } ;
462
+
463
+ Ok ( upload_url)
464
+ }
465
+ pub async fn upload (
466
+ & self ,
467
+ file_id : & str ,
468
+ upload_id : & str ,
469
+ part_number : usize ,
470
+ body : Buffer ,
471
+ ) -> Result < Buffer > {
472
+ let upload_url = self . get_upload_url ( file_id, upload_id, part_number) . await ?;
473
+ let req = Request :: put ( upload_url)
474
+ . extension ( Operation :: Write )
475
+ . body ( body)
476
+ . map_err ( new_request_build_error) ?;
477
+ self . send ( req, None ) . await
455
478
}
456
479
}
457
480
0 commit comments