import 'dart:convert'; import 'package:flutter/foundation.dart'; import 'package:http/http.dart' as http; import '../models/platform_model.dart'; export 'package:http/http.dart' show Response; enum HttpMethod { get, post, put, delete } class HttpService { Future sendRequest( Uri url, HttpMethod method, { Map? headers, dynamic body, }) async { headers ??= {'Content-Type': 'application/json'}; // Determine if there is currently a proxy setting, and if so, use FFI to call the Rust HTTP method. final isProxy = await bind.mainGetProxyStatus(); if (!isProxy) { return await _pollFultterHttp(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 _pollFultterHttp( Uri url, HttpMethod method, { Map? 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 _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 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) { throw Exception('Failed to parse response: $e'); } } } Future get(Uri url, {Map? headers}) async { return await HttpService().sendRequest(url, HttpMethod.get, headers: headers); } Future post(Uri url, {Map? headers, Object? body, Encoding? encoding}) async { return await HttpService() .sendRequest(url, HttpMethod.post, body: body, headers: headers); } Future put(Uri url, {Map? headers, Object? body, Encoding? encoding}) async { return await HttpService() .sendRequest(url, HttpMethod.put, body: body, headers: headers); } Future delete(Uri url, {Map? headers, Object? body, Encoding? encoding}) async { return await HttpService() .sendRequest(url, HttpMethod.delete, body: body, headers: headers); }