Skip to content

Commit e24f757

Browse files
committed
Add ETag support
1 parent de7b61e commit e24f757

File tree

3 files changed

+52
-0
lines changed

3 files changed

+52
-0
lines changed

packages/headers/CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@ header.getPreferred(['gzip', 'deflate']); // 'gzip'
134134
- `connection`
135135
- `contentEncoding`
136136
- `contentLanguage`
137+
- `etag`
137138
- `host`
138139
- `location`
139140
- `referer`

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

+29
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,11 @@ describe('SuperHeaders', () => {
232232
assert.equal(headers.get('Date'), 'Fri, 01 Jan 2021 00:00:00 GMT');
233233
});
234234

235+
it('handles the etag property', () => {
236+
let headers = new SuperHeaders({ etag: 'abc' });
237+
assert.equal(headers.get('ETag'), '"abc"');
238+
});
239+
235240
it('handles the expires property', () => {
236241
let headers = new SuperHeaders({ expires: new Date('2021-01-01T00:00:00Z') });
237242
assert.equal(headers.get('Expires'), 'Fri, 01 Jan 2021 00:00:00 GMT');
@@ -526,6 +531,30 @@ describe('SuperHeaders', () => {
526531
assert.equal(headers.date, null);
527532
});
528533

534+
it('supports the etag property', () => {
535+
let headers = new SuperHeaders();
536+
537+
assert.equal(headers.etag, null);
538+
539+
headers.etag = 'abc';
540+
assert.equal(headers.etag, '"abc"');
541+
542+
headers.etag = '"def"';
543+
assert.equal(headers.etag, '"def"');
544+
545+
headers.etag = 'W/"def"';
546+
assert.equal(headers.etag, 'W/"def"');
547+
548+
headers.etag = '';
549+
assert.equal(headers.etag, '""');
550+
551+
headers.etag = '""';
552+
assert.equal(headers.etag, '""');
553+
554+
headers.etag = null;
555+
assert.equal(headers.etag, null);
556+
});
557+
529558
it('supports the expires property', () => {
530559
let headers = new SuperHeaders();
531560

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

+22
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,10 @@ interface SuperHeadersPropertyInit {
7272
* The [`Date`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Date) header value.
7373
*/
7474
date?: string | DateInit;
75+
/**
76+
* The [`ETag`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/ETag) header value.
77+
*/
78+
etag?: string;
7579
/**
7680
* The [`Expires`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Expires) header value.
7781
*/
@@ -543,6 +547,24 @@ export class SuperHeaders extends Headers {
543547
this.#setDateValue('date', value);
544548
}
545549

550+
/**
551+
* The `ETag` header provides a unique identifier for the current version of the resource.
552+
*
553+
* [MDN `ETag` Reference](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/ETag)
554+
*
555+
* [HTTP/1.1 Specification](https://datatracker.ietf.org/doc/html/rfc7232#section-2.3)
556+
*/
557+
get etag(): string | null {
558+
return this.get('etag');
559+
}
560+
561+
set etag(value: string | undefined | null) {
562+
this.#setValue(
563+
'etag',
564+
typeof value === 'string' && !/^(W\/)?".*"$/.test(value) ? `"${value}"` : value,
565+
);
566+
}
567+
546568
/**
547569
* The `Expires` header contains the date/time after which the response is considered stale.
548570
*

0 commit comments

Comments
 (0)