makeStreamedRequest function

Future<StreamedResponse> makeStreamedRequest({
  1. required Client client,
  2. required Uri uri,
  3. required HttpRequestModel requestModel,
  4. required APIType apiType,
})

Implementation

Future<http.StreamedResponse> makeStreamedRequest({
  required http.Client client,
  required Uri uri,
  required HttpRequestModel requestModel,
  required APIType apiType,
}) async {
  final headers = requestModel.enabledHeadersMap;
  final hasBody = kMethodsWithBody.contains(requestModel.method);
  final isMultipart = requestModel.bodyContentType == ContentType.formdata;

  http.StreamedResponse streamedResponse;

  //----------------- Request Creation ---------------------
  //Handling HTTP Multipart Requests
  if (apiType == APIType.rest && isMultipart && hasBody) {
    final multipart = http.MultipartRequest(
      requestModel.method.name.toUpperCase(),
      uri,
    )..headers.addAll(headers);
    for (final data in requestModel.formDataList) {
      if (data.type == FormDataType.text) {
        multipart.fields[data.name] = data.value;
      } else {
        multipart.files.add(
          await http.MultipartFile.fromPath(data.name, data.value),
        );
      }
    }
    streamedResponse = await client.send(multipart);
  } else if (apiType == APIType.graphql) {
    // Handling GraphQL Requests
    var requestBody = getGraphQLBody(requestModel);
    String? body;
    if (requestBody != null) {
      var contentLength = utf8.encode(requestBody).length;
      if (contentLength > 0) {
        body = requestBody;
        headers[HttpHeaders.contentLengthHeader] = contentLength.toString();
        if (!requestModel.hasContentTypeHeader) {
          headers[HttpHeaders.contentTypeHeader] = ContentType.json.header;
        }
      }
    }
    final request = http.Request('POST', uri)
      ..headers.addAll(headers)
      ..body = body ?? '';
    streamedResponse = await client.send(request);
  } else {
    //Handling regular REST Requests
    String? body;
    bool overrideContentType = false;
    if (hasBody && requestModel.body?.isNotEmpty == true) {
      body = requestModel.body;
      if (!requestModel.hasContentTypeHeader) {
        headers[HttpHeaders.contentTypeHeader] =
            requestModel.bodyContentType.header;
      } else {
        overrideContentType = true;
      }
    }
    final request = prepareHttpRequest(
      url: uri,
      method: requestModel.method.name.toUpperCase(),
      headers: headers,
      body: body,
      overrideContentType: overrideContentType,
    );
    streamedResponse = await client.send(request);
  }
  return streamedResponse;
}