123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- 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<http.Response> sendRequest(
- Uri url,
- HttpMethod method, {
- Map<String, String>? 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<http.Response> _pollFultterHttp(
- 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) {
- throw Exception('Failed to parse response: $e');
- }
- }
- }
- 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);
- }
|