summaryrefslogtreecommitdiff
path: root/js/fetch.ts
diff options
context:
space:
mode:
authorRyan Dahl <ry@tinyclouds.org>2018-11-14 17:36:34 -0800
committerGitHub <noreply@github.com>2018-11-14 17:36:34 -0800
commit3c8d2bde685d015721b1c0fd6f2a3ae54c156583 (patch)
tree0f770fccbe23bd5a410612678176b449651cd8ad /js/fetch.ts
parent765863e87aea725301d5f528b6de15bfa6022d46 (diff)
Support request method and headers in fetch() (#1188)
Adds a general HttpHeader flatbuffer message for serializing requests and responses.
Diffstat (limited to 'js/fetch.ts')
-rw-r--r--js/fetch.ts87
1 files changed, 73 insertions, 14 deletions
diff --git a/js/fetch.ts b/js/fetch.ts
index bd50cdfdc..636bbba10 100644
--- a/js/fetch.ts
+++ b/js/fetch.ts
@@ -1,5 +1,5 @@
// Copyright 2018 the Deno authors. All rights reserved. MIT license.
-import { assert, log, createResolvable, notImplemented } from "./util";
+import { assert, createResolvable, notImplemented } from "./util";
import * as flatbuffers from "./flatbuffers";
import { sendAsync } from "./dispatch";
import * as msg from "gen/msg_generated";
@@ -162,19 +162,73 @@ class Response implements domTypes.Response {
}
}
+function msgHttpRequest(
+ builder: flatbuffers.Builder,
+ url: string,
+ method: null | string,
+ headers: null | domTypes.Headers
+): flatbuffers.Offset {
+ const methodOffset = !method ? -1 : builder.createString(method);
+ let fieldsOffset: flatbuffers.Offset = -1;
+ const urlOffset = builder.createString(url);
+ if (headers) {
+ const kvOffsets: flatbuffers.Offset[] = [];
+ for (const [key, val] of headers.entries()) {
+ const keyOffset = builder.createString(key);
+ const valOffset = builder.createString(val);
+ msg.KeyValue.startKeyValue(builder);
+ msg.KeyValue.addKey(builder, keyOffset);
+ msg.KeyValue.addValue(builder, valOffset);
+ kvOffsets.push(msg.KeyValue.endKeyValue(builder));
+ }
+ fieldsOffset = msg.HttpHeader.createFieldsVector(builder, kvOffsets);
+ } else {
+ }
+ msg.HttpHeader.startHttpHeader(builder);
+ msg.HttpHeader.addIsRequest(builder, true);
+ msg.HttpHeader.addUrl(builder, urlOffset);
+ if (methodOffset >= 0) {
+ msg.HttpHeader.addMethod(builder, methodOffset);
+ }
+ if (fieldsOffset >= 0) {
+ msg.HttpHeader.addFields(builder, fieldsOffset);
+ }
+ return msg.HttpHeader.endHttpHeader(builder);
+}
+
/** Fetch a resource from the network. */
export async function fetch(
- input?: domTypes.Request | string,
+ input: domTypes.Request | string,
init?: domTypes.RequestInit
): Promise<Response> {
- const url = input as string;
- log("dispatch FETCH_REQ", url);
+ let url: string;
+ let method: string | null = null;
+ let headers: domTypes.Headers | null = null;
+
+ if (typeof input === "string") {
+ url = input;
+ if (init != null) {
+ method = init.method || null;
+ if (init.headers) {
+ headers =
+ init.headers instanceof Headers
+ ? init.headers
+ : new Headers(init.headers);
+ } else {
+ headers = null;
+ }
+ }
+ } else {
+ url = input.url;
+ method = input.method;
+ headers = input.headers;
+ }
// Send Fetch message
const builder = flatbuffers.createBuilder();
- const url_ = builder.createString(url);
+ const headerOff = msgHttpRequest(builder, url, method, headers);
msg.Fetch.startFetch(builder);
- msg.Fetch.addUrl(builder, url_);
+ msg.Fetch.addHeader(builder, headerOff);
const resBase = await sendAsync(
builder,
msg.Any.Fetch,
@@ -186,17 +240,22 @@ export async function fetch(
const inner = new msg.FetchRes();
assert(resBase.inner(inner) != null);
- const status = inner.status();
+ const header = inner.header()!;
const bodyRid = inner.bodyRid();
+ assert(!header.isRequest());
+ const status = header.status();
- const headersList: Array<[string, string]> = [];
- const len = inner.headerKeyLength();
- for (let i = 0; i < len; ++i) {
- const key = inner.headerKey(i);
- const value = inner.headerValue(i);
- headersList.push([key, value]);
- }
+ const headersList = deserializeHeaderFields(header);
const response = new Response(status, headersList, bodyRid);
return response;
}
+
+function deserializeHeaderFields(m: msg.HttpHeader): Array<[string, string]> {
+ const out: Array<[string, string]> = [];
+ for (let i = 0; i < m.fieldsLength(); i++) {
+ const item = m.fields(i)!;
+ out.push([item.key()!, item.value()!]);
+ }
+ return out;
+}