parseRequestBody<T> function

FutureOr<T?> parseRequestBody<T>(
  1. HttpRequest request, {
  2. Duration timeout = const Duration(seconds: 360),
})

Implementation

FutureOr<T?> parseRequestBody<T>(HttpRequest request,
    {Duration timeout = const Duration(seconds: 360)}) async {
  try {
    var bodyType = request.headers.contentType?.mimeType;
    Stream<int> byteStream = request.expand((e) => e.toList());

    List<int> bodyBytes = await byteStream.toList();

    if (bodyBytes.isEmpty) {
      return null;
    }

    // Return different values based on the content type of the request body
    switch (bodyType) {
      case 'application/json':
        return parseBodyAsJson<T>(bytes: bodyBytes);

      case 'text/plain':
        return Future.microtask(() => utf8.decode(bodyBytes) as T).catchError(
            (e) => throw CreateError(
                message: 'Error reading request body', errorCode: 500));

      case 'multipart/form-data':
        var boundary = request.headers.contentType?.parameters["boundary"];
        var formData = FormData();
        var result = await req_utils.handleMultipartFormdata(
            request, boundary!, formData) as T;
        return result;
      default:
        throw UnsupportedError(
            "Unsupport request type in request body stream $bodyType");
    }
  } on TimeoutException {
    logger.severe("Timed out while trying to read the request body");
    throw TimeoutException("Timed out while trying to read request body");
  } catch (e) {
    logger.severe(e.toString());
    rethrow;
  }
}