in guacamole-common-js/src/main/webapp/modules/Tunnel.js [554:623]
        function parseResponse() {
            // Do not handle responses if not connected
            if (!tunnel.isConnected()) {
                
                // Clean up interval if polling
                if (interval !== null)
                    clearInterval(interval);
                
                return;
            }
            // Do not parse response yet if not ready
            if (xmlhttprequest.readyState < 2) return;
            // Attempt to read status
            var status;
            try { status = xmlhttprequest.status; }
            // If status could not be read, assume successful.
            catch (e) { status = 200; }
            // Start next request as soon as possible IF request was successful
            if (!nextRequest && status === 200)
                nextRequest = makeRequest();
            // Parse stream when data is received and when complete.
            if (xmlhttprequest.readyState === 3 ||
                xmlhttprequest.readyState === 4) {
                resetTimers();
                // Also poll every 30ms (some browsers don't repeatedly call onreadystatechange for new data)
                if (pollingMode === POLLING_ENABLED) {
                    if (xmlhttprequest.readyState === 3 && !interval)
                        interval = setInterval(parseResponse, 30);
                    else if (xmlhttprequest.readyState === 4 && interval)
                        clearInterval(interval);
                }
                // If canceled, stop transfer
                if (xmlhttprequest.status === 0) {
                    tunnel.disconnect();
                    return;
                }
                // Halt on error during request
                else if (xmlhttprequest.status !== 200) {
                    handleHTTPTunnelError(xmlhttprequest);
                    return;
                }
                // Attempt to read in-progress data
                var current;
                try { current = xmlhttprequest.responseText; }
                // Do not attempt to parse if data could not be read
                catch (e) { return; }
                try {
                    parser.receive(current, true);
                }
                catch (e) {
                    close_tunnel(new Guacamole.Status(Guacamole.Status.Code.SERVER_ERROR, e.message));
                    return;
                }
            }
        }