execute method

Future<HtpioResponse<T>> execute()

Implementation

Future<HtpioResponse<T>> execute() async {
  if (_cancelled) throw HtpioError('Request was cancelled');

  try {
    final httpClient = HttpClient();
    if (timeout != null) {
      httpClient.connectionTimeout = timeout!;
    }

    final uri = Uri.parse(url);
    late HttpClientRequest request;

    // Create request based on method
    switch (method.toUpperCase()) {
      case 'GET':
        request = await httpClient.getUrl(uri);
        break;
      case 'POST':
        request = await httpClient.postUrl(uri);
        break;
      case 'PUT':
        request = await httpClient.putUrl(uri);
        break;
      case 'DELETE':
        request = await httpClient.deleteUrl(uri);
        break;
      default:
        throw HtpioError('Unsupported HTTP method: $method');
    }

    // Add headers
    headers.forEach((key, value) {
      request.headers.set(key, value);
    });

    // Add body for POST/PUT requests
    if (body != null && (method.toUpperCase() == 'POST' || method.toUpperCase() == 'PUT')) {
      if (body is String) {
        request.write(body);
      } else if (body is Map) {
        request.write(jsonEncode(body));
      }
    }

    // Send request and get response
    final response = await request.close();
    final responseBody = await response.transform(utf8.decoder).join();

    httpClient.close();

    // Parse response
    final responseData = responseBody.isNotEmpty ? jsonDecode(responseBody) : {};

    // Handle different response formats
    T parsedData;
    if (fromJson != null) {
      if (responseData is Map<String, dynamic>) {
        parsedData = fromJson!(responseData);
      } else if (responseData is List) {
        // Handle list responses
        parsedData = fromJson!({'data': responseData});
      } else {
        parsedData = fromJson!({'data': responseData});
      }
    } else {
      parsedData = responseData as T;
    }

    return HtpioResponse<T>(
      data: parsedData,
      statusCode: response.statusCode,
    );
  } catch (e) {
    throw HtpioError('Request failed: $e');
  }
}