minisrv_service_file = true; request_is_async = true; var searchUrl = minisrv_config.services[service_name].searxng_url; if (!searchUrl.endsWith('/')) { searchUrl += '/'; } searchUrl += 'search'; if (!request_headers.query.q) { const headers = `200 OK\nContent-Type: text/html`; const data = ` Web Search Proxy

WebTV Search

Please provide a search query.

`; sendToClient(socket, headers, data); } else { const params = new URLSearchParams(); for (const key in request_headers.query) { if (request_headers.query.hasOwnProperty(key)) { params.append(key, request_headers.query[key]); } } params.append('format', 'json'); const urlObj = new URL(searchUrl); const lib = urlObj.protocol === 'https:' ? https : http; var post_data = params.toString(); const options = { protocol: urlObj.protocol, hostname: urlObj.hostname, port: parseInt(urlObj.port) || (urlObj.protocol === 'https:' ? 443 : 80), path: urlObj.pathname + (urlObj.search || ''), method: 'POST', headers: { 'User-Agent': request_headers['User-Agent'] || 'Mozilla/4.0 WebTV/2.6 (compatible; MSIE 4.0)', 'Content-Type': 'application/x-www-form-urlencoded', 'Content-Length': Buffer.byteLength(post_data), 'Accept': 'application/json, text/plain, */*', } }; if (urlObj.protocol === 'https:' && urlObj.hostname.includes("lan.zef")) { options.ca = wtvshared.getServiceDep('https/zefienetCA.pem'); } fetch(lib, options, post_data) .then(response => response.text()) .then(text => { process(text); }) .catch(err => { finishPage(`Error fetching page: ${err.message}`); }); } function fetch(lib, options, post_data) { return new Promise((resolve, reject) => { var req = lib.request(options, (res) => { let data = ''; res.on('data', chunk => data += chunk); res.on('end', () => resolve({ text: () => Promise.resolve(data) })); }).on('error', reject); req.write(post_data); // 🔁 Send body req.end(); }); } function process(data) { if (data === "Too Many Requests") { sendToClient(socket, '400 SearXNG reported
"Too Many Requests"

Please check your limiter.toml.\nContent-Type: text/plain', 'SearXNG reported "Too Many Requests", please check your limiter.toml'); return; } else { const results = JSON.parse(data).results || []; let content = ''; if (results.length === 0) { content = '

No results found

'; } else { content = '

Search Results

'; results.forEach(result => { result.title = result.title.replace(/\/g, '>'); content += `

${result.title}
Direct - Proxy
${result.content || `` || ''}


`; }); } finishPage(content); return; } } function finishPage(content) { const headers = `200 OK\nContent-Type: text/html`; const data = ` Web Search Proxy
${content} `; sendToClient(socket, headers, data); }