Skip to content

Commit

Permalink
1. refactor progress listening for sending/receiving data
Browse files Browse the repository at this point in the history
2. Add ResponseType.bytes
  • Loading branch information
duwen committed Feb 13, 2019
1 parent 8112f31 commit df95745
Show file tree
Hide file tree
Showing 15 changed files with 321 additions and 199 deletions.
2 changes: 1 addition & 1 deletion README-ZH.md
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,7 @@ response = await dio.post("/info", data: formData);
response = await dio.post(
"http://www.dtworkroom.com/doris/1/2.0.0/test",
data: {"aa": "bb" * 22},
onUploadProgress: (int sent, int total) {
onSendProgress: (int sent, int total) {
print("$sent $total");
},
);
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ Listening the uploading progress:
response = await dio.post(
"http://www.dtworkroom.com/doris/1/2.0.0/test",
data: {"aa": "bb" * 22},
onUploadProgress: (int sent, int total) {
onSendProgress: (int sent, int total) {
print("$sent $total");
},
);
Expand Down
9 changes: 1 addition & 8 deletions example/dio.dart
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,6 @@ main() async {
dio.options.headers = {'user-agent': 'dio', 'common-header': 'xx'};
dio.interceptors.add(LogInterceptor(responseBody: false)); //Open log

var u = new Uri(
scheme: "https",
host: "www.baidu.com",
queryParameters: {"xx": "xx", "yy": "dd"});

print(u);

dio.interceptors.add(InterceptorsWrapper(onRequest: (Options options) {
// return ds.resolve(new Response(data:"xxx"));
// return ds.reject(new DioError(message: "eh"));
Expand All @@ -27,7 +20,7 @@ main() async {

// Download a file
response = await dio.download("https://www.google.com/", "./xx.html",
onProgress: (received, total) {
onReceiveProgress: (received, total) {
print('$received,$total');
});

Expand Down
52 changes: 36 additions & 16 deletions example/download.dart
Original file line number Diff line number Diff line change
Expand Up @@ -14,25 +14,45 @@ main() async {
// var url = "http://download.dcloud.net.cn/HBuilder.9.0.2.macosx_64.dmg";

// This is a image, about 4KB
var url = "https://flutter.io/assets/flutter-lockup-4cb0ee072ab312e59784d9fbf4fb7ad42688a7fdaea1270ccf6bbf4f34b7e03f.svg";
//var url = "https://github.com/wendux/tt"; //404
//var url = "https://flutter.io/assets/flutter-lockup-4cb0ee072ab312e59784d9fbf4fb7ad42688a7fdaea1270ccf6bbf4f34b7e03f.svg";
var url =
"https://cdn.jsdelivr.net/gh/flutterchina/[email protected]/docs/imgs/book.jpg";
await download1(dio, url, "./example/book1.jpg");
await download2(dio, url, "./example/book2.jpg");
}

Future download1(Dio dio, String url, String savePath) async {
try {
await dio.download(
url,
"./example/book.jpg",
onReceiveProgress: showDownloadProgress,
);
} catch (e) {
print(e);
}
}

Future download2(Dio dio, String url, String savePath) async {
try {
Response response = await dio.download(
Response response = await dio.get<List<int>>(
url,
"./example/flutter.svg",
onProgress: (received, total) {
if (total != -1) {
print((received / total * 100).toStringAsFixed(0) + "%");
}
},
cancelToken: CancelToken(),
options: Options(
//receiveDataWhenStatusError: false,
headers: {HttpHeaders.acceptEncodingHeader: "*"},
),
onReceiveProgress: showDownloadProgress,
//Received data with List<int>
options: Options(responseType: ResponseType.bytes),
);
print("download succeed!");
File file = new File(savePath);
var raf = file.openSync(mode: FileMode.write);
// response.data is List<int> type
raf.writeFromSync(response.data);
raf.close();
} catch (e) {
print(e.response.data);
print(e);
}
}

void showDownloadProgress(received, total) {
if (total != -1) {
print((received / total * 100).toStringAsFixed(0) + "%");
}
}
2 changes: 1 addition & 1 deletion example/formdata.dart
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ main() async {
});

//Response response = await dio.post("/token", data: formData);
Response response = await dio.post("http://localhost:3000/upload", data: formData2);
Response response = await dio.post("http://localhost:3000/upload", data: formData2, cancelToken: CancelToken());
print(response.statusCode);
//Response response = await dio.post("http://localhost/ds/test", data: formData);
print(response.data);
Expand Down
20 changes: 17 additions & 3 deletions example/test.dart
Original file line number Diff line number Diff line change
@@ -1,8 +1,22 @@
import 'package:dio/dio.dart';
import 'dart:async';
import 'dart:io';

import 'package:dio/dio.dart';

main() async {
var dio = new Dio();
dio.interceptors.add(LogInterceptor(responseBody: false));
dio.get("https://github.com/wendux/tt?aa=b",queryParameters: {"kk":"tt"}).catchError(print);
dio.interceptors.add(LogInterceptor(responseBody: true));
dio.get(
"http://www.dtworkroom.com/doris/1/2.0.0/test",
queryParameters: {"kk": "tt"},
options: Options(
headers: {HttpHeaders.acceptEncodingHeader: "*"},
responseType: ResponseType.bytes
),
onReceiveProgress: (received, total) {
if (total != -1) {
print((received / total * 100).toStringAsFixed(0) + "%");
}
},
).catchError(print);
}
28 changes: 7 additions & 21 deletions lib/src/adapter.dart
Original file line number Diff line number Diff line change
Expand Up @@ -27,15 +27,12 @@ abstract class HttpClientAdapter {
Future<ResponseBody> sendRequest(
RequestOptions options,
Stream<List<int>> requestStream,
CancelWrapper cancelWrapper,
Future cancelFuture,
);
}

class ResponseBody {
ResponseBody(this.stream, this.statusCode, this.headers,
{VoidCallback onClose})
: _onClose = onClose;
ResponseBody(this.stream, this.statusCode, this.headers);

Stream<List<int>> stream;
HttpHeaders headers;
Expand All @@ -52,10 +49,6 @@ class ResponseBody {
{VoidCallback onClose})
: _onClose = onClose,
stream = Stream.fromIterable(bytes.map((e) => [e]).toList());

void close() {
if (_onClose != null) _onClose();
}
}

/// The default HttpClientAdapter for Dio is [DefaultHttpClientAdapter].
Expand All @@ -65,7 +58,6 @@ class DefaultHttpClientAdapter extends HttpClientAdapter {
Future<ResponseBody> sendRequest(
RequestOptions options,
Stream<List<int>> requestStream,
CancelWrapper cancelWrapper,
Future cancelFuture,
) async {
if (_httpClient == null) {
Expand All @@ -88,7 +80,7 @@ class DefaultHttpClientAdapter extends HttpClientAdapter {

HttpClientRequest request;
try {
request = await cancelWrapper(requestFuture);
request = await requestFuture;
//Set Headers
options.headers.forEach((k, v) => request.headers.set(k, v));
} on TimeoutException {
Expand All @@ -100,22 +92,16 @@ class DefaultHttpClientAdapter extends HttpClientAdapter {
}
request.followRedirects = options.followRedirects;

try {
if (options.method != "GET" && requestStream != null) {
// Transform the request data, set headers inner.
await request.addStream(requestStream);
}
} catch (e) {
//If user cancel the request in transformer, close the connect by hand.
request.addError(e);
if (options.method != "GET" && requestStream != null) {
// Transform the request data
await request.addStream(requestStream);
}
HttpClientResponse responseStream = await cancelWrapper(request.close());

HttpClientResponse responseStream = await request.close();
return new ResponseBody(
responseStream,
responseStream.statusCode,
responseStream.headers,
onClose:
cancelFuture != null ? () => httpClient.close(force: true) : null,
);
}

Expand Down
28 changes: 18 additions & 10 deletions lib/src/cancel_token.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,26 +6,35 @@ import 'dio_error.dart';
/// when a token's [cancel] method invoked, all requests
/// with this token will be cancelled.
class CancelToken {
CancelToken() {
_completer = new Completer();
}

/// Whether is throw by [cancel]
static bool isCancel(DioError e) {
return e.type == DioErrorType.CANCEL;
}

Completer _completer;

/// If request have been canceled, save the cancel Error.
DioError get cancelError => _cancelError;

/// When cancelled, this future will be resolved.
Future<void> get cancelled=>_completer.future;

/// Cancel the request
void cancel([String msg]) {
_cancelError = new DioError(message: msg, type: DioErrorType.CANCEL);
if (!completers.isEmpty) {
completers.forEach((e)=>e.completeError(cancelError));
/// Don't remove [completers] here, [Dio] will remove the completer automatically.
completers.forEach((e) => e.completeError(cancelError));
/// Don't remove [completers] here, [Dio] will remove the completer automatically.
}
_completer.complete();
}

_trigger(completer) {
if (completer!=null) {
if (completer != null) {
completer.completeError(cancelError);
completers.remove(completer);
}
Expand All @@ -36,11 +45,11 @@ class CancelToken {
///
/// Note: you shouldn't invoke this method by yourself. It's just used inner [Dio].
/// @nodoc
void addCompleter(Completer completer){
void addCompleter(Completer completer) {
if (cancelError != null) {
_trigger(completer);
}else{
if(!completers.contains(completer)){
} else {
if (!completers.contains(completer)) {
completers.add(completer);
}
}
Expand All @@ -50,11 +59,10 @@ class CancelToken {
///
/// Note: you shouldn't invoke this method by yourself. It's just used inner [Dio].
/// @nodoc
void removeCompleter(Completer completer){
void removeCompleter(Completer completer) {
completers.remove(completer);
}

var completers =new List<Completer>();
var completers = new List<Completer>();
DioError _cancelError;

}
Loading

0 comments on commit df95745

Please sign in to comment.