http_request.dart 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. import 'dart:isolate';
  2. import 'dart:typed_data';
  3. import 'package:http/http.dart' as http;
  4. class HttpGetImage {
  5. final String url;
  6. final int count;
  7. final Map<String, String>? httpHeaders;
  8. HttpGetImage({
  9. required this.url,
  10. required this.count,
  11. required this.httpHeaders,
  12. });
  13. Future<Uint8List> getDataObjectIsolate() async {
  14. final ReceivePort receivePort = ReceivePort();
  15. var data = {'sendPort': receivePort.sendPort, 'url': url, 'count': count};
  16. if (httpHeaders != null) {
  17. data = {
  18. 'sendPort': receivePort.sendPort,
  19. 'url': url,
  20. 'headers': httpHeaders!,
  21. 'count': count,
  22. };
  23. }
  24. final Isolate isolate = await Isolate.spawn(_isolateFetchVideo, data);
  25. try {
  26. final dynamic result = await receivePort.first;
  27. isolate.kill();
  28. if (result is Uint8List) {
  29. return result;
  30. } else {
  31. throw Exception();
  32. }
  33. } catch (e) {
  34. isolate.kill();
  35. throw Exception();
  36. } finally {
  37. receivePort.close();
  38. }
  39. }
  40. Future<void> _isolateFetchVideo(Map<String, dynamic> message) async {
  41. final SendPort sendPort = message['sendPort'];
  42. final String url = message['url'];
  43. int count = message['count'];
  44. Map<String, String>? headers = message.containsKey("headers")
  45. ? message['headers']
  46. : null;
  47. int time = 10;
  48. late http.Response response;
  49. do {
  50. if (time > count) {
  51. sendPort.send(null);
  52. break;
  53. }
  54. try {
  55. response = await http
  56. .get(Uri.parse(url), headers: headers)
  57. .timeout(Duration(seconds: time));
  58. if (response.statusCode == 200) {
  59. if (response.body.isNotEmpty) {
  60. sendPort.send(null);
  61. break;
  62. }
  63. sendPort.send(response.bodyBytes);
  64. break;
  65. }
  66. time++;
  67. } catch (e) {
  68. sendPort.send(null);
  69. }
  70. } while (response.statusCode != 200);
  71. }
  72. }