feat(handlers): Add in-memory HTTP-01 challenge handler and rename file-based handler to Http01Webroot
This commit is contained in:
58
test/test.handlers-http01-memory.ts
Normal file
58
test/test.handlers-http01-memory.ts
Normal file
@ -0,0 +1,58 @@
|
||||
import { tap, expect } from '@push.rocks/tapbundle';
|
||||
import { Http01MemoryHandler } from '../ts/handlers/Http01MemoryHandler.js';
|
||||
|
||||
tap.test('Http01MemoryHandler serves in-memory challenges and cleans up', async () => {
|
||||
const handler = new Http01MemoryHandler();
|
||||
const token = 'testtoken';
|
||||
const keyAuth = 'keyAuthValue';
|
||||
const webPath = `/.well-known/acme-challenge/${token}`;
|
||||
const challenge = { type: 'http-01', token, keyAuthorization: keyAuth, webPath };
|
||||
|
||||
// Prepare challenge (store in memory)
|
||||
await handler.prepare(challenge);
|
||||
|
||||
// Serve existing challenge without next()
|
||||
const req1: any = { url: webPath };
|
||||
const res1: any = {
|
||||
statusCode: 0,
|
||||
headers: {} as Record<string, string>,
|
||||
body: '',
|
||||
setHeader(name: string, value: string) { this.headers[name] = value; },
|
||||
end(body?: string) { this.body = body || ''; },
|
||||
};
|
||||
handler.handleRequest(req1, res1);
|
||||
expect(res1.statusCode).toEqual(200);
|
||||
expect(res1.body).toEqual(keyAuth);
|
||||
expect(res1.headers['content-type']).toEqual('text/plain');
|
||||
|
||||
// Cleanup challenge (remove from memory)
|
||||
await handler.cleanup(challenge);
|
||||
|
||||
// Serve after cleanup without next() should give 404
|
||||
const req2: any = { url: webPath };
|
||||
const res2: any = {
|
||||
statusCode: 0,
|
||||
headers: {} as Record<string, string>,
|
||||
body: '',
|
||||
setHeader(name: string, value: string) { this.headers[name] = value; },
|
||||
end(body?: string) { this.body = body || ''; },
|
||||
};
|
||||
handler.handleRequest(req2, res2);
|
||||
expect(res2.statusCode).toEqual(404);
|
||||
|
||||
// Serve after cleanup with next() should call next
|
||||
const req3: any = { url: webPath };
|
||||
let nextCalled = false;
|
||||
const next = () => { nextCalled = true; };
|
||||
const res3: any = {
|
||||
statusCode: 0,
|
||||
headers: {} as Record<string, string>,
|
||||
body: '',
|
||||
setHeader(name: string, value: string) { this.headers[name] = value; },
|
||||
end(body?: string) { this.body = body || ''; },
|
||||
};
|
||||
handler.handleRequest(req3, res3, next);
|
||||
expect(nextCalled).toEqual(true);
|
||||
});
|
||||
|
||||
export default tap.start();
|
@ -1,13 +1,13 @@
|
||||
import { tap, expect } from '@push.rocks/tapbundle';
|
||||
import { Http01Handler } from '../ts/handlers/Http01Handler.js';
|
||||
import { Http01Webroot } from '../ts/handlers/Http01Handler.js';
|
||||
import { promises as fs } from 'fs';
|
||||
import * as path from 'path';
|
||||
import os from 'os';
|
||||
|
||||
tap.test('Http01Handler writes challenge file and removes it on cleanup', async () => {
|
||||
tap.test('Http01Webroot writes challenge file and removes it on cleanup', async () => {
|
||||
// create temporary webroot directory
|
||||
const tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), 'http01-'));
|
||||
const handler = new Http01Handler({ webroot: tmpDir });
|
||||
const handler = new Http01Webroot({ webroot: tmpDir });
|
||||
const token = 'testtoken';
|
||||
const keyAuth = 'keyAuthValue';
|
||||
const webPath = `/.well-known/acme-challenge/${token}`;
|
||||
|
Reference in New Issue
Block a user