1919import android .net .Uri ;
2020import android .os .Build ;
2121import android .util .Log ;
22+ import android .webkit .WebResourceRequest ;
2223import android .webkit .WebResourceResponse ;
2324
2425import org .apache .cordova .ConfigXmlParser ;
@@ -213,7 +214,7 @@ private static WebResourceResponse createWebResourceResponse(String mimeType, St
213214 * @param uri the request Uri to process.
214215 * @return a response if the request URL had a matching handler, null if no handler was found.
215216 */
216- public WebResourceResponse shouldInterceptRequest (Uri uri ) {
217+ public WebResourceResponse shouldInterceptRequest (Uri uri , WebResourceRequest request ) {
217218 PathHandler handler ;
218219 synchronized (uriMatcher ) {
219220 handler = (PathHandler ) uriMatcher .match (uri );
@@ -224,7 +225,7 @@ public WebResourceResponse shouldInterceptRequest(Uri uri) {
224225
225226 if (isLocalFile (uri ) || uri .getAuthority ().equals (this .authority )) {
226227 Log .d ("SERVER" , "Handling local request: " + uri .toString ());
227- return handleLocalRequest (uri , handler );
228+ return handleLocalRequest (uri , handler , request );
228229 } else {
229230 return handleProxyRequest (uri , handler );
230231 }
@@ -237,9 +238,33 @@ private boolean isLocalFile(Uri uri) {
237238 }
238239 return false ;
239240 }
240- private WebResourceResponse handleLocalRequest (Uri uri , PathHandler handler ) {
241- String path = uri .getPath ();
242241
242+
243+ private WebResourceResponse handleLocalRequest (Uri uri , PathHandler handler , WebResourceRequest request ) {
244+ String path = uri .getPath ();
245+ if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .LOLLIPOP && request != null && request .getRequestHeaders ().get ("Range" ) != null ) {
246+ InputStream responseStream = new LollipopLazyInputStream (handler , uri );
247+ String mimeType = getMimeType (path , responseStream );
248+ Map <String , String > tempResponseHeaders = handler .getResponseHeaders ();
249+ int statusCode = 206 ;
250+ try {
251+ int totalRange = responseStream .available ();
252+ String rangeString = request .getRequestHeaders ().get ("Range" );
253+ String [] parts = rangeString .split ("=" );
254+ String [] streamParts = parts [1 ].split ("-" );
255+ String fromRange = streamParts [0 ];
256+ int range = totalRange -1 ;
257+ if (streamParts .length > 1 ) {
258+ range = Integer .parseInt (streamParts [1 ]);
259+ }
260+ tempResponseHeaders .put ("Accept-Ranges" , "bytes" );
261+ tempResponseHeaders .put ("Content-Range" , "bytes " + fromRange + "-" + range + "/" + totalRange );
262+ } catch (IOException e ) {
263+ statusCode = 404 ;
264+ }
265+ return createWebResourceResponse (mimeType , handler .getEncoding (),
266+ statusCode , handler .getReasonPhrase (), tempResponseHeaders , responseStream );
267+ }
243268 if (isLocalFile (uri )) {
244269 InputStream responseStream = new LollipopLazyInputStream (handler , uri );
245270 String mimeType = getMimeType (path , responseStream );
0 commit comments