import 'dart:convert'; import 'package:http/http.dart' as http; import 'package:logging/logging.dart'; import 'package:result_monad/result_monad.dart'; import '../friendica_client/paged_response.dart'; import '../globals.dart'; import '../models/exec_error.dart'; final _logger = Logger('NetworkUtils'); http.Response requestTimeout() => http.Response('Client side timeout', 408); FutureResult, ExecError> getUrl( Uri url, { Map? headers, Duration? timeout, }) async { _logger.finer('GET: $url'); final requestHeaders = headers ?? {}; if (usePhpDebugging) { requestHeaders['Cookie'] = 'XDEBUG_SESSION=PHPSTORM;path=/'; } try { final request = http.get( url, headers: requestHeaders, ); final response = await request.timeout( timeout ?? apiCallTimeout, onTimeout: requestTimeout, ); if (response.statusCode != 200) { return Result.error(ExecError( type: ErrorType.authentication, message: '${response.statusCode}: ${response.reasonPhrase}')); } return PagedResponse.fromLinkHeader( response.headers['link'], utf8.decode(response.bodyBytes), ); } catch (e) { return Result.error( ExecError(type: ErrorType.localError, message: e.toString())); } } FutureResult postUrl( Uri url, Map body, { Map? headers, Duration? timeout, }) async { _logger.finer('POST: $url \n Body: $body'); final requestHeaders = headers ?? {}; if (usePhpDebugging) { requestHeaders['Cookie'] = 'XDEBUG_SESSION=PHPSTORM;path=/'; } try { final request = http.post( url, headers: requestHeaders, body: jsonEncode(body), ); final response = await request.timeout( timeout ?? apiCallTimeout, onTimeout: requestTimeout, ); if (response.statusCode != 200) { return Result.error(ExecError( type: ErrorType.authentication, message: '${response.statusCode}: ${response.reasonPhrase}')); } return Result.ok(utf8.decode(response.bodyBytes)); } catch (e) { return Result.error( ExecError(type: ErrorType.localError, message: e.toString())); } } FutureResult putUrl( Uri url, Map body, { Map? headers, }) async { _logger.finer('PUT: $url \n Body: $body'); try { final request = http.put( url, headers: headers, body: jsonEncode(body), ); final response = await request.timeout( apiCallTimeout, onTimeout: requestTimeout, ); if (response.statusCode != 200) { return Result.error(ExecError( type: ErrorType.authentication, message: '${response.statusCode}: ${response.reasonPhrase}')); } return Result.ok(utf8.decode(response.bodyBytes)); } catch (e) { return Result.error( ExecError(type: ErrorType.localError, message: e.toString())); } } FutureResult deleteUrl( Uri url, Map body, { Map? headers, }) async { _logger.finer('DELETE: $url'); try { final request = http.delete( url, headers: headers, body: jsonEncode(body), ); final response = await request.timeout( apiCallTimeout, onTimeout: requestTimeout, ); if (response.statusCode != 200) { return Result.error(ExecError( type: ErrorType.authentication, message: '${response.statusCode}: ${response.reasonPhrase}')); } return Result.ok(utf8.decode(response.bodyBytes)); } catch (e) { return Result.error( ExecError(type: ErrorType.localError, message: e.toString())); } }