parse method
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');
}
}