diff --git a/app/src/main/assets/devportal/plugin.d.ts b/app/src/main/assets/devportal/plugin.d.ts index 702fb745..32c0a114 100644 --- a/app/src/main/assets/devportal/plugin.d.ts +++ b/app/src/main/assets/devportal/plugin.d.ts @@ -243,7 +243,9 @@ declare class DashSource implements IVideoSource { declare interface IRequest { url: string, - headers: Map + headers: Map?, + method: string?, + body: string? } declare interface IRequestModifierDef { allowByteSkip: boolean diff --git a/app/src/main/java/com/futo/platformplayer/api/media/models/modifier/IRequest.kt b/app/src/main/java/com/futo/platformplayer/api/media/models/modifier/IRequest.kt index 43cd502c..83e00a12 100644 --- a/app/src/main/java/com/futo/platformplayer/api/media/models/modifier/IRequest.kt +++ b/app/src/main/java/com/futo/platformplayer/api/media/models/modifier/IRequest.kt @@ -2,5 +2,7 @@ package com.futo.platformplayer.api.media.models.modifier interface IRequest { val url: String?; - val headers: Map; + val headers: Map?; + val method: String?; + val body: String?; } \ No newline at end of file diff --git a/app/src/main/java/com/futo/platformplayer/api/media/platforms/js/models/JSRequest.kt b/app/src/main/java/com/futo/platformplayer/api/media/platforms/js/models/JSRequest.kt index bc3b6bfc..40a185e8 100644 --- a/app/src/main/java/com/futo/platformplayer/api/media/platforms/js/models/JSRequest.kt +++ b/app/src/main/java/com/futo/platformplayer/api/media/platforms/js/models/JSRequest.kt @@ -13,14 +13,20 @@ class JSRequest : IRequest { private val _v8Url: String?; private val _v8Headers: Map?; private val _v8Options: Options?; + private val _v8Method: String?; + private val _v8Body: String?; override var url: String? = null; override lateinit var headers: Map; + override var method: String? = null; + override var body: String? = null; - constructor(plugin: JSClient, url: String?, headers: Map?, options: Options?, originalUrl: String?, originalHeaders: Map?) { + constructor(plugin: JSClient, url: String?, headers: Map?, method: String?, body: String? = null, options: Options?, originalUrl: String?, originalHeaders: Map?) { _v8Url = url; _v8Headers = headers; _v8Options = options; + _v8Method = method; + _v8Body = body; initialize(plugin, originalUrl, originalHeaders); } constructor(plugin: JSClient, obj: V8ValueObject, originalUrl: String?, originalHeaders: Map?, applyOtherHeadersByDefault: Boolean = false) { @@ -31,12 +37,17 @@ class JSRequest : IRequest { _v8Options = obj.getOrDefault(config, "options", "JSRequestModifier.options", null)?.let { Options(config, it, applyOtherHeadersByDefault); } ?: Options(null, null, applyOtherHeadersByDefault); + _v8Method = obj.getOrDefault(config, "method", contextName, null); + _v8Body = obj.getOrDefault(config, "body", contextName, null); + initialize(plugin, originalUrl, originalHeaders); } private fun initialize(plugin: JSClient, originalUrl: String?, originalHeaders: Map?) { val config = plugin.config; url = _v8Url ?: originalUrl; + method = _v8Method; + body = _v8Body; if(_v8Options?.applyOtherHeaders ?: false) { val headersToSet = _v8Headers?.toMutableMap() ?: mutableMapOf(); @@ -70,7 +81,7 @@ class JSRequest : IRequest { } fun modify(plugin: JSClient, originalUrl: String?, originalHeaders: Map?): JSRequest { - return JSRequest(plugin, _v8Url, _v8Headers, _v8Options, originalUrl, originalHeaders); + return JSRequest(plugin, _v8Url, _v8Headers, _v8Method, _v8Body, _v8Options, originalUrl, originalHeaders); } diff --git a/app/src/main/java/com/futo/platformplayer/api/media/platforms/js/models/JSRequestModifier.kt b/app/src/main/java/com/futo/platformplayer/api/media/platforms/js/models/JSRequestModifier.kt index 150189e7..a3fdad7f 100644 --- a/app/src/main/java/com/futo/platformplayer/api/media/platforms/js/models/JSRequestModifier.kt +++ b/app/src/main/java/com/futo/platformplayer/api/media/platforms/js/models/JSRequestModifier.kt @@ -45,5 +45,8 @@ class JSRequestModifier: IRequestModifier { } - data class Request(override val url: String, override val headers: Map) : IRequest; + data class Request(override val url: String, + override val headers: Map, + override val method: String? = null, + override val body: String? = null) : IRequest; } \ No newline at end of file diff --git a/app/src/main/java/com/futo/platformplayer/views/video/datasources/JSHttpDataSource.java b/app/src/main/java/com/futo/platformplayer/views/video/datasources/JSHttpDataSource.java index 859c1b2f..76db6695 100644 --- a/app/src/main/java/com/futo/platformplayer/views/video/datasources/JSHttpDataSource.java +++ b/app/src/main/java/com/futo/platformplayer/views/video/datasources/JSHttpDataSource.java @@ -47,6 +47,7 @@ import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.NoRouteToHostException; import java.net.URL; +import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -649,12 +650,25 @@ public class JSHttpDataSource extends BaseDataSource implements HttpDataSource { requestHeaders.put(HttpHeaders.ACCEPT_ENCODING, allowGzip ? "gzip" : "identity"); + String requestMethod = DataSpec.getStringForHttpMethod(httpMethod); String requestUrl = url.toString(); if (requestModifier != null) { IRequest result = requestModifier.modifyRequest(requestUrl, requestHeaders); String modifiedUrl = result.getUrl(); - requestUrl = (modifiedUrl != null) ? modifiedUrl : requestUrl; - requestHeaders = result.getHeaders(); + if (modifiedUrl != null) + requestUrl = modifiedUrl; + + Map modifiedHeaders = result.getHeaders(); + if (modifiedHeaders != null) + requestHeaders = modifiedHeaders; + + String modifiedMethod = result.getMethod(); + if (modifiedMethod != null) + requestMethod = modifiedMethod; + + String modifiedBody = result.getBody(); + if (modifiedBody != null) + httpBody = modifiedBody.getBytes(StandardCharsets.UTF_8); } Logger.Companion.v("JSHttpDataSource", "DataSource REQ: " + requestUrl + "\nHEADERS: [" + V8RemoteObject.Companion.getGsonStandard().toJson(requestHeaders)+ "]", null); @@ -669,7 +683,7 @@ public class JSHttpDataSource extends BaseDataSource implements HttpDataSource { connection.setInstanceFollowRedirects(followRedirects); connection.setDoOutput(httpBody != null); - connection.setRequestMethod(DataSpec.getStringForHttpMethod(httpMethod)); + connection.setRequestMethod(requestMethod); if (httpBody != null) { connection.setFixedLengthStreamingMode(httpBody.length);