CH-J Server Managerspráva serverov nad SSH
Menu
Uverejnený zdroj

CH-J Server Manager

Prechádzať adresáre a súbory pre konkrétne vydanie aplikácie.

Stiahnuť zdroj ZIP
CH-J / Server Manager 339 súbory
core-20261014T184258Z-3fbed0b93fdf Pridané: Dátum nezaznamenaný · Postavený:
Súbory
httpRuntime.test.js Pridané: Dátum nezaznamenaný 4,3 KB · 43 riadky
Stiahnuť súbor
1"use strict";
2const test = require('node:test');
3const assert = require('node:assert/strict');
4const fs = require('node:fs');
5const os = require('node:os');
6const path = require('node:path');
7const http = require('node:http');
8const { once } = require('node:events');
9const { runtimePaths, validateRuntime, runtimeEnvironment } = require('../src/main/diagnostics/httpRuntime');
10const { curlRequest, HttpDiagnostics } = require('../src/main/diagnostics/httpDiagnostics');
11const { parseTarget, normalizeOptions } = require('../src/main/diagnostics/common');
12test('bundled HTTP component detects missing, modified and incompatible files', t => {
13 const root=fs.mkdtempSync(path.join(os.tmpdir(),'chj-runtime-test-'));t.after(()=>fs.rmSync(root,{recursive:true,force:true}));
14 const options={resourcesPath:root};assert.throws(()=>validateRuntime(options),{code:'HTTP_RUNTIME_MISSING'});
15 const original=runtimePaths(),target=runtimePaths(options);fs.cpSync(original.root,target.root,{recursive:true});assert.equal(validateRuntime(options).arch,process.arch);
16 fs.appendFileSync(target.caPath,'tampered');assert.throws(()=>validateRuntime(options),{code:'HTTP_RUNTIME_INVALID'});
17 fs.copyFileSync(original.caPath,target.caPath);const mf=path.join(target.root,'manifest.json');const m=JSON.parse(fs.readFileSync(mf));m.arch='wrong';fs.writeFileSync(mf,JSON.stringify(m));assert.throws(()=>validateRuntime(options),{code:'HTTP_RUNTIME_INVALID'});
18});
19test('HTTP subprocess excludes proxy, key logging, trust and library injection overrides',()=>{
20 for(const key of ['CURL_CA_BUNDLE','SSL_CERT_FILE','SSLKEYLOGFILE','HTTPS_PROXY','LD_PRELOAD','DYLD_INSERT_LIBRARIES','NODE_OPTIONS','HOME','PATH'])assert.equal(runtimeEnvironment()[key],undefined);
21});
22test('bundled client measures real HTTP/1.1, validates redirects, bounds output and cancels', async t=>{
23 const sockets=new Set();const server=http.createServer((req,res)=>{
24 if(req.url==='/redirect'){res.writeHead(302,{location:'/ok'});return res.end();}
25 if(req.url==='/loop'){res.writeHead(302,{location:'/loop'});return res.end();}
26 if(req.url==='/large')return res.end(Buffer.alloc(2*1024*1024+1));
27 if(req.url==='/hang')return;
28 res.setHeader('set-cookie','private=secret');res.end('actual body');
29 });server.on('connection',s=>{sockets.add(s);s.on('close',()=>sockets.delete(s));});server.listen(0,'127.0.0.1');await once(server,'listening');t.after(async()=>{sockets.forEach(s=>s.destroy());await new Promise(r=>server.close(r));});
30 const base=`http://localhost:${server.address().port}`,settings={timeoutMs:3000},signal=new AbortController().signal;
31 const result=await curlRequest(new URL(base),'127.0.0.1','1.1',settings,signal);assert.equal(result.status,'success');assert.equal(result.downloadedBytes,11);assert.equal(result.headers['set-cookie'],'[redacted]');assert.equal(result.reused,false);assert.ok(result.capability.http3);
32 const service=new HttpDiagnostics({resolve:async()=>[{address:'127.0.0.1',family:4}]});const options=normalizeOptions({target:base+'/redirect',tools:['http'],protocols:['1.1']});const resources=service.resources();t.after(()=>service.dispose(resources));
33 assert.equal((await service.request(parseTarget(options.target.url),'127.0.0.1','1.1',options,signal,resources)).redirectCount,1);
34 await assert.rejects(service.request(parseTarget(base+'/loop'),'127.0.0.1','1.1',options,signal,resources),{code:'REDIRECT_LOOP'});
35 assert.equal((await curlRequest(new URL(base+'/large'),'127.0.0.1','1.1',settings,signal)).code,'BODY_LIMIT');
36 const control=new AbortController();const pending=curlRequest(new URL(base+'/hang'),'127.0.0.1','1.1',settings,control.signal);setTimeout(()=>control.abort(),40);await assert.rejects(pending,{code:'CANCELLED'});
37});
38test('curl transport failures remain distinct and do not assert server HTTP/3 support',async()=>{
39 for(const [exit,code] of [[6,'DNS_FAILED'],[7,'CONNECTION_REFUSED'],[28,'HTTP3_UDP_TIMEOUT'],[60,'TLS_CERT_INVALID'],[95,'HTTP3_UNVERIFIED']]){
40 const runner=async(_exe,args)=>args.includes('--version')?{code:0,stdout:Buffer.from('curl 8.22.0 OpenSSL/3.5.9\nFeatures: HTTP2 HTTP3 SSL\n')}:{code:exit,stdout:Buffer.alloc(0),stderr:'private debugging data'};
41 const r=await curlRequest(new URL('https://example.test:8443/'),'127.0.0.1','3',{timeoutMs:500},new AbortController().signal,runner);assert.equal(r.code,code);assert.equal(r.reason,undefined);assert.notEqual(r.status,'success');
42 }
43});
SHA-2569bbfb4439a0f2a70b9a599f6f9491f6f46ec13f8280dfbfbf5f09c8a55271b88

CH-J Proprietary Software License 1.14 · Zdroj sa poskytuje v rámci CH-J Proprietary Software License 1.14. Jeho dostupnosť nemení licenčné podmienky ani neposkytuje dodatočné práva.

Archív SHA-2563df08cf5e899262a6ce92d7ec2caf5c42b683f1f2b57055662b845ff7dde67a8