On 30 September 2014 18:54, Baptiste <[email protected]> wrote: > > > > On Mon, Sep 29, 2014 at 9:15 PM, William Lewis <[email protected]> wrote: >> >> Hi all >> >> I have a problem with a website which uses Server-Sent Events where the long >> lived connection for the Server Events seems to be blocking other resources >> from loading on iOS clients only and only when I have haproxy between client >> and server. >> >> This is my test case. >> >> * Create a node express app which serves a html page which subscribes to an >> EventSource and asynchronously adds 200 300x100px images to the DOM >> * Node app is configured to serve resources with 500ms delay to reliably >> reproduce the problem >> * Configure basic haproxy between node app and client >> * Reset cache on iOS device and connect to server >> >> Expected result >> >> * Client open 5 simultaneous http connections to the server >> * 1 connection is blocked listening for events from the EventSource >> * The remaining 4 connections are used to download the 200 images >> >> Actual Result >> >> * Connection to EventSource is established and events start to be logged to >> the console >> * Images start to download on the page >> * Several of the images get blocked and never load >> >> >> Clearing the device cache and connecting directly to the server, all >> resources load, although the loading pattern of images is significantly >> different. >> >> If anyone has any ideas I would greatly appreciate any suggestions?? >> >> >> Sources and config included below. >> >> * index.html >> >> <html> >> <head> >> <style> >> img { >> width: 30px; >> height: 10px; >> border-style: solid; >> border-color: black; >> border-width: 1px; >> } >> </style> >> </head> >> <body> >> <script type="text/javascript"> >> var source = new EventSource('/events'); >> >> source.onmessage = function(e) { >> console.log(e.data); >> } >> >> var body = document.querySelectorAll('body'); >> var createImage = function(i) { >> var element = document.createElement('img'); >> element.src = '/' + i + '.png'; >> >> body[0].appendChild(element); >> } >> >> window.setTimeout(function() { >> for (var i = 1; i < 200; i++) { >> createImage(i); >> } >> }, 1000); >> </script> >> </body> >> </html> >> >> * app.js >> >> var express = require('express'); >> var app = express(); >> >> app.get('/events', function(req, res) { >> >> // let request last as long as possible >> req.socket.setTimeout(Infinity); >> >> var messageCount = 0; >> >> res.writeHead(200, { >> 'Content-Type': 'text/event-stream', >> 'Cache-Control': 'no-cache', >> 'Connection': 'keep-alive' >> }); >> res.write('\n'); >> >> var timeout; >> >> var emitEvent = function() { >> res.write('id:' + ++messageCount + '\n'); >> res.write('data:' + new Date().getTime() + '\n\n'); >> >> timeout = setTimeout(emitEvent, 3000); >> } >> >> req.on("close", function() { >> clearTimeout(timeout); >> }); >> >> emitEvent(); >> >> }); >> >> var staticHandler = express.static(__dirname + '/public'); >> >> app.use(function serveStatic(req, res, next) { >> setTimeout(function() { >> staticHandler(req, res, next); >> }, 500); >> }); >> >> var server = app.listen(3000, function() { >> console.log('Listening on port %d', server.address().port); >> }); >> >> >> * haproxy config >> >> global >> daemon >> quiet >> maxconn 1024 >> pidfile haproxy.pid >> log 127.0.0.1 local0 >> log 127.0.0.1 local1 notice >> >> defaults >> log global >> >> balance roundrobin >> mode http >> >> >> frontend external >> bind :80 >> default_backend test >> >> backend test >> server test localhost:3000 >> >> >> >> > > > Hi William, > > Could you please turn on option httplog and provide us the logs reported by > HAProxy? > Also, which version of HAProxy are you running? > > Baptiste
Hi William, And, if possible, could you also please provide PCAP dumps for both scenarios 1. from both sides of haproxy 2. between IOS and your backend server ? -- Benjamin Lee mailto:[email protected] Melbourne, Australia http://www.realthought.net Linux / BSD / GNU tel:+61 4 16 BEN LEE

