parse method

  1. @override
Future<bool> parse(
  1. Socket socket,
  2. Uri uri,
  3. Map<String, String> headers
)
override

Parses the request and returns the data to the socket.

Handles HTTP range requests for large file downloads, splitting the file into segments (default 2MB, configurable via Config.segmentSize).

Returns true if parsing and response succeed, otherwise false.

Implementation

@override
Future<bool> parse(
  Socket socket,
  Uri uri,
  Map<String, String> headers,
) async {
  try {
    RegExp exp = RegExp(r'bytes=(\d+)-(\d*)');
    RegExpMatch? rangeMatch = exp.firstMatch(headers['range'] ?? '');
    int requestRangeStart = int.tryParse(rangeMatch?.group(1) ?? '0') ?? 0;
    int requestRangeEnd = int.tryParse(rangeMatch?.group(2) ?? '0') ?? -1;
    bool partial = requestRangeStart > 0 || requestRangeEnd > 0;
    List<String> responseHeaders = <String>[
      partial ? 'HTTP/1.1 206 Partial Content' : 'HTTP/1.1 200 OK',
      'Accept-Ranges: bytes',
      'Content-Type: video/mp4',
      'Connection: keep-alive',
    ];

    if (Platform.isAndroid) {
      await parseAndroid(
        socket,
        uri,
        responseHeaders,
        requestRangeStart,
        requestRangeEnd,
        headers,
      );
    } else {
      await parseIOS(
        socket,
        uri,
        responseHeaders,
        requestRangeStart,
        requestRangeEnd,
        headers,
      );
    }
    await socket.flush();
    return true;
  } catch (e) {
    logW('[UrlParserDefault] ⚠ ⚠ ⚠ parse error: $e');
    return false;
  } finally {
    await socket.close();
    logD('Connection closed\n');
  }
}