fromUint8ListToRequest static method

HttpParseRes fromUint8ListToRequest(
  1. Uint8List data
)

Implementation

static HttpParseRes fromUint8ListToRequest(Uint8List data) {
  final headerEndIndex = _findHeaderEnd(data);
  bool isChunked = false;
  http.Request? request;

  if (headerEndIndex != -1) {
    // 解析Content-Length确定是否接收完整
    final headersData = data.sublist(0, headerEndIndex);
    String headersString;
    try {
      headersString = utf8.decode(headersData, allowMalformed: true);
    } catch (e) {
      headersString = latin1.decode(headersData);
    }

    final contentLengthMatch = RegExp(r'content-length:\s*(\d+)', caseSensitive: false)
        .firstMatch(headersString);

    if (contentLengthMatch != null) {
      final contentLength = int.tryParse(contentLengthMatch.group(1) ?? '0') ?? 0;
      final totalLength = headerEndIndex + 4 + contentLength;

      if (data.length >= totalLength) {
        request = requestParse(Uint8List.fromList(data.sublist(0, totalLength)));
      } else {
        // 继续等待更多数据
        isChunked = true;
      }
    } else if (headersString.contains(RegExp(r'transfer-encoding:\s*chunked', caseSensitive: false))) {
      // 处理分块传输编码
      if (_isChunkedDataComplete(data, headerEndIndex)) {
        request = requestParse(Uint8List.fromList(data));
      } else {
        isChunked = true;
      }
    } else {
      // 没有Content-Length且不是分块传输,假设已完成
      request = requestParse(Uint8List.fromList(data));
    }
  }
  return HttpParseRes(request: request, isChunked: isChunked);
}