This runs the exact XML request BSRunner sends when it lists companies — a curl POST to http://=esc($host)?>:=esc($port)?>/. Reaching that address in a browser only opens a GET and proves the port is listening; it does not prove BSRunner's POST gets through. Run it below.
| curl extension | = function_exists('curl_init') ? 'loaded' : 'MISSING' ?> |
| Target URL | http://=esc($host)?>:=esc($port)?>/ |
| Connected to IP | =esc($best['primary_ip'] ?: '—')?> IPv6 |
| HTTP status | = $best['http'] ? (''.esc($best['http']).'') : 'no response' ?> |
| Connect time | =esc($best['connect_ms'])?> ms |
| Total time | =esc($best['total_ms'])?> ms |
| Reply size | =esc($best['size'])?> bytes |
| curl error | = $best['err'] ? esc('['.$best['errno'].'] '.$best['err']) : '—' ?> |
| Raw TCP connect curl-independent socket |
= $tcp['ok'] ? 'open' : 'blocked' ?> =esc($tcp['ms'])?> ms = $tcp['err']?esc('· '.$tcp['err']):'' ?> |
| GET (what the browser does) | = $get['ok'] ? ('HTTP '.esc($get['http']).'') : 'failed' ?> = $get['body']!=='' ? esc(trim(mb_substr($get['body'],0,80))) : esc($get['err']) ?> |
| POST XML (what BSRunner does) | = ($best && $best['ok'] && $best['http']===200) ? 'HTTP 200' : ''.esc($best['http']?:'no response').'' ?> =esc($best['size'])?> bytes |
If TCP is open and GET works but POST fails, the port and Tally are fine — the fault is curl/proxy on the POST. If TCP is blocked here but the browser reaches the port, Apache's service account is being firewalled or proxied differently than your user.
| =esc($h)?>= $h==='::1'?' (IPv6)':($h==='127.0.0.1'?' (IPv4)':' (name)') ?> | = $r['ok'] ? 'reachable' : 'no' ?> =esc($r['ms'])?> ms = $r['err']?esc('· '.$r['err']):'' ?> |
If 127.0.0.1 is reachable but localhost is not (or is slow), a localhost anywhere in your Tally path resolves to ::1 and misses Tally. Keep the import host as 127.0.0.1.
| PHP version | =esc(PHP_VERSION)?> · =esc(PHP_OS)?> |
| curl version | = function_exists('curl_version') ? esc(curl_version()['version'].' / '.curl_version()['ssl_version']) : 'curl NOT loaded' ?> |
| Loaded php.ini | =esc(php_ini_loaded_file() ?: '(none)')?> |
| Runs as user | =esc(get_current_user() ?: getenv('USERNAME') ?: '?')?> |
| =esc($pv)?> | =esc($val)?> set — may hijack loopback |
| Proxy env vars | none set |
=esc(bsr_company_xml('fetch'))?>
= $best && $best['body']!=='' ? esc(mb_substr($best['body'],0,8000)) : '(empty — nothing returned)' ?>
= $best ? esc($best['verbose'] ?: '(none)') : '(none)' ?>
localhost, PHP may resolve it to ::1
while Tally listens only on 127.0.0.1. Fix: set the host to 127.0.0.1 everywhere. (This
test forces IPv4, so if it works here but the app fails, this is almost certainly it.)http_proxy / HTTP_PROXY is set for the web-server
process, curl routes even loopback calls through it. This page blanks the proxy; make sure the app does too, or
exclude 127.0.0.1 via no_proxy.=esc($port)?>. A GET in the browser can succeed
even when POST behaviour is off, so confirm this explicitly.php.exe
/ the web server from opening the loopback socket. Allow it, or test with server and Tally on the same machine.extension=curl in
php.ini and restart the web server — BSRunner can't reach Tally at all without it.