Functional Weave
Code in Rust

auth.bearer-token@1.0.0

impl/typescript.ts

1,252 bytes · the TypeScript implementation · view raw

function isTokenChar(ch: string): boolean {
  return (ch >= "A" && ch <= "Z") || (ch >= "a" && ch <= "z") || (ch >= "0" && ch <= "9") || ch === "-" || ch === "." || ch === "_" || ch === "~" || ch === "+" || ch === "/";
}

/**
 * The token from `Authorization: Bearer <token>` (RFC 6750 section 2.1), or
 * null. Never throws: a malformed header is an answer (401), not an error.
 */
export function parseBearerToken(authorization: string | null): string | null {
  if (typeof authorization !== "string") return null;
  let start = 0;
  let end = authorization.length;
  while (start < end && (authorization[start] === " " || authorization[start] === "\t")) start++;
  while (end > start && (authorization[end - 1] === " " || authorization[end - 1] === "\t")) end--;
  const value = authorization.slice(start, end);
  if (value.length < 7 || value.slice(0, 6).toLowerCase() !== "bearer" || value[6] !== " ") return null;
  let i = 6;
  while (i < value.length && value[i] === " ") i++;
  const token = value.slice(i);
  if (token.length === 0) return null;
  let j = 0;
  while (j < token.length && isTokenChar(token[j])) j++;
  if (j === 0) return null;
  while (j < token.length && token[j] === "=") j++;
  return j === token.length ? token : null;
}