Publicētais avots
Lejupielādēt avota ZIP
CH-J Server Manager
Pārlūkot mapes un failus konkrētai lietojumprogrammas izdošanai.
CH-J / Server Manager
339 faili
core-20261014T184258Z-3fbed0b93fdf
Pievienots: Datums nav reģistrēts · Būvēts:
1
"use strict";2
const test = require('node:test');3
const assert = require('node:assert/strict');4
const fs = require('node:fs');5
const os = require('node:os');6
const path = require('node:path');7
const http = require('node:http');8
const { once } = require('node:events');9
const { runtimePaths, validateRuntime, runtimeEnvironment } = require('../src/main/diagnostics/httpRuntime');10
const { curlRequest, HttpDiagnostics } = require('../src/main/diagnostics/httpDiagnostics');11
const { parseTarget, normalizeOptions } = require('../src/main/diagnostics/common');12
test('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
});19
test('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
});22
test('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
});38
test('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-256
9bbfb4439a0f2a70b9a599f6f9491f6f46ec13f8280dfbfbf5f09c8a55271b88CH-J Proprietary Software License 1.14 · Avots ir sniegts saskaņā ar CH-J Proprietary Software License 1.14. Tā pieejamība nemaina licences noteikumus un nepiešķir papildu tiesības.
Arhīvs SHA-256
3df08cf5e899262a6ce92d7ec2caf5c42b683f1f2b57055662b845ff7dde67a8