mirror of
https://github.com/rustdesk/rustdesk.git
synced 2025-12-23 00:15:59 +00:00
127 lines
3.9 KiB
Dart
127 lines
3.9 KiB
Dart
import 'dart:convert';
|
|
import 'package:flutter/foundation.dart';
|
|
import 'package:flutter_hbb/consts.dart';
|
|
import 'package:http/http.dart' as http;
|
|
import '../models/platform_model.dart';
|
|
import 'package:flutter_hbb/common.dart';
|
|
export 'package:http/http.dart' show Response;
|
|
|
|
enum HttpMethod { get, post, put, delete }
|
|
|
|
class HttpService {
|
|
Future<http.Response> sendRequest(
|
|
Uri url,
|
|
HttpMethod method, {
|
|
Map<String, String>? headers,
|
|
dynamic body,
|
|
}) async {
|
|
headers ??= {'Content-Type': 'application/json'};
|
|
|
|
// Use Rust HTTP implementation for non-web platforms for consistency.
|
|
var useFlutterHttp = (isWeb || kIsWeb);
|
|
if (!useFlutterHttp) {
|
|
final enableFlutterHttpOnRust =
|
|
mainGetLocalBoolOptionSync(kOptionEnableFlutterHttpOnRust);
|
|
// Use flutter http if:
|
|
// Not `enableFlutterHttpOnRust` and no proxy is set
|
|
useFlutterHttp =
|
|
!(enableFlutterHttpOnRust || await bind.mainGetProxyStatus());
|
|
}
|
|
|
|
if (useFlutterHttp) {
|
|
return await _pollFlutterHttp(url, method, headers: headers, body: body);
|
|
}
|
|
|
|
String headersJson = jsonEncode(headers);
|
|
String methodName = method.toString().split('.').last;
|
|
await bind.mainHttpRequest(
|
|
url: url.toString(),
|
|
method: methodName.toLowerCase(),
|
|
body: body,
|
|
header: headersJson);
|
|
|
|
var resJson = await _pollForResponse(url.toString());
|
|
return _parseHttpResponse(resJson);
|
|
}
|
|
|
|
Future<http.Response> _pollFlutterHttp(
|
|
Uri url,
|
|
HttpMethod method, {
|
|
Map<String, String>? headers,
|
|
dynamic body,
|
|
}) async {
|
|
var response = http.Response('', 400);
|
|
|
|
switch (method) {
|
|
case HttpMethod.get:
|
|
response = await http.get(url, headers: headers);
|
|
break;
|
|
case HttpMethod.post:
|
|
response = await http.post(url, headers: headers, body: body);
|
|
break;
|
|
case HttpMethod.put:
|
|
response = await http.put(url, headers: headers, body: body);
|
|
break;
|
|
case HttpMethod.delete:
|
|
response = await http.delete(url, headers: headers, body: body);
|
|
break;
|
|
default:
|
|
throw Exception('Unsupported HTTP method');
|
|
}
|
|
|
|
return response;
|
|
}
|
|
|
|
Future<String> _pollForResponse(String url) async {
|
|
String? responseJson = " ";
|
|
while (responseJson == " ") {
|
|
responseJson = await bind.mainGetHttpStatus(url: url);
|
|
if (responseJson == null) {
|
|
throw Exception('The HTTP request failed');
|
|
}
|
|
if (responseJson == " ") {
|
|
await Future.delayed(const Duration(milliseconds: 100));
|
|
}
|
|
}
|
|
return responseJson!;
|
|
}
|
|
|
|
http.Response _parseHttpResponse(String responseJson) {
|
|
try {
|
|
var parsedJson = jsonDecode(responseJson);
|
|
String body = parsedJson['body'];
|
|
Map<String, String> headers = {};
|
|
for (var key in parsedJson['headers'].keys) {
|
|
headers[key] = parsedJson['headers'][key];
|
|
}
|
|
int statusCode = parsedJson['status_code'];
|
|
return http.Response(body, statusCode, headers: headers);
|
|
} catch (e) {
|
|
print('Failed to parse response\n$responseJson\nError:\n$e');
|
|
throw Exception('Failed to parse response.\n$responseJson');
|
|
}
|
|
}
|
|
}
|
|
|
|
Future<http.Response> get(Uri url, {Map<String, String>? headers}) async {
|
|
return await HttpService().sendRequest(url, HttpMethod.get, headers: headers);
|
|
}
|
|
|
|
Future<http.Response> post(Uri url,
|
|
{Map<String, String>? headers, Object? body, Encoding? encoding}) async {
|
|
return await HttpService()
|
|
.sendRequest(url, HttpMethod.post, body: body, headers: headers);
|
|
}
|
|
|
|
Future<http.Response> put(Uri url,
|
|
{Map<String, String>? headers, Object? body, Encoding? encoding}) async {
|
|
return await HttpService()
|
|
.sendRequest(url, HttpMethod.put, body: body, headers: headers);
|
|
}
|
|
|
|
Future<http.Response> delete(Uri url,
|
|
{Map<String, String>? headers, Object? body, Encoding? encoding}) async {
|
|
return await HttpService()
|
|
.sendRequest(url, HttpMethod.delete, body: body, headers: headers);
|
|
}
|