1. http-link-header
Parse & format HTTP link headers according to RFC 8288
http-link-header
Package: http-link-header
Created by: jhermsmeier
Last modified: Sat, 16 Mar 2024 19:18:01 GMT
Version: 1.1.3
License: MIT
Downloads: 3,725,743
Repository: https://github.com/jhermsmeier/node-http-link-header

Install

npm install http-link-header
yarn add http-link-header

HTTP Link Header

npm
npm license
npm downloads

Parse & format HTTP link headers according to RFC 8288

Install via npm

 $ npm install --save http-link-header

Deviations from the RFC

Link Target

While RFC 8288, Section 3.1 states that relative URI-References
MUST be resolved by the parsers – this library DOES NOT.
This is due to the parser not having an input for the absolute or canonical URI of the related document.
Currently there are no plans to add this, and it is left to the user whether or not to resolve relative URIs.

Usage

 var LinkHeader = require( 'http-link-header' )

Parsing a HTTP link header

 var link = LinkHeader.parse(
  '<example.com>; rel="example"; title="Example Website", ' +
  '<example-01.com>; rel="alternate"; title="Alternate Example Domain"'
)

> Link {
  refs: [
    { uri: 'example.com', rel: 'example', title: 'Example Website' },
    { uri: 'example-01.com', rel: 'alternate', title: 'Alternate Example Domain' },
  ]
}

Checking whether it has a reference with a given attribute & value

 link.has( 'rel', 'alternate' )
> true

Retrieving a reference with a given attribute & value

 link.get( 'rel', 'alternate' )
> [
  { uri: 'example-01.com', rel: 'alternate', title: 'Alternate Example Domain' }
]
 // Shorthand for `rel` attributes
link.rel( 'alternate' )
> [
  { uri: 'example-01.com', rel: 'alternate', title: 'Alternate Example Domain' }
]

Setting references

 link.set({ uri: 'https://example.com/next', rel: 'next' })
> Link {
  refs: [
    { uri: 'example.com', rel: 'example', title: 'Example Website' },
    { uri: 'example-01.com', rel: 'alternate', title: 'Alternate Example Domain' },
    { rel: 'next', uri: 'https://example.com/next' }
  ]
}

Setting a unique reference

 link.setUnique({
  uri: 'https://example.com/image.png',
  rel: 'preload',
  as: 'image',
  type: 'image/png'
})
> Link {
  refs: [
    { uri: 'https://example.com/image.png', rel: 'preload', as: 'image', type: 'image/png' }
  ]
}

link.setUnique({
  uri: 'https://example.com/image.png',
  rel: 'preload',
  as: 'image',
  type: 'image/png'
})
> Link {
  refs: [
    { uri: 'https://example.com/image.png', rel: 'preload', as: 'image', type: 'image/png' }
  ]
}

Parsing multiple headers

 var link = new LinkHeader()

link.parse( '<example.com>; rel="example"; title="Example Website"' )
> Link {
  refs: [
    { uri: 'example.com', rel: 'example', title: 'Example Website' },
  ]
}

link.parse( '<example-01.com>; rel="alternate"; title="Alternate Example Domain"' )
> Link {
  refs: [
    { uri: 'example.com', rel: 'example', title: 'Example Website' },
    { uri: 'example-01.com', rel: 'alternate', title: 'Alternate Example Domain' },
  ]
}

link.parse( '<example-02.com>; rel="alternate"; title="Second Alternate Example Domain"' )
> Link {
  refs: [
    { uri: 'example.com', rel: 'example', title: 'Example Website' },
    { uri: 'example-01.com', rel: 'alternate', title: 'Alternate Example Domain' },
    { uri: 'example-02.com', rel: 'alternate', title: 'Second Alternate Example Domain' },
  ]
}

Handling extended attributes

 link.parse( '</extended-attr-example>; rel=start; title*=UTF-8\'en\'%E2%91%A0%E2%93%AB%E2%85%93%E3%8F%A8%E2%99%B3%F0%9D%84%9E%CE%BB' )
 > Link {
  refs: [
    { uri: '/extended-attr-example', rel: 'start', 'title*': { language: 'en', encoding: null, value: '①⓫⅓㏨♳𝄞λ' } }
  ]
}

Stringifying to HTTP header format

 link.toString()
> '<example.com>; rel=example; title="Example Website", <example-01.com>; rel=alternate; title="Alternate Example Domain"'

Speed

$ npm run benchmark
# http-link-header .parse() ⨉ 1000000
ok ~1.29 s (1 s + 289696759 ns)

# http-link-header #toString() ⨉ 1000000
ok ~554 ms (0 s + 553782657 ns)

RELATED POST

10 Must-Know Windows Shortcuts That Will Save You Time

10 Must-Know Windows Shortcuts That Will Save You Time

Arrays vs Linked Lists: Which is Better for Memory Management in Data Structures?

Arrays vs Linked Lists: Which is Better for Memory Management in Data Structures?

Navigating AWS Networking: Essential Hacks for Smooth Operation

Navigating AWS Networking: Essential Hacks for Smooth Operation

Achieving Stunning Visuals with Unity's Global Illumination

Achieving Stunning Visuals with Unity's Global Illumination

Nim's Hidden Gems: Lesser-known Features for Writing Efficient Code

Nim's Hidden Gems: Lesser-known Features for Writing Efficient Code