Giter Club home page Giter Club logo

go-engine.io's People

Contributors

abourget avatar adrianmxb avatar artushin avatar chappjc avatar clearcodecn avatar criyle avatar disruptivemind avatar erkie avatar fujimoto avatar googollee avatar m25n avatar mountkin avatar mtsgrd avatar mweibel avatar nkovacs avatar rubenv avatar steveoc64 avatar timstudd avatar toritori0318 avatar zichengleee avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

go-engine.io's Issues

panic: concurrent write to websocket connection

occasionally panic as below

panic: concurrent write to websocket connection

goroutine 3475 [running]:
github.com/gorilla/websocket.(*messageWriter).flushFrame(0xc0003d87e0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0)
/home/gopath/src/github.com/gorilla/websocket/conn.go:597 +0xac3
github.com/gorilla/websocket.(*messageWriter).Close(0xc0003d87e0, 0x0, 0x0)
/home/gopath/src/github.com/gorilla/websocket/conn.go:711 +0x80
github.com/gorilla/websocket.(*Conn).beginMessage(0xc0004b0c60, 0xc00011e4b0, 0x1, 0x0, 0x0)
/home/gopath/src/github.com/gorilla/websocket/conn.go:460 +0x71
github.com/gorilla/websocket.(*Conn).NextWriter(0xc0004b0c60, 0x1, 0x0, 0x0, 0x0, 0x0)
/home/gopath/src/github.com/gorilla/websocket/conn.go:500 +0xb0
github.com/googollee/go-engine.io/transport/websocket.wrapper.NextWriter(0xc0004b0c60, 0x418800, 0x0, 0x0, 0x0, 0x0)
/home/gopath/src/github.com/googollee/go-engine.io/transport/websocket/wrapper.go:47 +0x9b
github.com/googollee/go-engine.io/packet.(*encoder).NextWriter(0xc0001da0c0, 0x7f31c89c6f00, 0x3, 0x0, 0x0, 0x0, 0x0)
/home/gopath/src/github.com/googollee/go-engine.io/packet/encoder.go:20 +0x81
github.com/googollee/go-engine%2eio.(*session).nextWriter(0xc00029f130, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0)
/home/gopath/src/github.com/googollee/go-engine.io/session.go:155 +0xb8
github.com/googollee/go-engine%2eio.(*session).NextReader.func1(0xc00029f130, 0x1002d00, 0x11533c0, 0xc00011e420, 0x0, 0x0)
/home/gopath/src/github.com/googollee/go-engine.io/session.go:78 +0x73
github.com/googollee/go-engine%2eio.(*session).NextReader(0xc00029f130, 0x0, 0x0, 0x0, 0x0, 0x0)
/home/gopath/src/github.com/googollee/go-engine.io/session.go:84 +0x204
github.com/googollee/go-socket.io/parser.(*Decoder).DecodeHeader(0xc00007ccc0, 0xc0006adfa0, 0xc00044c000, 0x0, 0x0)
/home/gopath/src/github.com/googollee/go-socket.io/parser/decoder.go:58 +0x6d
github.com/googollee/go-socket%2eio.(*conn).serveRead(0xc00012cc00)
/home/gopath/src/github.com/googollee/go-socket.io/conn.go:180 +0x10c
created by github.com/googollee/go-socket%2eio.(*conn).connect
/home/gopath/src/github.com/googollee/go-socket.io/conn.go:99 +0x28a

Stall in upgrade (race condition)

I'm experiencing a race condition on upgrading (polling -> websocket)
Related topics: socketio/engine.io-client#18 and socketio/engine.io#174

The sequence of the problem is the following:

  • engine.io-client (javascript) sends a ping probe (2probe) on the websocket connection just created
  • engine.io server (javascript or go-engine.io) responds with two packets: a pong probe (3probe) on the websocket connection and a noop packet on the polling connection. The goal of the noop is to close the polling connection
  • When engine.io-client receives the 3probe it "pauses" the polling connection. Basically, as soon as the latest ongoing polling is over (a packet has been received from the server, for example a noop) the "pause" is finished and the transport is set to websocket. This is when the client sends a 'upgrade' to the server and so the upgrade is finished.

Until this "pause" is finished, the 'upgrade' is not sent and so the connection is still seen as 'upgrading' on the server and so the server refuses to send any message to this client ('upgrading').
The problem can arise in the second step of the sequence above: if the noop arrives before the 3probe then it does not close the latest polling connection (the client has not started "pausing" yet). So a new polling connection will be opened and the client will wait the next packet to finish the pausing. Usually it is a "ping" packet sent from the server and it can take a while (it depends on the ping interval set in the configuration). Clearly, in this data race condition the noop packet is not filling its role (it's closing the latest polling before the pause instead of after).
Here is the handler of the 3probe in the engine.io-client: https://github.com/socketio/engine.io-client/blob/master/lib/socket.js#L294

The javascript engine.io server has a workaround for this problem by sending multiple noop to "ensure a fast upgrade" (https://github.com/socketio/engine.io/blob/master/lib/socket.js#L215)

In my opinion this is a workaround and the problem is sitting in engine.io-client in the way it does the "pause" process.
However, because the fix has been made in the server part I suggest that we do the same here to solve this issue.
I can think about a similar workaround that would basically replace this bit: https://github.com/googollee/go-engine.io/blob/master/server_conn.go#L213 by a for loop that would only stop when c.getUpgrade()==nil. It would effectively send noop packets until the upgrade is over.
I've tested this workaround locally, it works and usually it does not send more than two noop packets.
I can do a pull request if this solution looks good to you

Parser does not work with Batches of messages on a Packet

The Engine.IO client can send in batches: encode or decode multiple messages as one packet.
When there is more than a message and the response for the earlier message not returned.

When the transport is polling sending multiple messages on a single packet causes error in PayloadDecoder.

Sample XHR request payload with data omitted:
581:42["message","{ data }"]662:42["message","{ data }"]

Response is "invalid input" with header 400 Bad request.

Server.ServeHTTP: when newServerConn failed should decrease connection count

refer https://github.com/googollee/go-engine.io/blob/master/server.go#L134-L148

        n := atomic.AddInt32(&s.currentConnection, 1)
        if int(n) > s.config.MaxConnection {
            atomic.AddInt32(&s.currentConnection, -1)
            http.Error(w, "too many connections", http.StatusServiceUnavailable)
            return
        }

        sid = s.config.NewId(r)

        var err error
        conn, err = newServerConn(sid, w, r, s)
        if err != nil {
            // should decrease the connection count here
            http.Error(w, err.Error(), http.StatusBadRequest)
            return
        }

Description:

When there is only websocket transport but client using polling transport connect to the server, the server will increase the connection count, but no chance to decrease it because of the server conn creation failed.

once MaxConnection is reached, server can never recover

Today is only my 3rd day with Golang, so please excuse me if I have made a newbie mistake. But I believe that there's a bug in detecting MaxConnections. If I understand correctly, currentConnection is really a count of the number of connected sessions (connectionCount might be a better name?)

So on server.go line 124, s.currentConnection is incremented, and then returns an error to the client. This variable should be decremented prior to the return (or better yet, never incremented in the first place).

Explanation: if the server is currently maxed out, and (for example) 5 more clients attempt to join, this will push the server 5 over the limit. And so clients will be locked out until at least 5 current clients close. If you have a busy server, it might never recover. I discovered this during load testing.

The atomic.AddInt32 call implies some kind of threading issue; a cleaner solution might be to augment the Sessions interface to also have a Count(), which would then be responsible for the thread safety as well. Since Get/Set/Remove all just delegate to the sessions map, the default implementation could then simply return len(sessions).

panic: close of closed channel

panic: close of closed channel

goroutine 314515 [running]:
sunmi-socket.io/vendor/github.com/googollee/go-engine%2eio.(*serverConn).OnClose(0xc4bbe5edd0, 0xb8a5a0, 0xc4bbd45400)
/app/go/src/sunmi-socket.io/vendor/github.com/googollee/go-engine.io/server_conn.go:261 +0x110
sunmi-socket.io/vendor/github.com/googollee/go-engine.io/polling.(*Polling).Close(0xc4bbd45400, 0xb8a5a0, 0xc4bbd45400)
/app/go/src/sunmi-socket.io/vendor/github.com/googollee/go-engine.io/polling/server.go:67 +0x10c
sunmi-socket.io/vendor/github.com/googollee/go-engine%2eio.(*serverConn).Close(0xc4bbe5edd0, 0xc53f8d5c20, 0x0)
/app/go/src/sunmi-socket.io/vendor/github.com/googollee/go-engine.io/server_conn.go:175 +0xfe
sunmi-socket.io/vendor/github.com/googollee/go-engine%2eio.(*serverConn).pingLoop(0xc4bbe5edd0)
/app/go/src/sunmi-socket.io/vendor/github.com/googollee/go-engine.io/server_conn.go:384 +0x39f
created by sunmi-socket.io/vendor/github.com/googollee/go-engine%2eio.newServerConn
/app/go/src/sunmi-socket.io/vendor/github.com/googollee/go-engine.io/server_conn.go:111 +0x3f4

Ping Packets

After successfully establishing a connection, I'm receiving very long ping request packets that keep growing over time:

(2014-08-05 23:18:48 +0000 Recieve -> , Optional(EngineIOPacket Type: 2, Data: , Response: 3), ��ÿ2)
(2014-08-05 23:18:48 +0000 Recieve -> , Optional(EngineIOPacket Type: 2, Data: ��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2��ÿ2,

I'm replying to the ping with a pong packet that conforms to the engine.io protocol of 3<data>, to no avail. Any ideas?

Panic on send to pingChan in OnPacket

I am using this version a66cf68

case parser.PONG: c.pingChan <- true

goroutine 2934740 [running]:
panic(0xaffb20, 0xc823eb7ca0)
/home/navneet/go/go1.6.2/src/runtime/panic.go:481 +0x3e6
github.com/googollee/go-engine%2eio.(_serverConn).OnPacket(0xc821588f70, 0xc823c2de80)
/home/navneet/repo/pubsub/_vendor/src/github.com/googollee/go-engine.io/server_conn.go:228 +0x44c
github.com/googollee/go-engine.io/websocket.(_Server).serveHTTP(0xc82486d820, 0x7ff3132310c8, 0xc8213e80d0, 0xc8223a4c40)
/home/navneet/repo/pubsub/_vendor/src/github.com/googollee/go-engine.io/websocket/server.go:77 +0x196
created by github.com/googollee/go-engine.io/websocket.NewServer
/home/navneet/repo/pubsub/_vendor/src/github.com/googollee/go-engine.io/websocket/server.go:29 +0x16d

read & write different goroutines concurrent

latest version can not support one goroutine block read, another goroutine block write concurrnt.
when read block, write goroutine can't write anything, because writer & reader control by
a sync.RWMutex.

Why?

PingChan can be closed outside of the pingLocker

Can I get some code review on this PR on our branch of go-engine.io please. Need some more eyes on it.

Got an issue where it actually tried to write to pingChan, when pingChan is closed. Pretty rare - we have hit this at least once, in what would be a very large number of connections over that period.

This is a bit odd, because the pingLocker looks like it will prevent this. However, there is a tiny slice of time where this is not true. This lines up well with the low error rate, and my hypothesis about why it died when it did.

https://github.com/divisionone/go-engine.io/pull/4/files

Fix check origin gorilla web socket

Hello,
You need to add

CheckOrigin: func(r *http.Request) bool {
return true
},

to transport/websocket/transport.go. It cause 403 Forbidden when using CORS to allow external origins. on gorilla websocket:

if !checkOrigin(r) {
return u.returnError(w, r, http.StatusForbidden, "websocket: request origin not allowed by Upgrader.CheckOrigin")
}
in the server.go

So it's blocking every request

Separate js files in the example

In the example's asset folder there is an index.js file. It contains engine.io, smoothie chart and app code. It would be better if the code is stored in separate files. This way it will be easier for everyone to understand the example and get the minimal code needed to build an application. It would also help others to debug the code and find problems.

race condition in packet handling

I was testing go-engine and I noticed having something like the following (yes I know it's silly but it illustrates the purpose) can easily cause panics.

    so.On("msg", func(msg string) {
        fmt.Println("starting heavy task...")
        time.Sleep(5 * time.Second)
        fmt.Println("finished heavy task")
    })

The panic I got was the following:

2014/08/14 17:52:43 http: panic serving 127.0.0.1:62736: runtime error: send on closed channel
goroutine 37 [running]:
net/http.func·011()
    /usr/local/Cellar/go/1.3/libexec/src/pkg/net/http/server.go:1100 +0xb7
runtime.panic(0x2b8e40, 0x48667e)
    /usr/local/Cellar/go/1.3/libexec/src/pkg/runtime/panic.c:248 +0x18d
github.com/googollee/go-engine%2eio.(*conn).onPacket(0xc20802b3b0, 0xc20803aac0)
    /Users/mfreitas/Projects/go/src/github.com/googollee/go-engine.io/conn.go:236 +0x1cc
github.com/googollee/go-engine%2eio.(*websocket).ServeHTTP(0xc20803adc0, 0x53ba60, 0xc2080532c0, 0xc2080291e0)
    /Users/mfreitas/Projects/go/src/github.com/googollee/go-engine.io/websocket.go:79 +0x1cf
github.com/googollee/go-engine%2eio.(*conn).serveHTTP(0xc20802b3b0, 0x53ba60, 0xc2080532c0, 0xc2080291e0)
    /Users/mfreitas/Projects/go/src/github.com/googollee/go-engine.io/conn.go:183 +0x1d8
github.com/googollee/go-engine%2eio.(*Server).ServeHTTP(0xc208018410, 0x53ba60, 0xc2080532c0, 0xc2080291e0)
    /Users/mfreitas/Projects/go/src/github.com/googollee/go-engine.io/server.go:128 +0x8ea
github.com/googollee/go-socket%2eio.(*Server).ServeHTTP(0xc208042500, 0x53ba60, 0xc2080532c0, 0xc2080291e0)
    /Users/mfreitas/Projects/go/src/github.com/googollee/go-socket.io/server.go:62 +0x49
github.com/googollee/go-socket%2eio.*Server.ServeHTTP·fm(0x53ba60, 0xc2080532c0, 0xc2080291e0)
    /Users/mfreitas/Projects/go/src/local/duck/agent/socketiotransport.go:65 +0x44
local/duck/agent.(*CORSEnabler).ServeHTTP(0xc20803c040, 0x53ba60, 0xc2080532c0, 0xc2080291e0)
    /Users/mfreitas/Projects/go/src/local/duck/agent/cors.go:23 +0x10e
net/http.(*ServeMux).ServeHTTP(0xc208022c60, 0x53ba60, 0xc2080532c0, 0xc2080291e0)
    /usr/local/Cellar/go/1.3/libexec/src/pkg/net/http/server.go:1511 +0x1a3
net/http.serverHandler.ServeHTTP(0xc2080043c0, 0x53ba60, 0xc2080532c0, 0xc2080291e0)
    /usr/local/Cellar/go/1.3/libexec/src/pkg/net/http/server.go:1673 +0x19f
net/http.(*conn).serve(0xc208050700)
    /usr/local/Cellar/go/1.3/libexec/src/pkg/net/http/server.go:1174 +0xa7e
created by net/http.(*Server).Serve
    /usr/local/Cellar/go/1.3/libexec/src/pkg/net/http/server.go:1721 +0x313

It seems there is a race condition in the access to s.readerChan channel between conn.pingLoop and onPacket. From the code I read, it is my interpretation that pingLoop should either synchronise access to the closing of the socket. I think there may be race problems too when handling _CLOSE and in conn.NextReader too?

What would be the best way to fix this?

Anyway, I created a simple test case that exercises the panic above.
imkira@65e12bf
Let me know if it helps.

Cannot connect to the example server reliably

First of all, thanks for a great software!

I tried the example server in the (latest commit]( 91fdd50 ).
Most cases browsers can connect to the server successfully, but sometimes a browser prints (disconnected).
And when I open many browser tabs, the server crashed.

My test environment is:

  • OS X 10.8.5
  • Chrome 39.0.2171.71 (64-bit)
  • Firefox 34.0
  • Safari 6.2 (8537.85.10.17.1)

screencapture movie of running the example

Here is the backtrace:

panic: runtime error: send on closed channel

goroutine 171 [running]:
runtime.panic(0x2c9b60, 0x4bae3e)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/runtime/panic.c:279 +0xf5
github.com/googollee/go-engine%2eio.(*serverConn).OnPacket(0xc2080c6680, 0xc2080e9780)
    /Users/hnakamur/go/src/github.com/googollee/go-engine.io/server_conn.go:207 +0x5b7
github.com/googollee/go-engine.io/websocket.(*Server).serveHTTP(0xc208041ae0, 0x5a28f0, 0xc2080523c0, 0xc2080c7110)
    /Users/hnakamur/go/src/github.com/googollee/go-engine.io/websocket/server.go:76 +0x17d
created by github.com/googollee/go-engine.io/websocket.NewServer
    /Users/hnakamur/go/src/github.com/googollee/go-engine.io/websocket/server.go:29 +0x14e

goroutine 16 [IO wait]:
net.runtime_pollWait(0x5a26b0, 0x72, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/runtime/netpoll.goc:146 +0x66
net.(*pollDesc).Wait(0xc20802a1b0, 0x72, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/fd_poll_runtime.go:84 +0x46
net.(*pollDesc).WaitRead(0xc20802a1b0, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/fd_poll_runtime.go:89 +0x42
net.(*netFD).accept(0xc20802a150, 0x3a5358, 0x0, 0x5a13f0, 0x23)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/fd_unix.go:419 +0x343
net.(*TCPListener).AcceptTCP(0xc20803c028, 0x4b303, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/tcpsock_posix.go:234 +0x5d
net/http.tcpKeepAliveListener.Accept(0xc20803c028, 0x0, 0x0, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/http/server.go:1947 +0x4b
net/http.(*Server).Serve(0xc208004360, 0x5a2760, 0xc20803c028, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/http/server.go:1698 +0x91
net/http.(*Server).ListenAndServe(0xc208004360, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/http/server.go:1688 +0x14d
net/http.ListenAndServe(0x2fddb0, 0x5, 0x0, 0x0, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/http/server.go:1778 +0x79
main.main()
    /Users/hnakamur/go/src/github.com/googollee/go-engine.io/example/main.go:59 +0x38e

goroutine 19 [finalizer wait, 2 minutes]:
runtime.park(0x15280, 0x4c1d70, 0x4c0049)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/runtime/proc.c:1369 +0x89
runtime.parkunlock(0x4c1d70, 0x4c0049)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/runtime/proc.c:1385 +0x3b
runfinq()
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/runtime/mgc0.c:2644 +0xcf
runtime.goexit()
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/runtime/proc.c:1445

goroutine 20 [chan receive]:
main.func·003()
    /Users/hnakamur/go/src/github.com/googollee/go-engine.io/example/main.go:23 +0x97
created by main.main
    /Users/hnakamur/go/src/github.com/googollee/go-engine.io/example/main.go:54 +0x157

goroutine 21 [IO wait]:
net.runtime_pollWait(0x5a2600, 0x72, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/runtime/netpoll.goc:146 +0x66
net.(*pollDesc).Wait(0xc20802a220, 0x72, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/fd_poll_runtime.go:84 +0x46
net.(*pollDesc).WaitRead(0xc20802a220, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/fd_poll_runtime.go:89 +0x42
net.(*netFD).Read(0xc20802a1c0, 0xc208072000, 0x1000, 0x1000, 0x0, 0x5a13f0, 0x23)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/fd_unix.go:242 +0x34c
net.(*conn).Read(0xc20803c030, 0xc208072000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/net.go:122 +0xe7
net/http.(*liveSwitchReader).Read(0xc208050228, 0xc208072000, 0x1000, 0x1000, 0xfc0, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/http/server.go:206 +0xaf
io.(*LimitedReader).Read(0xc208040500, 0xc208072000, 0x1000, 0x1000, 0x1d, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/io/io.go:399 +0xd0
bufio.(*Reader).fill(0xc2080043c0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/bufio/bufio.go:97 +0x1b3
bufio.(*Reader).ReadSlice(0xc2080043c0, 0xa, 0x0, 0x0, 0x0, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/bufio/bufio.go:298 +0x22c
bufio.(*Reader).ReadLine(0xc2080043c0, 0x0, 0x0, 0x0, 0x22f00, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/bufio/bufio.go:326 +0x69
net/textproto.(*Reader).readLineSlice(0xc2080deb70, 0x0, 0x0, 0x0, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/textproto/reader.go:55 +0x9d
net/textproto.(*Reader).ReadLine(0xc2080deb70, 0x0, 0x0, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/textproto/reader.go:36 +0x4e
net/http.ReadRequest(0xc2080043c0, 0xc2080c7520, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/http/request.go:556 +0xc7
net/http.(*conn).readRequest(0xc208050200, 0x0, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/http/server.go:577 +0x276
net/http.(*conn).serve(0xc208050200)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/http/server.go:1132 +0x61e
created by net/http.(*Server).Serve
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/http/server.go:1721 +0x313

goroutine 22 [IO wait]:
net.runtime_pollWait(0x5a2550, 0x72, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/runtime/netpoll.goc:146 +0x66
net.(*pollDesc).Wait(0xc20802a290, 0x72, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/fd_poll_runtime.go:84 +0x46
net.(*pollDesc).WaitRead(0xc20802a290, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/fd_poll_runtime.go:89 +0x42
net.(*netFD).Read(0xc20802a230, 0xc208074000, 0x1000, 0x1000, 0x0, 0x5a13f0, 0x23)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/fd_unix.go:242 +0x34c
net.(*conn).Read(0xc20803c038, 0xc208074000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/net.go:122 +0xe7
net/http.(*liveSwitchReader).Read(0xc2080502a8, 0xc208074000, 0x1000, 0x1000, 0x1, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/http/server.go:206 +0xaf
io.(*LimitedReader).Read(0xc208040540, 0xc208074000, 0x1000, 0x1000, 0x300650, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/io/io.go:399 +0xd0
bufio.(*Reader).fill(0xc208004420)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/bufio/bufio.go:97 +0x1b3
bufio.(*Reader).ReadSlice(0xc208004420, 0xc2080aee0a, 0x0, 0x0, 0x0, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/bufio/bufio.go:298 +0x22c
bufio.(*Reader).ReadLine(0xc208004420, 0x0, 0x0, 0x0, 0x22f00, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/bufio/bufio.go:326 +0x69
net/textproto.(*Reader).readLineSlice(0xc2080df5f0, 0x0, 0x0, 0x0, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/textproto/reader.go:55 +0x9d
net/textproto.(*Reader).ReadLine(0xc2080df5f0, 0x0, 0x0, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/textproto/reader.go:36 +0x4e
net/http.ReadRequest(0xc208004420, 0xc2080c7450, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/http/request.go:556 +0xc7
net/http.(*conn).readRequest(0xc208050280, 0x0, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/http/server.go:577 +0x276
net/http.(*conn).serve(0xc208050280)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/http/server.go:1132 +0x61e
created by net/http.(*Server).Serve
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/http/server.go:1721 +0x313

goroutine 126 [select]:
github.com/googollee/go-engine%2eio.(*serverConn).pingLoop(0xc2080c64e0)
    /Users/hnakamur/go/src/github.com/googollee/go-engine.io/server_conn.go:339 +0x3ff
created by github.com/googollee/go-engine%2eio.newServerConn
    /Users/hnakamur/go/src/github.com/googollee/go-engine.io/server_conn.go:110 +0x472

goroutine 134 [select]:
github.com/googollee/go-engine%2eio.(*serverConn).pingLoop(0xc208028b60)
    /Users/hnakamur/go/src/github.com/googollee/go-engine.io/server_conn.go:339 +0x3ff
created by github.com/googollee/go-engine%2eio.newServerConn
    /Users/hnakamur/go/src/github.com/googollee/go-engine.io/server_conn.go:110 +0x472

goroutine 129 [IO wait]:
net.runtime_pollWait(0x5a24a0, 0x72, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/runtime/netpoll.goc:146 +0x66
net.(*pollDesc).Wait(0xc208129e90, 0x72, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/fd_poll_runtime.go:84 +0x46
net.(*pollDesc).WaitRead(0xc208129e90, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/fd_poll_runtime.go:89 +0x42
net.(*netFD).Read(0xc208129e30, 0xc208132000, 0x2800, 0x2800, 0x0, 0x5a13f0, 0x23)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/fd_unix.go:242 +0x34c
net.(*conn).Read(0xc20803c160, 0xc208132000, 0x2800, 0x2800, 0x0, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/net.go:122 +0xe7
bufio.(*Reader).fill(0xc208004d80)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/bufio/bufio.go:97 +0x1b3
bufio.(*Reader).Read(0xc208004d80, 0xc208164c10, 0x2, 0x8, 0x2, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/bufio/bufio.go:175 +0x230
github.com/gorilla/websocket.(*Conn).readFull(0xc2080c85a0, 0xc208164c10, 0x2, 0x8, 0x0, 0x0)
    /Users/hnakamur/go/src/github.com/gorilla/websocket/conn.go:542 +0xb0
github.com/gorilla/websocket.(*Conn).advanceFrame(0xc2080c85a0, 0x30f670, 0x0, 0x0)
    /Users/hnakamur/go/src/github.com/gorilla/websocket/conn.go:566 +0x162
github.com/gorilla/websocket.(*Conn).NextReader(0xc2080c85a0, 0x0, 0x0, 0x0, 0x0, 0x0)
    /Users/hnakamur/go/src/github.com/gorilla/websocket/conn.go:706 +0x77
github.com/googollee/go-engine.io/websocket.(*Server).serveHTTP(0xc2080ff960, 0x5a28f0, 0xc2080537c0, 0xc2080c6d00)
    /Users/hnakamur/go/src/github.com/googollee/go-engine.io/websocket/server.go:63 +0xbe
created by github.com/googollee/go-engine.io/websocket.NewServer
    /Users/hnakamur/go/src/github.com/googollee/go-engine.io/websocket/server.go:29 +0x14e

goroutine 127 [chan receive]:
github.com/googollee/go-engine%2eio.(*serverConn).NextReader(0xc2080c64e0, 0x0, 0x0, 0x0, 0x0, 0x0)
    /Users/hnakamur/go/src/github.com/googollee/go-engine.io/server_conn.go:127 +0xc1
main.func·002()
    /Users/hnakamur/go/src/github.com/googollee/go-engine.io/example/main.go:31 +0x1b8
created by main.func·003
    /Users/hnakamur/go/src/github.com/googollee/go-engine.io/example/main.go:52 +0xfe

goroutine 115 [IO wait]:
net.runtime_pollWait(0x5a2080, 0x72, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/runtime/netpoll.goc:146 +0x66
net.(*pollDesc).Wait(0xc208129720, 0x72, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/fd_poll_runtime.go:84 +0x46
net.(*pollDesc).WaitRead(0xc208129720, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/fd_poll_runtime.go:89 +0x42
net.(*netFD).Read(0xc2081296c0, 0xc20807a900, 0x2800, 0x2800, 0x0, 0x5a13f0, 0x23)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/fd_unix.go:242 +0x34c
net.(*conn).Read(0xc20803c170, 0xc20807a900, 0x2800, 0x2800, 0x0, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/net.go:122 +0xe7
bufio.(*Reader).fill(0xc2080e69c0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/bufio/bufio.go:97 +0x1b3
bufio.(*Reader).Read(0xc2080e69c0, 0xc208164b18, 0x2, 0x8, 0x2, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/bufio/bufio.go:175 +0x230
github.com/gorilla/websocket.(*Conn).readFull(0xc2080c82d0, 0xc208164b18, 0x2, 0x8, 0x0, 0x0)
    /Users/hnakamur/go/src/github.com/gorilla/websocket/conn.go:542 +0xb0
github.com/gorilla/websocket.(*Conn).advanceFrame(0xc2080c82d0, 0x30f670, 0x0, 0x0)
    /Users/hnakamur/go/src/github.com/gorilla/websocket/conn.go:566 +0x162
github.com/gorilla/websocket.(*Conn).NextReader(0xc2080c82d0, 0x0, 0x0, 0x0, 0x0, 0x0)
    /Users/hnakamur/go/src/github.com/gorilla/websocket/conn.go:706 +0x77
github.com/googollee/go-engine.io/websocket.(*Server).serveHTTP(0xc2080fe060, 0x5a28f0, 0xc208076320, 0xc2080c6820)
    /Users/hnakamur/go/src/github.com/googollee/go-engine.io/websocket/server.go:63 +0xbe
created by github.com/googollee/go-engine.io/websocket.NewServer
    /Users/hnakamur/go/src/github.com/googollee/go-engine.io/websocket/server.go:29 +0x14e

goroutine 53 [chan receive]:
github.com/googollee/go-engine%2eio.(*serverConn).NextReader(0xc2080296c0, 0x0, 0x0, 0x0, 0x0, 0x0)
    /Users/hnakamur/go/src/github.com/googollee/go-engine.io/server_conn.go:127 +0xc1
main.func·002()
    /Users/hnakamur/go/src/github.com/googollee/go-engine.io/example/main.go:31 +0x1b8
created by main.func·003
    /Users/hnakamur/go/src/github.com/googollee/go-engine.io/example/main.go:52 +0xfe

goroutine 159 [IO wait]:
net.runtime_pollWait(0x5a21e0, 0x72, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/runtime/netpoll.goc:146 +0x66
net.(*pollDesc).Wait(0xc20819dcd0, 0x72, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/fd_poll_runtime.go:84 +0x46
net.(*pollDesc).WaitRead(0xc20819dcd0, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/fd_poll_runtime.go:89 +0x42
net.(*netFD).Read(0xc20819dc70, 0xc2080d4000, 0x1000, 0x1000, 0x0, 0x5a13f0, 0x23)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/fd_unix.go:242 +0x34c
net.(*conn).Read(0xc20803c040, 0xc2080d4000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/net.go:122 +0xe7
net/http.(*liveSwitchReader).Read(0xc208050328, 0xc2080d4000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/http/server.go:206 +0xaf
io.(*LimitedReader).Read(0xc2080fe6c0, 0xc2080d4000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/io/io.go:399 +0xd0
bufio.(*Reader).fill(0xc2080e6d80)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/bufio/bufio.go:97 +0x1b3
bufio.(*Reader).ReadSlice(0xc2080e6d80, 0xc20802f90a, 0x0, 0x0, 0x0, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/bufio/bufio.go:298 +0x22c
bufio.(*Reader).ReadLine(0xc2080e6d80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/bufio/bufio.go:326 +0x69
net/textproto.(*Reader).readLineSlice(0xc2080de4b0, 0x0, 0x0, 0x0, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/textproto/reader.go:55 +0x9d
net/textproto.(*Reader).ReadLine(0xc2080de4b0, 0x0, 0x0, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/textproto/reader.go:36 +0x4e
net/http.ReadRequest(0xc2080e6d80, 0xc208028c30, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/http/request.go:556 +0xc7
net/http.(*conn).readRequest(0xc208050300, 0x0, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/http/server.go:577 +0x276
net/http.(*conn).serve(0xc208050300)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/http/server.go:1132 +0x61e
created by net/http.(*Server).Serve
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/http/server.go:1721 +0x313

goroutine 112 [select]:
github.com/googollee/go-engine%2eio.(*serverConn).pingLoop(0xc2080c6a90)
    /Users/hnakamur/go/src/github.com/googollee/go-engine.io/server_conn.go:339 +0x3ff
created by github.com/googollee/go-engine%2eio.newServerConn
    /Users/hnakamur/go/src/github.com/googollee/go-engine.io/server_conn.go:110 +0x472

goroutine 162 [select]:
github.com/googollee/go-engine%2eio.(*serverConn).pingLoop(0xc2080c65b0)
    /Users/hnakamur/go/src/github.com/googollee/go-engine.io/server_conn.go:339 +0x3ff
created by github.com/googollee/go-engine%2eio.newServerConn
    /Users/hnakamur/go/src/github.com/googollee/go-engine.io/server_conn.go:110 +0x472

goroutine 55 [chan send]:
github.com/googollee/go-engine%2eio.(*serverConn).OnPacket(0xc2080296c0, 0xc208185100)
    /Users/hnakamur/go/src/github.com/googollee/go-engine.io/server_conn.go:207 +0x5b7
github.com/googollee/go-engine.io/websocket.(*Server).serveHTTP(0xc2080ff3a0, 0x5a28f0, 0xc208053ea0, 0xc208029a00)
    /Users/hnakamur/go/src/github.com/googollee/go-engine.io/websocket/server.go:76 +0x17d
created by github.com/googollee/go-engine.io/websocket.NewServer
    /Users/hnakamur/go/src/github.com/googollee/go-engine.io/websocket/server.go:29 +0x14e

goroutine 160 [IO wait]:
net.runtime_pollWait(0x5a2130, 0x72, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/runtime/netpoll.goc:146 +0x66
net.(*pollDesc).Wait(0xc20819dd40, 0x72, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/fd_poll_runtime.go:84 +0x46
net.(*pollDesc).WaitRead(0xc20819dd40, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/fd_poll_runtime.go:89 +0x42
net.(*netFD).Read(0xc20819dce0, 0xc2080ca000, 0x1000, 0x1000, 0x0, 0x5a13f0, 0x23)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/fd_unix.go:242 +0x34c
net.(*conn).Read(0xc20803c048, 0xc2080ca000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/net.go:122 +0xe7
net/http.(*liveSwitchReader).Read(0xc208050428, 0xc2080ca000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/http/server.go:206 +0xaf
io.(*LimitedReader).Read(0xc2080fe6e0, 0xc2080ca000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/io/io.go:399 +0xd0
bufio.(*Reader).fill(0xc2080e6de0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/bufio/bufio.go:97 +0x1b3
bufio.(*Reader).ReadSlice(0xc2080e6de0, 0xc20802f90a, 0x0, 0x0, 0x0, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/bufio/bufio.go:298 +0x22c
bufio.(*Reader).ReadLine(0xc2080e6de0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/bufio/bufio.go:326 +0x69
net/textproto.(*Reader).readLineSlice(0xc2080de570, 0x0, 0x0, 0x0, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/textproto/reader.go:55 +0x9d
net/textproto.(*Reader).ReadLine(0xc2080de570, 0x0, 0x0, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/textproto/reader.go:36 +0x4e
net/http.ReadRequest(0xc2080e6de0, 0xc208028f70, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/http/request.go:556 +0xc7
net/http.(*conn).readRequest(0xc208050400, 0x0, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/http/server.go:577 +0x276
net/http.(*conn).serve(0xc208050400)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/http/server.go:1132 +0x61e
created by net/http.(*Server).Serve
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/http/server.go:1721 +0x313

goroutine 116 [IO wait]:
net.runtime_pollWait(0x5a1f20, 0x72, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/runtime/netpoll.goc:146 +0x66
net.(*pollDesc).Wait(0xc208129870, 0x72, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/fd_poll_runtime.go:84 +0x46
net.(*pollDesc).WaitRead(0xc208129870, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/fd_poll_runtime.go:89 +0x42
net.(*netFD).Read(0xc208129810, 0xc2080fb000, 0x1000, 0x1000, 0x0, 0x5a13f0, 0x23)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/fd_unix.go:242 +0x34c
net.(*conn).Read(0xc20803c050, 0xc2080fb000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/net.go:122 +0xe7
net/http.(*liveSwitchReader).Read(0xc2080503a8, 0xc2080fb000, 0x1000, 0x1000, 0x1, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/http/server.go:206 +0xaf
io.(*LimitedReader).Read(0xc2080feae0, 0xc2080fb000, 0x1000, 0x1000, 0x300650, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/io/io.go:399 +0xd0
bufio.(*Reader).fill(0xc2080e7bc0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/bufio/bufio.go:97 +0x1b3
bufio.(*Reader).ReadSlice(0xc2080e7bc0, 0xc2080af50a, 0x0, 0x0, 0x0, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/bufio/bufio.go:298 +0x22c
bufio.(*Reader).ReadLine(0xc2080e7bc0, 0x0, 0x0, 0x0, 0x22f00, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/bufio/bufio.go:326 +0x69
net/textproto.(*Reader).readLineSlice(0xc2080259b0, 0x0, 0x0, 0x0, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/textproto/reader.go:55 +0x9d
net/textproto.(*Reader).ReadLine(0xc2080259b0, 0x0, 0x0, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/textproto/reader.go:36 +0x4e
net/http.ReadRequest(0xc2080e7bc0, 0xc2080c61a0, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/http/request.go:556 +0xc7
net/http.(*conn).readRequest(0xc208050380, 0x0, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/http/server.go:577 +0x276
net/http.(*conn).serve(0xc208050380)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/http/server.go:1132 +0x61e
created by net/http.(*Server).Serve
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/http/server.go:1721 +0x313

goroutine 161 [IO wait]:
net.runtime_pollWait(0x5a1fd0, 0x72, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/runtime/netpoll.goc:146 +0x66
net.(*pollDesc).Wait(0xc20819ddb0, 0x72, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/fd_poll_runtime.go:84 +0x46
net.(*pollDesc).WaitRead(0xc20819ddb0, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/fd_poll_runtime.go:89 +0x42
net.(*netFD).Read(0xc20819dd50, 0xc2080c4000, 0x1000, 0x1000, 0x0, 0x5a13f0, 0x23)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/fd_unix.go:242 +0x34c
net.(*conn).Read(0xc20803c058, 0xc2080c4000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/net.go:122 +0xe7
net/http.(*liveSwitchReader).Read(0xc2080504a8, 0xc2080c4000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/http/server.go:206 +0xaf
io.(*LimitedReader).Read(0xc2080fe700, 0xc2080c4000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/io/io.go:399 +0xd0
bufio.(*Reader).fill(0xc2080e6e40)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/bufio/bufio.go:97 +0x1b3
bufio.(*Reader).ReadSlice(0xc2080e6e40, 0xc20802f90a, 0x0, 0x0, 0x0, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/bufio/bufio.go:298 +0x22c
bufio.(*Reader).ReadLine(0xc2080e6e40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/bufio/bufio.go:326 +0x69
net/textproto.(*Reader).readLineSlice(0xc2080de660, 0x0, 0x0, 0x0, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/textproto/reader.go:55 +0x9d
net/textproto.(*Reader).ReadLine(0xc2080de660, 0x0, 0x0, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/textproto/reader.go:36 +0x4e
net/http.ReadRequest(0xc2080e6e40, 0xc208029040, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/http/request.go:556 +0xc7
net/http.(*conn).readRequest(0xc208050480, 0x0, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/http/server.go:577 +0x276
net/http.(*conn).serve(0xc208050480)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/http/server.go:1132 +0x61e
created by net/http.(*Server).Serve
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/http/server.go:1721 +0x313

goroutine 158 [IO wait]:
net.runtime_pollWait(0x5a1d10, 0x72, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/runtime/netpoll.goc:146 +0x66
net.(*pollDesc).Wait(0xc20819dc60, 0x72, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/fd_poll_runtime.go:84 +0x46
net.(*pollDesc).WaitRead(0xc20819dc60, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/fd_poll_runtime.go:89 +0x42
net.(*netFD).Read(0xc20819dc00, 0xc2080ac000, 0x1000, 0x1000, 0x0, 0x5a13f0, 0x23)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/fd_unix.go:242 +0x34c
net.(*conn).Read(0xc20803c020, 0xc2080ac000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/net.go:122 +0xe7
net/http.(*liveSwitchReader).Read(0xc208050028, 0xc2080ac000, 0x1000, 0x1000, 0xa01da, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/http/server.go:206 +0xaf
io.(*LimitedReader).Read(0xc2080fe6a0, 0xc2080ac000, 0x1000, 0x1000, 0x109c4, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/io/io.go:399 +0xd0
bufio.(*Reader).fill(0xc2080e6ea0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/bufio/bufio.go:97 +0x1b3
bufio.(*Reader).ReadSlice(0xc2080e6ea0, 0xd090a, 0x0, 0x0, 0x0, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/bufio/bufio.go:298 +0x22c
bufio.(*Reader).ReadLine(0xc2080e6ea0, 0x0, 0x0, 0x0, 0x4dd200, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/bufio/bufio.go:326 +0x69
net/textproto.(*Reader).readLineSlice(0xc208025d40, 0x0, 0x0, 0x0, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/textproto/reader.go:55 +0x9d
net/textproto.(*Reader).ReadLine(0xc208025d40, 0x0, 0x0, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/textproto/reader.go:36 +0x4e
net/http.ReadRequest(0xc2080e6ea0, 0xc208028820, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/http/request.go:556 +0xc7
net/http.(*conn).readRequest(0xc208050000, 0x0, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/http/server.go:577 +0x276
net/http.(*conn).serve(0xc208050000)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/http/server.go:1132 +0x61e
created by net/http.(*Server).Serve
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/http/server.go:1721 +0x313

goroutine 157 [IO wait]:
net.runtime_pollWait(0x5a2290, 0x72, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/runtime/netpoll.goc:146 +0x66
net.(*pollDesc).Wait(0xc20819c060, 0x72, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/fd_poll_runtime.go:84 +0x46
net.(*pollDesc).WaitRead(0xc20819c060, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/fd_poll_runtime.go:89 +0x42
net.(*netFD).Read(0xc20819c000, 0xc208137200, 0x2800, 0x2800, 0x0, 0x5a13f0, 0x23)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/fd_unix.go:242 +0x34c
net.(*conn).Read(0xc20803c060, 0xc208137200, 0x2800, 0x2800, 0x0, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/net.go:122 +0xe7
bufio.(*Reader).fill(0xc2080e6840)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/bufio/bufio.go:97 +0x1b3
bufio.(*Reader).Read(0xc2080e6840, 0xc208164ba0, 0x2, 0x8, 0x2, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/bufio/bufio.go:175 +0x230
github.com/gorilla/websocket.(*Conn).readFull(0xc2080c8690, 0xc208164ba0, 0x2, 0x8, 0x0, 0x0)
    /Users/hnakamur/go/src/github.com/gorilla/websocket/conn.go:542 +0xb0
github.com/gorilla/websocket.(*Conn).advanceFrame(0xc2080c8690, 0x30f670, 0x0, 0x0)
    /Users/hnakamur/go/src/github.com/gorilla/websocket/conn.go:566 +0x162
github.com/gorilla/websocket.(*Conn).NextReader(0xc2080c8690, 0x0, 0x0, 0x0, 0x0, 0x0)
    /Users/hnakamur/go/src/github.com/gorilla/websocket/conn.go:706 +0x77
github.com/googollee/go-engine.io/websocket.(*Server).serveHTTP(0xc2080408e0, 0x5a28f0, 0xc208052b40, 0xc208029110)
    /Users/hnakamur/go/src/github.com/googollee/go-engine.io/websocket/server.go:63 +0xbe
created by github.com/googollee/go-engine.io/websocket.NewServer
    /Users/hnakamur/go/src/github.com/googollee/go-engine.io/websocket/server.go:29 +0x14e

goroutine 113 [chan receive]:
github.com/googollee/go-engine%2eio.(*serverConn).NextReader(0xc2080c6a90, 0x0, 0x0, 0x0, 0x0, 0x0)
    /Users/hnakamur/go/src/github.com/googollee/go-engine.io/server_conn.go:127 +0xc1
main.func·002()
    /Users/hnakamur/go/src/github.com/googollee/go-engine.io/example/main.go:31 +0x1b8
created by main.func·003
    /Users/hnakamur/go/src/github.com/googollee/go-engine.io/example/main.go:52 +0xfe

goroutine 143 [chan receive]:
github.com/googollee/go-engine%2eio.(*serverConn).NextReader(0xc208029930, 0x0, 0x0, 0x0, 0x0, 0x0)
    /Users/hnakamur/go/src/github.com/googollee/go-engine.io/server_conn.go:127 +0xc1
main.func·002()
    /Users/hnakamur/go/src/github.com/googollee/go-engine.io/example/main.go:31 +0x1b8
created by main.func·003
    /Users/hnakamur/go/src/github.com/googollee/go-engine.io/example/main.go:52 +0xfe

goroutine 117 [select]:
github.com/googollee/go-engine%2eio.(*serverConn).pingLoop(0xc2080281a0)
    /Users/hnakamur/go/src/github.com/googollee/go-engine.io/server_conn.go:339 +0x3ff
created by github.com/googollee/go-engine%2eio.newServerConn
    /Users/hnakamur/go/src/github.com/googollee/go-engine.io/server_conn.go:110 +0x472

goroutine 118 [chan receive]:
github.com/googollee/go-engine%2eio.(*serverConn).NextReader(0xc2080281a0, 0x0, 0x0, 0x0, 0x0, 0x0)
    /Users/hnakamur/go/src/github.com/googollee/go-engine.io/server_conn.go:127 +0xc1
main.func·002()
    /Users/hnakamur/go/src/github.com/googollee/go-engine.io/example/main.go:31 +0x1b8
created by main.func·003
    /Users/hnakamur/go/src/github.com/googollee/go-engine.io/example/main.go:52 +0xfe

goroutine 119 [IO wait]:
net.runtime_pollWait(0x5a1e70, 0x72, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/runtime/netpoll.goc:146 +0x66
net.(*pollDesc).Wait(0xc2080e23e0, 0x72, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/fd_poll_runtime.go:84 +0x46
net.(*pollDesc).WaitRead(0xc2080e23e0, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/fd_poll_runtime.go:89 +0x42
net.(*netFD).Read(0xc2080e2380, 0xc208142000, 0x1000, 0x1000, 0x0, 0x5a13f0, 0x23)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/fd_unix.go:242 +0x34c
net.(*conn).Read(0xc20803c0c8, 0xc208142000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/net.go:122 +0xe7
net/http.(*liveSwitchReader).Read(0xc208050528, 0xc208142000, 0x1000, 0x1000, 0xfc0, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/http/server.go:206 +0xaf
io.(*LimitedReader).Read(0xc2080fee00, 0xc208142000, 0x1000, 0x1000, 0x1d, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/io/io.go:399 +0xd0
bufio.(*Reader).fill(0xc2080048a0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/bufio/bufio.go:97 +0x1b3
bufio.(*Reader).ReadSlice(0xc2080048a0, 0xa, 0x0, 0x0, 0x0, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/bufio/bufio.go:298 +0x22c
bufio.(*Reader).ReadLine(0xc2080048a0, 0x0, 0x0, 0x0, 0x22f00, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/bufio/bufio.go:326 +0x69
net/textproto.(*Reader).readLineSlice(0xc2080de810, 0x0, 0x0, 0x0, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/textproto/reader.go:55 +0x9d
net/textproto.(*Reader).ReadLine(0xc2080de810, 0x0, 0x0, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/textproto/reader.go:36 +0x4e
net/http.ReadRequest(0xc2080048a0, 0xc208028a90, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/http/request.go:556 +0xc7
net/http.(*conn).readRequest(0xc208050500, 0x0, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/http/server.go:577 +0x276
net/http.(*conn).serve(0xc208050500)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/http/server.go:1132 +0x61e
created by net/http.(*Server).Serve
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/http/server.go:1721 +0x313

goroutine 145 [chan send]:
github.com/googollee/go-engine%2eio.(*serverConn).OnPacket(0xc208029930, 0xc208184840)
    /Users/hnakamur/go/src/github.com/googollee/go-engine.io/server_conn.go:207 +0x5b7
github.com/googollee/go-engine.io/websocket.(*Server).serveHTTP(0xc2080ff1c0, 0x5a28f0, 0xc208053040, 0xc208029ee0)
    /Users/hnakamur/go/src/github.com/googollee/go-engine.io/websocket/server.go:76 +0x17d
created by github.com/googollee/go-engine.io/websocket.NewServer
    /Users/hnakamur/go/src/github.com/googollee/go-engine.io/websocket/server.go:29 +0x14e

goroutine 121 [runnable]:
net.runtime_pollWait(0x5a1dc0, 0x72, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/runtime/netpoll.goc:146 +0x66
net.(*pollDesc).Wait(0xc2080e2610, 0x72, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/fd_poll_runtime.go:84 +0x46
net.(*pollDesc).WaitRead(0xc2080e2610, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/fd_poll_runtime.go:89 +0x42
net.(*netFD).Read(0xc2080e25b0, 0xc208146000, 0x2800, 0x2800, 0x0, 0x5a13f0, 0x23)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/fd_unix.go:242 +0x34c
net.(*conn).Read(0xc20803c0e0, 0xc208146000, 0x2800, 0x2800, 0x0, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/net.go:122 +0xe7
bufio.(*Reader).fill(0xc208004c00)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/bufio/bufio.go:97 +0x1b3
bufio.(*Reader).Read(0xc208004c00, 0xc208164c70, 0x2, 0x8, 0x2, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/bufio/bufio.go:175 +0x230
github.com/gorilla/websocket.(*Conn).readFull(0xc2080c81e0, 0xc208164c70, 0x2, 0x8, 0x0, 0x0)
    /Users/hnakamur/go/src/github.com/gorilla/websocket/conn.go:542 +0xb0
github.com/gorilla/websocket.(*Conn).advanceFrame(0xc2080c81e0, 0x30f670, 0x0, 0x0)
    /Users/hnakamur/go/src/github.com/gorilla/websocket/conn.go:566 +0x162
github.com/gorilla/websocket.(*Conn).NextReader(0xc2080c81e0, 0x0, 0x0, 0x0, 0x0, 0x0)
    /Users/hnakamur/go/src/github.com/gorilla/websocket/conn.go:706 +0x77
github.com/googollee/go-engine.io/websocket.(*Server).serveHTTP(0xc2080ff1a0, 0x5a28f0, 0xc208052be0, 0xc208029860)
    /Users/hnakamur/go/src/github.com/googollee/go-engine.io/websocket/server.go:63 +0xbe
created by github.com/googollee/go-engine.io/websocket.NewServer
    /Users/hnakamur/go/src/github.com/googollee/go-engine.io/websocket/server.go:29 +0x14e

goroutine 137 [runnable]:
net.runtime_pollWait(0x5a23f0, 0x72, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/runtime/netpoll.goc:146 +0x66
net.(*pollDesc).Wait(0xc2081287d0, 0x72, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/fd_poll_runtime.go:84 +0x46
net.(*pollDesc).WaitRead(0xc2081287d0, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/fd_poll_runtime.go:89 +0x42
net.(*netFD).Read(0xc208128770, 0xc20815a900, 0x2800, 0x2800, 0x0, 0x5a13f0, 0x23)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/fd_unix.go:242 +0x34c
net.(*conn).Read(0xc20803c0b8, 0xc20815a900, 0x2800, 0x2800, 0x0, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/net.go:122 +0xe7
bufio.(*Reader).fill(0xc2080e7da0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/bufio/bufio.go:97 +0x1b3
bufio.(*Reader).Read(0xc2080e7da0, 0xc208164f10, 0x2, 0x8, 0x2, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/bufio/bufio.go:175 +0x230
github.com/gorilla/websocket.(*Conn).readFull(0xc2080c80f0, 0xc208164f10, 0x2, 0x8, 0x0, 0x0)
    /Users/hnakamur/go/src/github.com/gorilla/websocket/conn.go:542 +0xb0
github.com/gorilla/websocket.(*Conn).advanceFrame(0xc2080c80f0, 0x30f670, 0x0, 0x0)
    /Users/hnakamur/go/src/github.com/gorilla/websocket/conn.go:566 +0x162
github.com/gorilla/websocket.(*Conn).NextReader(0xc2080c80f0, 0x0, 0x0, 0x0, 0x0, 0x0)
    /Users/hnakamur/go/src/github.com/gorilla/websocket/conn.go:706 +0x77
github.com/googollee/go-engine.io/websocket.(*Server).serveHTTP(0xc2080fee80, 0x5a28f0, 0xc208052fa0, 0xc208029e10)
    /Users/hnakamur/go/src/github.com/googollee/go-engine.io/websocket/server.go:63 +0xbe
created by github.com/googollee/go-engine.io/websocket.NewServer
    /Users/hnakamur/go/src/github.com/googollee/go-engine.io/websocket/server.go:29 +0x14e

goroutine 135 [chan receive]:
github.com/googollee/go-engine%2eio.(*serverConn).NextReader(0xc208028b60, 0x0, 0x0, 0x0, 0x0, 0x0)
    /Users/hnakamur/go/src/github.com/googollee/go-engine.io/server_conn.go:127 +0xc1
main.func·002()
    /Users/hnakamur/go/src/github.com/googollee/go-engine.io/example/main.go:31 +0x1b8
created by main.func·003
    /Users/hnakamur/go/src/github.com/googollee/go-engine.io/example/main.go:52 +0xfe

goroutine 147 [chan receive]:
github.com/googollee/go-engine%2eio.(*serverConn).NextReader(0xc208029d40, 0x0, 0x0, 0x0, 0x0, 0x0)
    /Users/hnakamur/go/src/github.com/googollee/go-engine.io/server_conn.go:127 +0xc1
main.func·002()
    /Users/hnakamur/go/src/github.com/googollee/go-engine.io/example/main.go:31 +0x1b8
created by main.func·003
    /Users/hnakamur/go/src/github.com/googollee/go-engine.io/example/main.go:52 +0xfe

goroutine 154 [select]:
github.com/googollee/go-engine%2eio.(*serverConn).pingLoop(0xc2080c7380)
    /Users/hnakamur/go/src/github.com/googollee/go-engine.io/server_conn.go:339 +0x3ff
created by github.com/googollee/go-engine%2eio.newServerConn
    /Users/hnakamur/go/src/github.com/googollee/go-engine.io/server_conn.go:110 +0x472

goroutine 149 [chan send]:
github.com/googollee/go-engine%2eio.(*serverConn).OnPacket(0xc208029d40, 0xc2080e9140)
    /Users/hnakamur/go/src/github.com/googollee/go-engine.io/server_conn.go:207 +0x5b7
github.com/googollee/go-engine.io/websocket.(*Server).serveHTTP(0xc2080ffa20, 0x5a28f0, 0xc208053400, 0xc2080c7e10)
    /Users/hnakamur/go/src/github.com/googollee/go-engine.io/websocket/server.go:76 +0x17d
created by github.com/googollee/go-engine.io/websocket.NewServer
    /Users/hnakamur/go/src/github.com/googollee/go-engine.io/websocket/server.go:29 +0x14e

goroutine 163 [chan receive]:
github.com/googollee/go-engine%2eio.(*serverConn).NextReader(0xc2080c65b0, 0x0, 0x0, 0x0, 0x0, 0x0)
    /Users/hnakamur/go/src/github.com/googollee/go-engine.io/server_conn.go:127 +0xc1
main.func·002()
    /Users/hnakamur/go/src/github.com/googollee/go-engine.io/example/main.go:31 +0x1b8
created by main.func·003
    /Users/hnakamur/go/src/github.com/googollee/go-engine.io/example/main.go:52 +0xfe

goroutine 155 [chan receive]:
github.com/googollee/go-engine%2eio.(*serverConn).NextReader(0xc2080c7380, 0x0, 0x0, 0x0, 0x0, 0x0)
    /Users/hnakamur/go/src/github.com/googollee/go-engine.io/server_conn.go:127 +0xc1
main.func·002()
    /Users/hnakamur/go/src/github.com/googollee/go-engine.io/example/main.go:31 +0x1b8
created by main.func·003
    /Users/hnakamur/go/src/github.com/googollee/go-engine.io/example/main.go:52 +0xfe

goroutine 166 [IO wait]:
net.runtime_pollWait(0x5a1c60, 0x72, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/runtime/netpoll.goc:146 +0x66
net.(*pollDesc).Wait(0xc2080e2c30, 0x72, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/fd_poll_runtime.go:84 +0x46
net.(*pollDesc).WaitRead(0xc2080e2c30, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/fd_poll_runtime.go:89 +0x42
net.(*netFD).Read(0xc2080e2bd0, 0xc208100000, 0x1000, 0x1000, 0x0, 0x5a13f0, 0x23)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/fd_unix.go:242 +0x34c
net.(*conn).Read(0xc20803c068, 0xc208100000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/net.go:122 +0xe7
net/http.(*liveSwitchReader).Read(0xc208050728, 0xc208100000, 0x1000, 0x1000, 0x745888, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/http/server.go:206 +0xaf
io.(*LimitedReader).Read(0xc208041600, 0xc208100000, 0x1000, 0x1000, 0x7458d0, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/io/io.go:399 +0xd0
bufio.(*Reader).fill(0xc2080059e0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/bufio/bufio.go:97 +0x1b3
bufio.(*Reader).ReadSlice(0xc2080059e0, 0xa, 0x0, 0x0, 0x0, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/bufio/bufio.go:298 +0x22c
bufio.(*Reader).ReadLine(0xc2080059e0, 0x0, 0x0, 0x0, 0x22f00, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/bufio/bufio.go:326 +0x69
net/textproto.(*Reader).readLineSlice(0xc2080df830, 0x0, 0x0, 0x0, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/textproto/reader.go:55 +0x9d
net/textproto.(*Reader).ReadLine(0xc2080df830, 0x0, 0x0, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/textproto/reader.go:36 +0x4e
net/http.ReadRequest(0xc2080059e0, 0xc2080c7ee0, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/http/request.go:556 +0xc7
net/http.(*conn).readRequest(0xc208050700, 0x0, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/http/server.go:577 +0x276
net/http.(*conn).serve(0xc208050700)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/http/server.go:1132 +0x61e
created by net/http.(*Server).Serve
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/http/server.go:1721 +0x313

goroutine 165 [runnable]:
net.runtime_pollWait(0x5a2340, 0x72, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/runtime/netpoll.goc:146 +0x66
net.(*pollDesc).Wait(0xc208128c30, 0x72, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/fd_poll_runtime.go:84 +0x46
net.(*pollDesc).WaitRead(0xc208128c30, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/fd_poll_runtime.go:89 +0x42
net.(*netFD).Read(0xc208128bd0, 0xc2080bc900, 0x2800, 0x2800, 0x0, 0x5a13f0, 0x23)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/fd_unix.go:242 +0x34c
net.(*conn).Read(0xc20803c0d8, 0xc2080bc900, 0x2800, 0x2800, 0x0, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/net.go:122 +0xe7
bufio.(*Reader).fill(0xc208004de0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/bufio/bufio.go:97 +0x1b3
bufio.(*Reader).Read(0xc208004de0, 0xc2081651c0, 0x2, 0x8, 0x2, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/bufio/bufio.go:175 +0x230
github.com/gorilla/websocket.(*Conn).readFull(0xc2080c8780, 0xc2081651c0, 0x2, 0x8, 0x0, 0x0)
    /Users/hnakamur/go/src/github.com/gorilla/websocket/conn.go:542 +0xb0
github.com/gorilla/websocket.(*Conn).advanceFrame(0xc2080c8780, 0x30f670, 0x0, 0x0)
    /Users/hnakamur/go/src/github.com/gorilla/websocket/conn.go:566 +0x162
github.com/gorilla/websocket.(*Conn).NextReader(0xc2080c8780, 0x0, 0x0, 0x0, 0x0, 0x0)
    /Users/hnakamur/go/src/github.com/gorilla/websocket/conn.go:706 +0x77
github.com/googollee/go-engine.io/websocket.(*Server).serveHTTP(0xc2080ff940, 0x5a28f0, 0xc208053220, 0xc2080c6f70)
    /Users/hnakamur/go/src/github.com/googollee/go-engine.io/websocket/server.go:63 +0xbe
created by github.com/googollee/go-engine.io/websocket.NewServer
    /Users/hnakamur/go/src/github.com/googollee/go-engine.io/websocket/server.go:29 +0x14e

goroutine 167 [IO wait]:
net.runtime_pollWait(0x5a1bb0, 0x72, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/runtime/netpoll.goc:146 +0x66
net.(*pollDesc).Wait(0xc2080e2ca0, 0x72, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/fd_poll_runtime.go:84 +0x46
net.(*pollDesc).WaitRead(0xc2080e2ca0, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/fd_poll_runtime.go:89 +0x42
net.(*netFD).Read(0xc2080e2c40, 0xc208102000, 0x1000, 0x1000, 0x0, 0x5a13f0, 0x23)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/fd_unix.go:242 +0x34c
net.(*conn).Read(0xc20803c070, 0xc208102000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/net.go:122 +0xe7
net/http.(*liveSwitchReader).Read(0xc2080508a8, 0xc208102000, 0x1000, 0x1000, 0x1, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/http/server.go:206 +0xaf
io.(*LimitedReader).Read(0xc208041620, 0xc208102000, 0x1000, 0x1000, 0x300650, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/io/io.go:399 +0xd0
bufio.(*Reader).fill(0xc208005a40)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/bufio/bufio.go:97 +0x1b3
bufio.(*Reader).ReadSlice(0xc208005a40, 0xc2080ae40a, 0x0, 0x0, 0x0, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/bufio/bufio.go:298 +0x22c
bufio.(*Reader).ReadLine(0xc208005a40, 0x0, 0x0, 0x0, 0x22f00, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/bufio/bufio.go:326 +0x69
net/textproto.(*Reader).readLineSlice(0xc2080de930, 0x0, 0x0, 0x0, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/textproto/reader.go:55 +0x9d
net/textproto.(*Reader).ReadLine(0xc2080de930, 0x0, 0x0, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/textproto/reader.go:36 +0x4e
net/http.ReadRequest(0xc208005a40, 0xc2080c75f0, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/http/request.go:556 +0xc7
net/http.(*conn).readRequest(0xc208050880, 0x0, 0x0, 0x0)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/http/server.go:577 +0x276
net/http.(*conn).serve(0xc208050880)
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/http/server.go:1132 +0x61e
created by net/http.(*Server).Serve
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/http/server.go:1721 +0x313

Goroutine leak

After running the server for close to a month, i noticed that the server memory consumption was increasing. Did a quick go pprof and found that some connections might not have been closed properly and the goroutine hangs trying to send on the unbuffered channel.

server_conn.go:231: c.readerChan <- newConnReader(r, closeChan)

6462 @ 0x438e6a 0x438f5e 0x40fc78 0x40fa3d 0x7df980 0x87cd48 0x469d21
#	0x7df97f	github.com/googollee/go-engine%2eio.(*serverConn).OnPacket+0x5ff	/home/navneet/repo/_vendor/src/github.com/googollee/go-engine.io/server_conn.go:231
#	0x87cd47	github.com/googollee/go-engine.io/websocket.(*Server).serveHTTP+0xd7	/home/navneet/repo/_vendor/src/github.com/googollee/go-engine.io/websocket/server.go:77
5854 @ 0x438e6a 0x438f5e 0x40fc78 0x40fa3d 0x7df980 0x87b059 0x87a37c 0x7df307 0x7dd8ae 0x67facd 0x53b56b 0x4c2fef 0x4c39fd 0x4c0487 0x469d21
#	0x7df97f	github.com/googollee/go-engine%2eio.(*serverConn).OnPacket+0x5ff	/home/navneet/repo/_vendor/src/github.com/googollee/go-engine.io/server_conn.go:231
#	0x87b058	github.com/googollee/go-engine.io/polling.(*Polling).post+0x2a8		/home/navneet/repo/_vendor/src/github.com/googollee/go-engine.io/polling/server.go:181
#	0x87a37b	github.com/googollee/go-engine.io/polling.(*Polling).ServeHTTP+0xab	/home/navneet/repo/_vendor/src/github.com/googollee/go-engine.io/polling/server.go:55
#	0x7df306	github.com/googollee/go-engine%2eio.(*serverConn).ServeHTTP+0x3e6	/home/navneet/repo/_vendor/src/github.com/googollee/go-engine.io/server_conn.go:198
#	0x7dd8ad	github.com/googollee/go-engine%2eio.(*Server).ServeHTTP+0x1ad		/home/navneet/repo/_vendor/src/github.com/googollee/go-engine.io/server.go:159
#	0x67facc	github.com/googollee/go-socket%2eio.(*Server).ServeHTTP+0x4c		/home/navneet/repo/_vendor/src/github.com/googollee/go-socket.io/server.go:87
#	0x53b56a	hub.webSocketServer.ServeHTTP+0x16a					/home/navneet/repo/src/hub/websocketserver.go:286
#	0x4c2fee	net/http.(*ServeMux).ServeHTTP+0x7e					/home/navneet/go/go.1.7.1/src/net/http/server.go:2022
#	0x4c39fc	net/http.serverHandler.ServeHTTP+0x7c					/home/navneet/go/go.1.7.1/src/net/http/server.go:2202
#	0x4c0486	net/http.(*conn).serve+0x4b6						/home/navneet/go/go.1.7.1/src/net/http/server.go:1579

After the server was running for close to a month we see that 6462 and 5854 are stuck waiting to write to the channel. It happens for both polling and websocket connections.

goroutine 8788296 [chan send, 30612 minutes]:
github.com/googollee/go-engine%2eio.(*serverConn).OnPacket(0xc42feb3040, 0xc42fa5f280)	/home/navneet/repo/_vendor/src/github.com/googollee/go-engine.io/server_conn.go:231 +0x600
github.com/googollee/go-engine.io/polling.(*Polling).post(0xc43065a300, 0x11912a0, 0xc42fa208f0, 0xc432097860)	/home/navneet/repo/_vendor/src/github.com/googollee/go-engine.io/polling/server.go:181 +0x2a9
github.com/googollee/go-engine.io/polling.(*Polling).ServeHTTP(0xc43065a300, 0x11912a0, 0xc42fa208f0, 0xc432097860) /home/navneet/repo/_vendor/src/github.com/googollee/go-engine.io/polling/server.go:55 +0xac
github.com/googollee/go-engine%2eio.(*serverConn).ServeHTTP(0xc42feb3040, 0x11912a0, 0xc42fa208f0, 0xc432097860)	/home/navneet/repo/_vendor/src/github.com/googollee/go-engine.io/server_conn.go:198 +0x3e7
github.com/googollee/go-engine%2eio.(*Server).ServeHTTP(0xc42004eb60, 0x11912a0, 0xc42fa208f0, 0xc432097860)	/home/navneet/repo/_vendor/src/github.com/googollee/go-engine.io/server.go:159 +0x1ae
github.com/googollee/go-socket%2eio.(*Server).ServeHTTP(0xc4200b9a60, 0x11912a0, 0xc42fa208f0, 0xc432097860)	/home/navneet/repo/_vendor/src/github.com/googollee/go-socket.io/server.go:87 +0x4d
hub.webSocketServer.ServeHTTP(0xc4200b9a60, 0x11912a0, 0xc42fa208f0, 0xc432097860)	/home/navneet/repo/src/hub/websocketserver.go:286 +0x16b
net/http.(*ServeMux).ServeHTTP(0x11ab7a0, 0x11912a0, 0xc42fa208f0, 0xc432097860)	/home/navneet/go/go.1.7.1/src/net/http/server.go:2022 +0x7f
net/http.serverHandler.ServeHTTP(0xc420113280, 0x11912a0, 0xc42fa208f0, 0xc432097860)	/home/navneet/go/go.1.7.1/src/net/http/server.go:2202 +0x7d
net/http.(*conn).serve(0xc42ea25c00, 0x11922e0, 0xc42fa5f180)	/home/navneet/go/go.1.7.1/src/net/http/server.go:1579 +0x4b7
created by net/http.(*Server).Serve	/home/navneet/go/go.1.7.1/src/net/http/server.go:2293 +0x44d

The number of connections during this time was around 400. Which is reflected by the these goroutines.

413 @ 0x438e6a 0x438f5e 0x41096f 0x410635 0x7de942 0x67dc53 0x680764 0x680feb 0x469d21
#	0x7de941	github.com/googollee/go-engine%2eio.(*serverConn).NextReader+0x71	/home/navneet/repo/_vendor/src/github.com/googollee/go-engine.io/server_conn.go:128
#	0x67dc52	github.com/googollee/go-socket%2eio.(*decoder).Decode+0x62		/home/navneet/repo/_vendor/src/github.com/googollee/go-socket.io/parser.go:169
#	0x680763	github.com/googollee/go-socket%2eio.(*socket).loop+0x2c3		/home/navneet/repo/_vendor/src/github.com/googollee/go-socket.io/socket.go:132
#	0x680fea	github.com/googollee/go-socket%2eio.(*Server).loop.func1+0x2a		/home/navneet/repo/_vendor/src/github.com/googollee/go-socket.io/server.go:103

399 @ 0x438e6a 0x448479 0x44726c 0x7e0d35 0x469d21
#	0x7e0d34	github.com/googollee/go-engine%2eio.(*serverConn).pingLoop+0x3d4	/home/navneet/repo/_vendor/src/github.com/googollee/go-engine.io/server_conn.go:361

388 @ 0x438e6a 0x43375b 0x432eb9 0x5eaea8 0x5eaf14 0x5ec751 0x5fd9c0 0x631c1c 0x63227c 0xa3084d 0xa30996 0xa31bc7 0x87cce4 0x469d21
#	0x432eb8	net.runtime_pollWait+0x58						/home/navneet/go/go.1.7.1/src/runtime/netpoll.go:160
#	0x5eaea7	net.(*pollDesc).wait+0x37						/home/navneet/go/go.1.7.1/src/net/fd_poll_runtime.go:73
#	0x5eaf13	net.(*pollDesc).waitRead+0x33						/home/navneet/go/go.1.7.1/src/net/fd_poll_runtime.go:78
#	0x5ec750	net.(*netFD).Read+0x1a0							/home/navneet/go/go.1.7.1/src/net/fd_unix.go:243
#	0x5fd9bf	net.(*conn).Read+0x6f							/home/navneet/go/go.1.7.1/src/net/net.go:173
#	0x631c1b	bufio.(*Reader).fill+0x10b						/home/navneet/go/go.1.7.1/src/bufio/bufio.go:97
#	0x63227b	bufio.(*Reader).Read+0x1bb						/home/navneet/go/go.1.7.1/src/bufio/bufio.go:209
#	0xa3084c	github.com/gorilla/websocket.(*Conn).readFull+0x8c			/home/navneet/repo/_vendor/src/github.com/gorilla/websocket/conn.go:643
#	0xa30995	github.com/gorilla/websocket.(*Conn).advanceFrame+0x95			/home/navneet/repo/_vendor/src/github.com/gorilla/websocket/conn.go:667
#	0xa31bc6	github.com/gorilla/websocket.(*Conn).NextReader+0x56			/home/navneet/repo/_vendor/src/github.com/gorilla/websocket/conn.go:812
#	0x87cce3	github.com/googollee/go-engine.io/websocket.(*Server).serveHTTP+0x73	/home/navneet/repo/_vendor/src/github.com/googollee/go-engine.io/websocket/server.go:63

A check on the number of File Descriptors held by the process revealed that the old socket connections have not been released.

JSONP Polling not working

Hi!

I get a javascript error when using Internet Explorer 8.
Is this a server issue or a client issue?
I included a screenshot of the javascript console in IE8.

bildschirmfoto 2014-11-15 um 20 31 08

http: panic serving [::1]:52927: runtime error: close of closed channel

I am using the example code chat client. Reproduces when I use chrome open two chat client, keep the server running for few hours while computer is idle.
Note: line number conn.go:239 is off, I have put defer recover() as temporary fix there.
conn.go:239 is actually in func (s *conn) onClose(), close(s.readerChan). And, close(s.pingChan) panics too.

2014/08/09 04:26:57 on connection
2014/08/09 05:31:39 http: panic serving [::1]:52927: runtime error: close of closed channel
goroutine 130 [running]:
net/http.func·011()
/usr/local/go/src/pkg/net/http/server.go:1100 +0xb7
runtime.panic(0x2b57a0, 0x47b7b5)
/usr/local/go/src/pkg/runtime/panic.c:248 +0x18d
github.com/helinwang/go-engine%2eio.func·001()
/Users/helin/gopath/src/github.com/helinwang/go-engine.io/conn.go:239 +0x54
runtime.panic(0x2b57a0, 0x47b7b5)
/usr/local/go/src/pkg/runtime/panic.c:248 +0x18d
github.com/helinwang/go-engine%2eio.func·002()
/Users/helin/gopath/src/github.com/helinwang/go-engine.io/conn.go:244 +0x54
github.com/helinwang/go-engine%2eio.(_conn).onClose(0xc23758d260)
/Users/helin/gopath/src/github.com/helinwang/go-engine.io/conn.go:250 +0xc3
github.com/helinwang/go-engine%2eio.func·007()
/Users/helin/gopath/src/github.com/helinwang/go-engine.io/websocket.go:48 +0x5c
github.com/helinwang/go-engine%2eio.(_websocket).ServeHTTP(0xc238c55280, 0x52d960, 0xc208052b40, 0xc208029ba0)
/Users/helin/gopath/src/github.com/helinwang/go-engine.io/websocket.go:54 +0x193
github.com/helinwang/go-engine%2eio.(_conn).serveHTTP(0xc23758d260, 0x52d960, 0xc208052b40, 0xc208029ba0)
/Users/helin/gopath/src/github.com/helinwang/go-engine.io/conn.go:176 +0x186
github.com/helinwang/go-engine%2eio.(_Server).ServeHTTP(0xc2080185f0, 0x52d960, 0xc208052b40, 0xc208029ba0)
/Users/helin/gopath/src/github.com/helinwang/go-engine.io/server.go:119 +0x860
github.com/helinwang/go-socket%2eio.(_Server).ServeHTTP(0xc2080404e0, 0x52d960, 0xc208052b40, 0xc208029ba0)
/Users/helin/gopath/src/github.com/helinwang/go-socket.io/server.go:62 +0x49
net/http.(_ServeMux).ServeHTTP(0xc208022660, 0x52d960, 0xc208052b40, 0xc208029ba0)
/usr/local/go/src/pkg/net/http/server.go:1511 +0x1a3
net/http.serverHandler.ServeHTTP(0xc208004300, 0x52d960, 0xc208052b40, 0xc208029ba0)
/usr/local/go/src/pkg/net/http/server.go:1673 +0x19f
net/http.(_conn).serve(0xc208051680)
/usr/local/go/src/pkg/net/http/server.go:1174 +0xa7e
created by net/http.(_Server).Serve
/usr/local/go/src/pkg/net/http/server.go:1721 +0x313
2014/08/09 05:31:39 on disconnect

interface conversion: interface is nil, not *engineio.serverConn

Using go version go1.4.1 linux/amd64 when I run from example directory go run main.go initial connection to /engine-io from the page causes:

http: panic serving 127.0.0.1:48184: interface conversion: interface is nil, not *engineio.serverConn
goroutine 6 [running]:
net/http.func·011()
    /usr/local/go/src/net/http/server.go:1130 +0xbb
github.com/googollee/go-engine%2eio.(*Server).ServeHTTP(0xc2080120e0, 0x7f23e903c318, 0xc208054be0, 0xc208034c30)
    /home/alex/gpath/src/github.com/googollee/go-engine.io/server.go:112 +0x1a0
net/http.(*ServeMux).ServeHTTP(0xc20803c6c0, 0x7f23e903c318, 0xc208054be0, 0xc208034c30)
    /usr/local/go/src/net/http/server.go:1541 +0x17d
net/http.serverHandler.ServeHTTP(0xc20805e120, 0x7f23e903c318, 0xc208054be0, 0xc208034c30)
    /usr/local/go/src/net/http/server.go:1703 +0x19a
net/http.(*conn).serve(0xc208054960)
    /usr/local/go/src/net/http/server.go:1204 +0xb57
created by net/http.(*Server).Serve
    /usr/local/go/src/net/http/server.go:1751 +0x35e

way to test engine.io?

I had try websocket-bench but it seem something error, is there other way to bench test engine.io?

appledeMacBook-Pro-2:websocket ruandao$ websocket-bench -g generator.js -t engine.io -a 100 -c 40 http://localhost:5000/engine.io/
Launch bench with 100 total connection, 40 concurent connection
0 message(s) send by client
1 worker(s)
WS server : engine.io
/usr/local/lib/node_modules/websocket-bench/lib/worker.js:36
var worker = new BenchmarkWorker(server, generator, verbose);
             ^

TypeError: BenchmarkWorker is not a function
    at Object.<anonymous> (/usr/local/lib/node_modules/websocket-bench/lib/worker.js:36:14)
    at Module._compile (module.js:413:34)
    at Object.Module._extensions..js (module.js:422:10)
    at Module.load (module.js:357:32)
    at Function.Module._load (module.js:314:12)
    at Function.Module.runMain (module.js:447:10)
    at startup (node.js:142:18)
    at node.js:939:3
events.js:154
      throw er; // Unhandled 'error' event
      ^

Error: channel closed
    at ChildProcess.target.send (internal/child_process.js:523:16)
    at Benchmark._nextStep (/usr/local/lib/node_modules/websocket-bench/lib/benchmark.js:87:21)
    at Timeout._onTimeout (/usr/local/lib/node_modules/websocket-bench/lib/benchmark.js:100:13)
    at tryOnTimeout (timers.js:224:11)
    at Timer.listOnTimeout (timers.js:198:5)

Client read TCP timeout when pingTimeout is less than pingInterval

c.conn.SetReadDeadline(time.Now().Add(c.params.PingTimeout))

According to the JavaScript documentation, a client may have to wait up to pingTimeout + pingInterval ms before getting a disconnect event. https://socket.io/docs/server-api/#new-Server-httpServer-options

My server is written in JavaScript with default parameter (25s pingInterval 5s pingTimeout), this line of code would make all read timeout 5s after receiving pong. This makes my client reconnect every 30s.

For reference, in the JavaScript implementation, it waits pingInterval + pingTimeout:
https://github.com/socketio/engine.io/blob/6a16ea119280a02029618544d44eb515f7f2d076/lib/socket.js#L141

send on closed channel && close of closed channel

1976513-panic: send on closed channel
1976514-
1976515:goroutine 338071 [running]:
1976516-panic(0x83ad60, 0xc829f05840)
1976517-	/usr/local/go/src/runtime/panic.go:464 +0x3e6
1976518-github.com/googollee/go-engine%2eio.(*serverConn).OnPacket(0xc82739d450, 0xc82850c600)
1976519-	/data/html/live_im_system/src/github.com/googollee/go-engine.io/server_conn.go:228 +0x488
1976520-github.com/googollee/go-engine.io/websocket.(*Server).serveHTTP(0xc8289f3620, 0x7fbc704ba510, 0xc8273581a0, 0xc8273fad20)
1976521-	/data/html/live_im_system/src/github.com/googollee/go-engine.io/websocket/server.go:77 +0x196
1976522-created by github.com/googollee/go-engine.io/websocket.NewServer
1976523-	/data/html/live_im_system/src/github.com/googollee/go-engine.io/websocket/server.go:29 +0x16d

http: response.WriteHeader on hijacked connection

When going straight to a websocket connection (and skipping the HTTP long polling handshake), the server logs http: response.WriteHeader on hijacked connection. This is not a huge problem but it is unnecessary. The reason for this is because the ServeHTTP method is never expected to be called. When the client's first request is for a websocket, it does get called. Perhaps, we can detect this and make it a noop (because the connection has already been hijacked so we don't need to do anything).

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.