UNPKG

ketting

Version:

Opinionated HATEOAS / Rest client.

71 lines (60 loc) 1.65 kB
import LinkHeader from 'http-link-header'; import { Links } from '../link.js'; /** * Takes a Content-Type header, and only returns the mime-type part. */ export function parseContentType(contentType: string | null): string | null { if (!contentType) { return null; } if (contentType.includes(';')) { contentType = contentType.split(';')[0]; } return contentType.trim(); } export function parseLink(context: string, header: string|null): Links { const result = new Links(context); if (!header) { return result; } for (const httpLink of LinkHeader.parse(header).refs) { // Looping through individual links for (const rel of httpLink.rel.split(' ')) { // Looping through space separated rel values. const link = { rel: rel, href: httpLink.uri, context, title: httpLink.title, hreflang: httpLink.hreflang, type: httpLink.type, }; result.add(link); } } return result; } const safeMethods = ['GET', 'HEAD', 'OPTIONS', 'PRI', 'PROPFIND', 'REPORT', 'SEARCH', 'TRACE']; export function isSafeMethod(method: string): boolean { return safeMethods.includes(method); } /** * Older HTTP versions calls these 'entity headers'. * * Never HTTP/1.1 specs calls some of these 'representation headers'. * * What they have in common is that these headers can exist on request and * response and say something *about* the content. */ export const entityHeaderNames = [ 'Content-Type', 'Content-Language', 'Content-Location', 'Deprecation', 'ETag', 'Expires', 'Last-Modified', 'Sunset', 'Title', 'Warning', ];