summaryrefslogtreecommitdiff
path: root/op_crates/fetch
diff options
context:
space:
mode:
Diffstat (limited to 'op_crates/fetch')
-rw-r--r--op_crates/fetch/26_fetch.js21
-rw-r--r--op_crates/fetch/lib.rs16
2 files changed, 26 insertions, 11 deletions
diff --git a/op_crates/fetch/26_fetch.js b/op_crates/fetch/26_fetch.js
index 379c88e2f..0d405d4ec 100644
--- a/op_crates/fetch/26_fetch.js
+++ b/op_crates/fetch/26_fetch.js
@@ -5,6 +5,7 @@
// provided by "deno_web"
const { URLSearchParams } = window.__bootstrap.url;
+ const { getLocationHref } = window.__bootstrap.location;
const { requiredArguments } = window.__bootstrap.fetchUtil;
const { ReadableStream, isReadableStreamDisturbed } =
@@ -987,8 +988,10 @@
this.credentials = input.credentials;
this._stream = input._stream;
} else {
- // TODO(nayeemrmn): Base from `--location` when implemented and set.
- this.url = new URL(String(input)).href;
+ const baseUrl = getLocationHref();
+ this.url = baseUrl != null
+ ? new URL(String(input), baseUrl).href
+ : new URL(String(input)).href;
}
if (init && "method" in init && init.method) {
@@ -1175,20 +1178,25 @@
}
}
+ let baseUrl = null;
+
+ function setBaseUrl(href) {
+ baseUrl = href;
+ }
+
function sendFetchReq(url, method, headers, body, clientRid) {
let headerArray = [];
if (headers) {
headerArray = Array.from(headers.entries());
}
- const args = {
+ return opFetch({
method,
url,
+ baseUrl,
headers: headerArray,
clientRid,
- };
-
- return opFetch(args, body);
+ }, body);
}
async function fetch(input, init) {
@@ -1385,6 +1393,7 @@
Blob,
DomFile,
FormData,
+ setBaseUrl,
fetch,
Request,
Response,
diff --git a/op_crates/fetch/lib.rs b/op_crates/fetch/lib.rs
index 91e44f75c..c2e458d89 100644
--- a/op_crates/fetch/lib.rs
+++ b/op_crates/fetch/lib.rs
@@ -100,12 +100,12 @@ where
struct FetchArgs {
method: Option<String>,
url: String,
+ base_url: Option<String>,
headers: Vec<(String, String)>,
client_rid: Option<u32>,
}
let args: FetchArgs = serde_json::from_value(args)?;
- let url = args.url;
let client = if let Some(rid) = args.client_rid {
let state_ = state.borrow();
@@ -125,10 +125,16 @@ where
None => Method::GET,
};
- let url_ = Url::parse(&url)?;
+ let base_url = match args.base_url {
+ Some(base_url) => Some(Url::parse(&base_url)?),
+ _ => None,
+ };
+ let url = Url::options()
+ .base_url(base_url.as_ref())
+ .parse(&args.url)?;
// Check scheme before asking for net permission
- let scheme = url_.scheme();
+ let scheme = url.scheme();
if scheme != "http" && scheme != "https" {
return Err(type_error(format!("scheme '{}' not supported", scheme)));
}
@@ -136,10 +142,10 @@ where
{
let state_ = state.borrow();
let permissions = state_.borrow::<FP>();
- permissions.check_net_url(&url_)?;
+ permissions.check_net_url(&url)?;
}
- let mut request = client.request(method, url_);
+ let mut request = client.request(method, url);
match data.len() {
0 => {}