Skip to content

Commit 3d49e31

Browse files
committed
Add Accept-Ranges support
1 parent 891c059 commit 3d49e31

File tree

4 files changed

+70
-13
lines changed

4 files changed

+70
-13
lines changed

packages/headers/CHANGELOG.md

+6-5
Original file line numberDiff line numberDiff line change
@@ -128,11 +128,12 @@ header.getPreferred(['gzip', 'deflate']); // 'gzip'
128128
```
129129

130130
- Added `SuperHeaders.prototype` (getters and setters) for:
131-
- `headers.accept`
132-
- `headers.acceptEncoding`
133-
- `headers.connection`
134-
- `headers.host`
135-
- `headers.referer`
131+
- `accept`
132+
- `acceptEncoding`
133+
- `acceptRanges`
134+
- `connection`
135+
- `host`
136+
- `referer`
136137

137138
## v0.8.0 (2024-11-14)
138139

packages/headers/README.md

+12
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,12 @@ headers.acceptLanguage.accepts('ja'); // false
6464
headers.acceptLanguage.getPreferred(['en-US', 'en-GB']); // 'en-US'
6565
headers.acceptLanguage.getPreferred(['en', 'fr']); // 'en'
6666

67+
// Accept-Ranges
68+
headers.acceptRanges = 'bytes';
69+
70+
// Connection
71+
headers.connection = 'close';
72+
6773
// Content-Type
6874
headers.contentType = 'application/json; charset=utf-8';
6975

@@ -92,6 +98,12 @@ console.log(headers.cookie.get('user_id')); // '12345'
9298
headers.cookie.set('theme', 'dark');
9399
console.log(headers.get('Cookie')); // 'session_id=abc123; user_id=12345; theme=dark'
94100

101+
// Host
102+
headers.host = 'example.com';
103+
104+
// Referer
105+
headers.referer = 'https://example.com/';
106+
95107
// Set-Cookie
96108
headers.setCookie = ['session_id=abc123; Path=/; HttpOnly'];
97109

packages/headers/src/lib/super-headers.test.ts

+17
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,11 @@ describe('SuperHeaders', () => {
173173
assert.equal(headers.get('Accept-Language'), 'en-us,en;q=0.9');
174174
});
175175

176+
it('handles the acceptRanges property', () => {
177+
let headers = new SuperHeaders({ acceptRanges: 'bytes' });
178+
assert.equal(headers.get('Accept-Ranges'), 'bytes');
179+
});
180+
176181
it('handles the age property', () => {
177182
let headers = new SuperHeaders({ age: 42 });
178183
assert.equal(headers.get('Age'), '42');
@@ -327,6 +332,18 @@ describe('SuperHeaders', () => {
327332
assert.equal(headers.acceptLanguage.toString(), '');
328333
});
329334

335+
it('supports the acceptRanges property', () => {
336+
let headers = new SuperHeaders();
337+
338+
assert.equal(headers.acceptRanges, null);
339+
340+
headers.acceptRanges = 'bytes';
341+
assert.equal(headers.acceptRanges, 'bytes');
342+
343+
headers.acceptRanges = null;
344+
assert.equal(headers.acceptRanges, null);
345+
});
346+
330347
it('supports the age property', () => {
331348
let headers = new SuperHeaders();
332349

packages/headers/src/lib/super-headers.ts

+35-8
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@ interface SuperHeadersPropertyInit {
2828
* The [`Accept-Language`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Accept-Language) header value.
2929
*/
3030
acceptLanguage?: string | AcceptLanguageInit;
31+
/**
32+
* The [`Accept-Ranges`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Accept-Ranges) header value.
33+
*/
34+
acceptRanges?: string;
3135
/**
3236
* The [`Age`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Age) header value.
3337
*/
@@ -36,6 +40,10 @@ interface SuperHeadersPropertyInit {
3640
* The [`Cache-Control`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control) header value.
3741
*/
3842
cacheControl?: string | CacheControlInit;
43+
/**
44+
* The [`Connection`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Connection) header value.
45+
*/
46+
connection?: string;
3947
/**
4048
* The [`Content-Disposition`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition) header value.
4149
*/
@@ -60,6 +68,10 @@ interface SuperHeadersPropertyInit {
6068
* The [`Expires`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Expires) header value.
6169
*/
6270
expires?: string | DateInit;
71+
/**
72+
* The [`Host`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Host) header value.
73+
*/
74+
host?: string;
6375
/**
6476
* The [`If-Modified-Since`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/If-Modified-Since) header value.
6577
*/
@@ -72,6 +84,10 @@ interface SuperHeadersPropertyInit {
7284
* The [`Last-Modified`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Last-Modified) header value.
7385
*/
7486
lastModified?: string | DateInit;
87+
/**
88+
* The [`Referer`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referer) header value.
89+
*/
90+
referer?: string;
7591
/**
7692
* The [`Set-Cookie`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie) header value(s).
7793
*/
@@ -115,15 +131,11 @@ export class SuperHeaders extends Headers {
115131
for (let name of Object.getOwnPropertyNames(init)) {
116132
let value = init[name];
117133

118-
if (typeof value === 'string') {
119-
this.set(name, value);
134+
let descriptor = Object.getOwnPropertyDescriptor(SuperHeaders.prototype, name);
135+
if (descriptor?.set) {
136+
descriptor.set.call(this, value);
120137
} else {
121-
let descriptor = Object.getOwnPropertyDescriptor(SuperHeaders.prototype, name);
122-
if (descriptor?.set) {
123-
descriptor.set.call(this, value);
124-
} else {
125-
this.set(name, value.toString());
126-
}
138+
this.set(name, value.toString());
127139
}
128140
}
129141
}
@@ -346,6 +358,21 @@ export class SuperHeaders extends Headers {
346358
this.#setHeaderValue('accept-language', AcceptLanguage, value);
347359
}
348360

361+
/**
362+
* The `Accept-Ranges` header indicates the server's acceptance of range requests.
363+
*
364+
* [MDN `Accept-Ranges` Reference](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Accept-Ranges)
365+
*
366+
* [HTTP/1.1 Specification](https://datatracker.ietf.org/doc/html/rfc7233#section-2.3)
367+
*/
368+
get acceptRanges(): string | null {
369+
return this.get('accept-ranges');
370+
}
371+
372+
set acceptRanges(value: string | undefined | null) {
373+
this.#setValue('accept-ranges', value);
374+
}
375+
349376
/**
350377
* The `Age` header contains the time in seconds an object was in a proxy cache.
351378
*

0 commit comments

Comments
 (0)