* add http(s) proxy * Add front-end translation * fix ui description * For linux platform, add rustls support * fix: Fix the proxy address test function. * add: Added default prompts for agency agreement and some multi-language translations * add: Http proxy request client * fix: add async http proxy func and format the code * add: Preliminary support for flutter front-end calling rust back-end http request * Optimize HTTP calls * Optimize HTTP calls * fix: Optimize HTTP requests, refine translations, and fix dependencies * fix: Win and macOS compilation errors * fix: web platforms * fix: Optimize import * fix: Fix web platform issues * fix: Fix web platform issues * fix: update ci * fix: test ci * test: test CI * Revert "fix: update ci" This reverts commit 2e5f247b2ed0cc63a6f6f7bbaaffd0a1223712e5. * test: test CI * test: test CI * fix: fix lock file * fix: Optimize imports
		
			
				
	
	
		
			116 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
			
		
		
	
	
			116 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
| 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);
 | |
| }
 |