dcrouter/test/suite/smtpclient_edge-cases/test.cedge-06.large-headers.ts
2025-05-26 04:09:29 +00:00

180 lines
5.4 KiB
TypeScript

import { tap, expect } from '@git.zone/tstest/tapbundle';
import { startTestServer, stopTestServer, type ITestServer } from '../../helpers/server.loader.js';
import { createSmtpClient } from '../../../ts/mail/delivery/smtpclient/index.js';
import { Email } from '../../../ts/mail/core/classes.email.js';
let testServer: ITestServer;
tap.test('setup test SMTP server', async () => {
testServer = await startTestServer({
port: 2575,
tlsEnabled: false,
authRequired: false
});
expect(testServer).toBeTruthy();
expect(testServer.port).toEqual(2575);
});
tap.test('CEDGE-06: Very long subject lines', async () => {
console.log('Testing very long subject lines');
const smtpClient = createSmtpClient({
host: testServer.hostname,
port: testServer.port,
secure: false,
connectionTimeout: 5000,
debug: true
});
// Test various subject line lengths
const testSubjects = [
'Normal Subject Line',
'A'.repeat(100), // 100 chars
'B'.repeat(500), // 500 chars
'C'.repeat(1000), // 1000 chars
'D'.repeat(2000), // 2000 chars - very long
];
for (const subject of testSubjects) {
console.log(` Testing subject length: ${subject.length} chars`);
const email = new Email({
from: 'sender@example.com',
to: ['recipient@example.com'],
subject: subject,
text: 'Testing large subject headers'
});
const result = await smtpClient.sendMail(email);
expect(result).toBeDefined();
expect(result.messageId).toBeDefined();
}
await smtpClient.close();
});
tap.test('CEDGE-06: Multiple large headers', async () => {
console.log('Testing multiple large headers');
const smtpClient = createSmtpClient({
host: testServer.hostname,
port: testServer.port,
secure: false,
connectionTimeout: 5000,
debug: true
});
// Create email with multiple large headers
const largeValue = 'X'.repeat(500);
const email = new Email({
from: 'sender@example.com',
to: ['recipient@example.com'],
subject: 'Multiple large headers test',
text: 'Testing multiple large headers',
headers: {
'X-Large-Header-1': largeValue,
'X-Large-Header-2': largeValue,
'X-Large-Header-3': largeValue,
'X-Large-Header-4': largeValue,
'X-Large-Header-5': largeValue,
'X-Very-Long-Header-Name-That-Exceeds-Normal-Limits': 'Value for long header name',
'X-Mixed-Content': `Start-${largeValue}-Middle-${largeValue}-End`
}
});
const result = await smtpClient.sendMail(email);
console.log(`Result: ${result.messageId ? 'Success' : 'Failed'}`);
expect(result).toBeDefined();
expect(result.messageId).toBeDefined();
await smtpClient.close();
});
tap.test('CEDGE-06: Header folding and wrapping', async () => {
console.log('Testing header folding and wrapping');
const smtpClient = createSmtpClient({
host: testServer.hostname,
port: testServer.port,
secure: false,
connectionTimeout: 5000,
debug: true
});
// Create headers that should be folded
const longHeaderValue = 'This is a very long header value that should exceed the recommended 78 character line limit and force the header to be folded across multiple lines according to RFC 5322 specifications';
const email = new Email({
from: 'sender@example.com',
to: ['recipient@example.com'],
subject: 'Header folding test with a very long subject line that should also be folded properly',
text: 'Testing header folding',
headers: {
'X-Long-Header': longHeaderValue,
'X-Multi-Line': `Line 1 ${longHeaderValue}\nLine 2 ${longHeaderValue}\nLine 3 ${longHeaderValue}`,
'X-Special-Chars': `Header with special chars: \t\r\n\x20 and unicode: 🎉 émojis`
}
});
const result = await smtpClient.sendMail(email);
console.log(`Result: ${result.messageId ? 'Success' : 'Failed'}`);
expect(result).toBeDefined();
expect(result.messageId).toBeDefined();
await smtpClient.close();
});
tap.test('CEDGE-06: Maximum header size limits', async () => {
console.log('Testing maximum header size limits');
const smtpClient = createSmtpClient({
host: testServer.hostname,
port: testServer.port,
secure: false,
connectionTimeout: 5000,
debug: true
});
// Test near RFC limits (recommended 998 chars per line)
const nearMaxValue = 'Y'.repeat(900); // Near but under limit
const overMaxValue = 'Z'.repeat(1500); // Over recommended limit
const testCases = [
{ name: 'Near limit', value: nearMaxValue },
{ name: 'Over limit', value: overMaxValue }
];
for (const testCase of testCases) {
console.log(` Testing ${testCase.name}: ${testCase.value.length} chars`);
const email = new Email({
from: 'sender@example.com',
to: ['recipient@example.com'],
subject: `Header size test: ${testCase.name}`,
text: 'Testing header size limits',
headers: {
'X-Size-Test': testCase.value
}
});
try {
const result = await smtpClient.sendMail(email);
console.log(` ${testCase.name}: Success`);
expect(result).toBeDefined();
} catch (error) {
console.log(` ${testCase.name}: Failed (${error.message})`);
// Some failures might be expected for oversized headers
expect(error).toBeDefined();
}
}
await smtpClient.close();
});
tap.test('cleanup test SMTP server', async () => {
if (testServer) {
await stopTestServer(testServer);
}
});
export default tap.start();