changkun / occamy

🖥️ a modern remote desktop proxy written in Go
https://github.com/changkun/occamy
MIT License
313 stars 54 forks source link

Panics under high pressure #20

Open changkun opened 4 years ago

changkun commented 4 years ago

Describe the bug A cgo bug again. But not appear very often.

[Switching to Thread 0x7f7fc9bb2700 (LWP 11)]
0x00007f7fd40d9cc0 in pthread_mutex_lock () from /lib64/libpthread.so.0
Missing separate debuginfos, use: debuginfo-install bzip2-libs-1.0.6-13.el7.x86_64 cairo-1.15.12-4.el7.x86_64 expat-2.1.0-10.el7_3.x86_64 fontconfig-2.13.0-4.3.el7.x86_64 freerdp-libs-1.0.2-15.el7.x86_64 freetype-2.8-14.el7.x86_64 fribidi-1.0.2-1.el7.x86_64 glib2-2.56.1-5.el7.x86_64 glibc-2.17-292.el7.x86_64 gmp-6.0.0-15.el7.x86_64 gnutls-3.3.29-9.el7_6.x86_64 graphite2-1.3.10-1.el7_3.x86_64 harfbuzz-1.7.5-2.el7.x86_64 keyutils-libs-1.5.8-3.el7.x86_64 krb5-libs-1.15.1-37.el7_7.2.x86_64 libX11-1.6.7-2.el7.x86_64 libXau-1.0.8-2.1.el7.x86_64 libXext-1.3.3-3.el7.x86_64 libXrender-0.9.10-1.el7.x86_64 libcom_err-1.42.9-16.el7.x86_64 libffi-3.0.13-18.el7.x86_64 libgcc-4.8.5-39.el7.x86_64 libgcrypt-1.5.3-14.el7.x86_64 libglvnd-1.0.1-0.8.git5baa1e5.el7.x86_64 libglvnd-egl-1.0.1-0.8.git5baa1e5.el7.x86_64 libglvnd-glx-1.0.1-0.8.git5baa1e5.el7.x86_64 libgpg-error-1.12-3.el7.x86_64 libjpeg-turbo-1.2.90-8.el7.x86_64 libpng-1.5.13-7.el7_2.x86_64 libselinux-2.5-14.1.el7.x86_64 libssh2-1.8.0-3.el7.x86_64 libtasn1-4.10-1.el7.x86_64 libthai-0.1.14-9.el7.x86_64 libuuid-2.23.2-61.el7.x86_64 libvncserver-0.9.9-13.el7_6.x86_64 libwebp-0.3.0-7.el7.x86_64 libxcb-1.13-1.el7.x86_64 lzo-minilzo-2.06-8.el7.x86_64 nettle-2.7.1-8.el7.x86_64 openssl-libs-1.0.2k-19.el7.x86_64 p11-kit-0.23.5-3.el7.x86_64 pango-1.42.4-4.el7_7.x86_64 pcre-8.32-17.el7.x86_64 pixman-0.34.0-1.el7.x86_64 uuid-1.6.2-26.el7.x86_64 zlib-1.2.7-18.el7.x86_64
(gdb) bt
#0  0x00007f7fd40d9cc0 in pthread_mutex_lock () at /lib64/libpthread.so.0
#1  0x00007f7fc8049ac9 in guac_common_list_lock (list=<optimized out>) at list.c:75
#2  0x00007f7fc03a6658 in guac_rdp_svc_send_pipes (user=0x7f7f9c0029e0) at rdp_svc.c:78
#3  0x00007f7fc03a6a1b in guac_rdp_user_join_handler (user=0x7f7f9c0029e0, argc=<optimized out>, argv=<optimized out>) at user.c:85
#4  0x00007f7fd42f2e1d in guac_client_add_user (user=0x7f7f9c0029e0, argc=<optimized out>, argv=<optimized out>)
    at client.c:285
#5  0x00000000009f800e in _cgo_5063686ecc33_Cfunc_guac_client_add_user (v=0xc0004db4c8) at cgo-gcc-prolog:89
#6  0x0000000000460c70 in runtime.asmcgocall () at /usr/local/go/src/runtime/asm_amd64.s:655
#7  0x000000000043947d in runtime.park_m (gp=0xc00055a600) at /usr/local/go/src/runtime/proc.go:2610
#8  0x000000c0002b1080 in  ()
#9  0x000000c00055a600 in  ()
#10 0x0000000000000000 in  ()

A stack trace:

occamy    | occamy-lib[140186717513472]: User is not responding.
occamy    | time="2019-11-07T09:55:13Z" level=info msg="User @13f96c22-fd5d-4625-b80e-187143d1174d disconnected (0 users remain)"
occamy    | occamy-lib[140185997338368]: Loading keymap "base"
occamy    | occamy-lib[140185997338368]: Loading keymap "en-us-qwerty"
occamy    | fatal error: unexpected signal during runtime execution
occamy    | [signal SIGSEGV: segmentation violation code=0x1 addr=0x18 pc=0x7f7fd40d9cc0]
occamy    |
occamy    | runtime stack:
occamy    | runtime.throw(0xb8c680, 0x2a)
occamy    |     /usr/local/go/src/runtime/panic.go:774 +0x72
occamy    | runtime.sigpanic()
occamy    |     /usr/local/go/src/runtime/signal_unix.go:378 +0x47c
occamy    |
occamy    | goroutine 206 [syscall, 3 minutes]:
occamy    | runtime.cgocall(0x9f7ff0, 0xc0004db4c8, 0x9c0048f0)
occamy    |     /usr/local/go/src/runtime/cgocall.go:128 +0x5b fp=0xc0004db498 sp=0xc0004db460 pc=0x40556b
occamy    | github.com/changkun/occamy/lib._Cfunc_guac_client_add_user(0x7f7f9c0029e0, 0x7f7f00000030, 0x7f7f9c0048f0, 0x0)
occamy    |     _cgo_gotypes.go:312 +0x4d fp=0xc0004db4c8 sp=0xc0004db498 pc=0x9f029d
occamy    | github.com/changkun/occamy/lib.(*User).HandleConnection.func5(0xc00006cb40, 0xc0005ee300, 0x30, 0x30, 0x7f7f9c0048f0, 0xc00006cb40)
occamy    |     /go/src/github.com/changkun/occamy/lib/user.go:150 +0xa0 fp=0xc0004db508 sp=0xc0004db4c8 pc=0x9f27c0
occamy    | github.com/changkun/occamy/lib.(*User).HandleConnection(0xc00006cb40, 0x0, 0x0)
occamy    |     /go/src/github.com/changkun/occamy/lib/user.go:150 +0x4ea fp=0xc0004db648 sp=0xc0004db508 pc=0x9f1cda
occamy    | github.com/changkun/occamy/server.(*Session).Join.func1(0xc00046a450, 0x47, 0x0, 0xc00029e080)
occamy    |     /go/src/github.com/changkun/occamy/server/session.go:88 +0x2ed fp=0xc0004db7c0 sp=0xc0004db648 pc=0x9f732d
occamy    | runtime.goexit()
occamy    |     /usr/local/go/src/runtime/asm_amd64.s:1357 +0x1 fp=0xc0004db7c8 sp=0xc0004db7c0 pc=0x4614f1
occamy    | created by github.com/changkun/occamy/server.(*Session).Join
occamy    |     /go/src/github.com/changkun/occamy/server/session.go:65 +0x14c
occamy    |
occamy    | goroutine 1 [IO wait, 3 minutes, locked to thread]:
occamy    | internal/poll.runtime_pollWait(0x7f7fd4623ed8, 0x72, 0x0)
occamy    |     /usr/local/go/src/runtime/netpoll.go:184 +0x55
occamy    | internal/poll.(*pollDesc).wait(0xc0000e6318, 0x72, 0x0, 0x0, 0xb75faf)
occamy    |     /usr/local/go/src/internal/poll/fd_poll_runtime.go:87 +0x45
occamy    | internal/poll.(*pollDesc).waitRead(...)
occamy    |     /usr/local/go/src/internal/poll/fd_poll_runtime.go:92
occamy    | internal/poll.(*FD).Accept(0xc0000e6300, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0)
occamy    |     /usr/local/go/src/internal/poll/fd_unix.go:384 +0x1f8
occamy    | net.(*netFD).accept(0xc0000e6300, 0xc0001c7c70, 0x6d9654, 0xc000216180)
occamy    |     /usr/local/go/src/net/fd_unix.go:238 +0x42
occamy    | net.(*TCPListener).accept(0xc0001b4700, 0x5dc3e93b, 0xc0001c7c70, 0x484cb6)
occamy    |     /usr/local/go/src/net/tcpsock_posix.go:139 +0x32
occamy    | net.(*TCPListener).Accept(0xc0001b4700, 0xc0001c7cc0, 0x18, 0xc000000180, 0x6d8b6e)
occamy    |     /usr/local/go/src/net/tcpsock.go:261 +0x47
occamy    | net/http.(*Server).Serve(0xc0002160e0, 0xc86980, 0xc0001b4700, 0x0, 0x0)
occamy    |     /usr/local/go/src/net/http/server.go:2896 +0x286
occamy    | net/http.(*Server).ListenAndServe(0xc0002160e0, 0x4, 0xb89f25)
occamy    |     /usr/local/go/src/net/http/server.go:2825 +0xb7
occamy    | github.com/changkun/occamy/server.(*proxy).serve(0xc0001b4360)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:67 +0x1ec
occamy    | github.com/changkun/occamy/server.Run(...)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:39
occamy    | main.main()
occamy    |     /go/src/github.com/changkun/occamy/occamy.go:18 +0xf0
occamy    |
occamy    | goroutine 7 [syscall, 3 minutes]:
occamy    | os/signal.signal_recv(0x0)
occamy    |     /usr/local/go/src/runtime/sigqueue.go:147 +0x9c
occamy    | os/signal.loop()
occamy    |     /usr/local/go/src/os/signal/signal_unix.go:23 +0x22
occamy    | created by os/signal.init.0
occamy    |     /usr/local/go/src/os/signal/signal_unix.go:29 +0x41
occamy    |
occamy    | goroutine 18 [chan receive, 3 minutes]:
occamy    | github.com/changkun/occamy/server.(*proxy).serve.func1(0xc0002160e0)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:58 +0xe0
occamy    | created by github.com/changkun/occamy/server.(*proxy).serve
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:55 +0x14f
occamy    |
occamy    | goroutine 279 [runnable]:
occamy    | bytes.makeSlice.func1()
occamy    |     /usr/local/go/src/bytes/buffer.go:224 +0x68
occamy    | bytes.makeSlice(0x600, 0xc00045c000, 0x600, 0x600)
occamy    |     /usr/local/go/src/bytes/buffer.go:229 +0x94
occamy    | bytes.(*Buffer).grow(0xc000576ed8, 0x200, 0x200)
occamy    |     /usr/local/go/src/bytes/buffer.go:142 +0x15b
occamy    | bytes.(*Buffer).ReadFrom(0xc000576ed8, 0x7f7fc8002138, 0xc00048e050, 0xaa3de0, 0xa9d720, 0x0)
occamy    |     /usr/local/go/src/bytes/buffer.go:202 +0x4b
occamy    | io/ioutil.readAll(0x7f7fc8002138, 0xc00048e050, 0x200, 0x0, 0x0, 0x0, 0x0, 0x0)
occamy    |     /usr/local/go/src/io/ioutil/ioutil.go:36 +0x100
occamy    | io/ioutil.ReadAll(...)
occamy    |     /usr/local/go/src/io/ioutil/ioutil.go:45
occamy    | github.com/gorilla/websocket.(*Conn).ReadMessage(0xc000277b80, 0x6ce183, 0xc00029e6c0, 0xc78b01, 0xc0002beaa0, 0x7f7fd46240f8, 0x439956)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gorilla/websocket/conn.go:1032 +0x9a
occamy    | github.com/changkun/occamy/server.(*Session).serveIO.func2(0xc00031e360, 0xc0000e23d0, 0xc0001b4900, 0xc000277b80)
occamy    |     /go/src/github.com/changkun/occamy/server/session.go:141 +0x37
occamy    | created by github.com/changkun/occamy/server.(*Session).serveIO
occamy    |     /go/src/github.com/changkun/occamy/server/session.go:138 +0xfb
occamy    |
occamy    | goroutine 284 [IO wait, 3 minutes]:
occamy    | internal/poll.runtime_pollWait(0x7f7fd466bd68, 0x72, 0xffffffffffffffff)
occamy    |     /usr/local/go/src/runtime/netpoll.go:184 +0x55
occamy    | internal/poll.(*pollDesc).wait(0xc0002f5998, 0x72, 0x2000, 0x2000, 0xffffffffffffffff)
occamy    |     /usr/local/go/src/internal/poll/fd_poll_runtime.go:87 +0x45
occamy    | internal/poll.(*pollDesc).waitRead(...)
occamy    |     /usr/local/go/src/internal/poll/fd_poll_runtime.go:92
occamy    | internal/poll.(*FD).Read(0xc0002f5980, 0xc000198000, 0x2000, 0x2000, 0x0, 0x0, 0x0)
occamy    |     /usr/local/go/src/internal/poll/fd_unix.go:169 +0x1cf
occamy    | net.(*netFD).Read(0xc0002f5980, 0xc000198000, 0x2000, 0x2000, 0x0, 0x0, 0x0)
occamy    |     /usr/local/go/src/net/fd_unix.go:202 +0x4f
occamy    | net.(*conn).Read(0xc0000107c8, 0xc000198000, 0x2000, 0x2000, 0x0, 0x0, 0x0)
occamy    |     /usr/local/go/src/net/net.go:184 +0x68
occamy    | bufio.(*Reader).fill(0xc0003e05a0)
occamy    |     /usr/local/go/src/bufio/bufio.go:100 +0x103
occamy    | bufio.(*Reader).Peek(0xc0003e05a0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0)
occamy    |     /usr/local/go/src/bufio/bufio.go:138 +0x4f
occamy    | github.com/gorilla/websocket.(*Conn).read(0xc0005518c0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gorilla/websocket/conn.go:357 +0x40
occamy    | github.com/gorilla/websocket.(*Conn).advanceFrame(0xc0005518c0, 0x0, 0x0, 0x0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gorilla/websocket/conn.go:787 +0x5c
occamy    | github.com/gorilla/websocket.(*Conn).NextReader(0xc0005518c0, 0x0, 0x0, 0x0, 0x0, 0x0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gorilla/websocket/conn.go:947 +0xa0
occamy    | github.com/gorilla/websocket.(*Conn).ReadMessage(0xc0005518c0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gorilla/websocket/conn.go:1028 +0x2f
occamy    | github.com/changkun/occamy/server.(*Session).serveIO.func2(0xc00031efc0, 0xc0000e2710, 0xc0001b4ce0, 0xc0005518c0)
occamy    |     /go/src/github.com/changkun/occamy/server/session.go:141 +0x37
occamy    | created by github.com/changkun/occamy/server.(*Session).serveIO
occamy    |     /go/src/github.com/changkun/occamy/server/session.go:138 +0xfb
occamy    |
occamy    | goroutine 31 [semacquire, 3 minutes]:
occamy    | sync.runtime_SemacquireMutex(0xc0001b436c, 0x0, 0x1)
occamy    |     /usr/local/go/src/runtime/sema.go:71 +0x47
occamy    | sync.(*Mutex).lockSlow(0xc0001b4368)
occamy    |     /usr/local/go/src/sync/mutex.go:138 +0xfc
occamy    | sync.(*Mutex).Lock(...)
occamy    |     /usr/local/go/src/sync/mutex.go:81
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc0001b4360, 0xc000319340, 0xc00025bb00, 0x8, 0xc000275f18)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:200 +0x3ed
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc0001b4360, 0xc000418000)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:191 +0x464
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000418000)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc0001fe120, 0xc000418000)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc000418000)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000418000)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc000418000)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x64
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000418000)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc000418000)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000418000)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc0001da3c0, 0xc000418000)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b2
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc0001da3c0, 0xc86c40, 0xc00026d180, 0xc00025f300)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x134
occamy    | net/http.serverHandler.ServeHTTP(0xc0002160e0, 0xc86c40, 0xc00026d180, 0xc00025f300)
occamy    |     /usr/local/go/src/net/http/server.go:2802 +0xa4
occamy    | net/http.(*conn).serve(0xc0001d8460, 0xc88640, 0xc00025ba00)
occamy    |     /usr/local/go/src/net/http/server.go:1890 +0x875
occamy    | created by net/http.(*Server).Serve
occamy    |     /usr/local/go/src/net/http/server.go:2927 +0x38e
occamy    |
occamy    | goroutine 283 [syscall, 3 minutes]:
occamy    | syscall.Syscall(0x0, 0x50, 0xc00043e000, 0x2000, 0x0, 0x0, 0x0)
occamy    |     /usr/local/go/src/syscall/asm_linux_amd64.s:18 +0x5
occamy    | syscall.read(0x50, 0xc00043e000, 0x2000, 0x2000, 0x0, 0x0, 0x0)
occamy    |     /usr/local/go/src/syscall/zsyscall_linux_amd64.go:732 +0x5a
occamy    | syscall.Read(...)
occamy    |     /usr/local/go/src/syscall/syscall_unix.go:183
occamy    | github.com/changkun/occamy/protocol.IO.Read(0x50, 0xc00043e000, 0x2000, 0x2000, 0x0, 0x0, 0x0)
occamy    |     /go/src/github.com/changkun/occamy/protocol/io.go:21 +0x49
occamy    | bufio.(*Reader).fill(0xc00031ef60)
occamy    |     /usr/local/go/src/bufio/bufio.go:100 +0x103
occamy    | bufio.(*Reader).ReadSlice(0xc00031ef60, 0x3b, 0x0, 0x0, 0x0, 0x0, 0x0)
occamy    |     /usr/local/go/src/bufio/bufio.go:359 +0x3d
occamy    | bufio.(*Reader).ReadBytes(0xc00031ef60, 0x3b, 0x0, 0x0, 0x0, 0x0, 0x0)
occamy    |     /usr/local/go/src/bufio/bufio.go:437 +0x73
occamy    | github.com/changkun/occamy/protocol.(*InstructionIO).ReadRaw(...)
occamy    |     /go/src/github.com/changkun/occamy/protocol/instruction.go:148
occamy    | github.com/changkun/occamy/server.(*Session).serveIO.func1(0xc00031efc0, 0xc0000e2710, 0xc0001b4ce0, 0xc0005518c0)
occamy    |     /go/src/github.com/changkun/occamy/server/session.go:126 +0x41
occamy    | created by github.com/changkun/occamy/server.(*Session).serveIO
occamy    |     /go/src/github.com/changkun/occamy/server/session.go:123 +0xb8
occamy    |
occamy    | goroutine 278 [syscall, 3 minutes]:
occamy    | syscall.Syscall(0x0, 0x45, 0xc000212000, 0x2000, 0xc0004064d0, 0xc68152, 0xb9e201)
occamy    |     /usr/local/go/src/syscall/asm_linux_amd64.s:18 +0x5
occamy    | syscall.read(0x45, 0xc000212000, 0x2000, 0x2000, 0xc000277b80, 0xc0004a200c, 0x26)
occamy    |     /usr/local/go/src/syscall/zsyscall_linux_amd64.go:732 +0x5a
occamy    | syscall.Read(...)
occamy    |     /usr/local/go/src/syscall/syscall_unix.go:183
occamy    | github.com/changkun/occamy/protocol.IO.Read(0x45, 0xc000212000, 0x2000, 0x2000, 0xc000353da0, 0x9e3207, 0x0)
occamy    |     /go/src/github.com/changkun/occamy/protocol/io.go:21 +0x49
occamy    | bufio.(*Reader).fill(0xc00031e300)
occamy    |     /usr/local/go/src/bufio/bufio.go:100 +0x103
occamy    | bufio.(*Reader).ReadSlice(0xc00031e300, 0xc00021203b, 0x24, 0xc000277b80, 0xc000353f58, 0x9e54dc, 0xc000353f28)
occamy    |     /usr/local/go/src/bufio/bufio.go:359 +0x3d
occamy    | bufio.(*Reader).ReadBytes(0xc00031e300, 0x3b, 0xc0002b42d0, 0x24, 0x24, 0x0, 0x0)
occamy    |     /usr/local/go/src/bufio/bufio.go:437 +0x73
occamy    | github.com/changkun/occamy/protocol.(*InstructionIO).ReadRaw(...)
occamy    |     /go/src/github.com/changkun/occamy/protocol/instruction.go:148
occamy    | github.com/changkun/occamy/server.(*Session).serveIO.func1(0xc00031e360, 0xc0000e23d0, 0xc0001b4900, 0xc000277b80)
occamy    |     /go/src/github.com/changkun/occamy/server/session.go:126 +0x41
occamy    | created by github.com/changkun/occamy/server.(*Session).serveIO
occamy    |     /go/src/github.com/changkun/occamy/server/session.go:123 +0xb8
occamy    |
occamy    | goroutine 213 [semacquire, 3 minutes]:
occamy    | sync.runtime_SemacquireMutex(0xc0001b436c, 0x0, 0x1)
occamy    |     /usr/local/go/src/runtime/sema.go:71 +0x47
occamy    | sync.(*Mutex).lockSlow(0xc0001b4368)
occamy    |     /usr/local/go/src/sync/mutex.go:138 +0xfc
occamy    | sync.(*Mutex).Lock(...)
occamy    |     /usr/local/go/src/sync/mutex.go:81
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc0001b4360, 0xc0005ba9a0, 0xc000536440, 0x8, 0xc000430638)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:200 +0x3ed
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc0001b4360, 0xc0003280b0)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:191 +0x464
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0003280b0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc0001fe120, 0xc0003280b0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc0003280b0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0003280b0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc0003280b0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x64
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0003280b0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc0003280b0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0003280b0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc0001da3c0, 0xc0003280b0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b2
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc0001da3c0, 0xc86c40, 0xc000414000, 0xc000534600)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x134
occamy    | net/http.serverHandler.ServeHTTP(0xc0002160e0, 0xc86c40, 0xc000414000, 0xc000534600)
occamy    |     /usr/local/go/src/net/http/server.go:2802 +0xa4
occamy    | net/http.(*conn).serve(0xc0002ef2c0, 0xc88640, 0xc000370c00)
occamy    |     /usr/local/go/src/net/http/server.go:1890 +0x875
occamy    | created by net/http.(*Server).Serve
occamy    |     /usr/local/go/src/net/http/server.go:2927 +0x38e
occamy    |
occamy    | goroutine 214 [semacquire, 3 minutes]:
occamy    | sync.runtime_SemacquireMutex(0xc0001b436c, 0x0, 0x1)
occamy    |     /usr/local/go/src/runtime/sema.go:71 +0x47
occamy    | sync.(*Mutex).lockSlow(0xc0001b4368)
occamy    |     /usr/local/go/src/sync/mutex.go:138 +0xfc
occamy    | sync.(*Mutex).Lock(...)
occamy    |     /usr/local/go/src/sync/mutex.go:81
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc0001b4360, 0xc000277a20, 0xc00029e940, 0x8, 0xc0001ff2d8)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:200 +0x3ed
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc0001b4360, 0xc00037edc0)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:191 +0x464
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00037edc0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc0001fe120, 0xc00037edc0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc00037edc0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00037edc0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc00037edc0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x64
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00037edc0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc00037edc0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00037edc0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc0001da3c0, 0xc00037edc0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b2
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc0001da3c0, 0xc86c40, 0xc000216700, 0xc00025e300)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x134
occamy    | net/http.serverHandler.ServeHTTP(0xc0002160e0, 0xc86c40, 0xc000216700, 0xc00025e300)
occamy    |     /usr/local/go/src/net/http/server.go:2802 +0xa4
occamy    | net/http.(*conn).serve(0xc0002ef360, 0xc88640, 0xc000370c40)
occamy    |     /usr/local/go/src/net/http/server.go:1890 +0x875
occamy    | created by net/http.(*Server).Serve
occamy    |     /usr/local/go/src/net/http/server.go:2927 +0x38e
occamy    |
occamy    | goroutine 282 [syscall, 3 minutes]:
occamy    | github.com/changkun/occamy/lib._Cfunc_guac_user_input_thread(0x7f7f940029a0, 0x7f7f00e4e1c0)
occamy    |     _cgo_gotypes.go:482 +0x41
occamy    | github.com/changkun/occamy/lib.(*User).HandleConnection.func6(0xc00031f080)
occamy    |     /go/src/github.com/changkun/occamy/lib/user.go:154 +0x66
occamy    | github.com/changkun/occamy/lib.(*User).HandleConnection(0xc00031f080, 0x0, 0x0)
occamy    |     /go/src/github.com/changkun/occamy/lib/user.go:154 +0x65f
occamy    | github.com/changkun/occamy/server.(*Session).Join.func1(0xc00046a450, 0x4f, 0x1, 0xc000580500)
occamy    |     /go/src/github.com/changkun/occamy/server/session.go:88 +0x2ed
occamy    | created by github.com/changkun/occamy/server.(*Session).Join
occamy    |     /go/src/github.com/changkun/occamy/server/session.go:65 +0x14c
occamy    |
occamy    | goroutine 210 [semacquire, 3 minutes]:
occamy    | sync.runtime_SemacquireMutex(0xc0001b436c, 0x0, 0x1)
occamy    |     /usr/local/go/src/runtime/sema.go:71 +0x47
occamy    | sync.(*Mutex).lockSlow(0xc0001b4368)
occamy    |     /usr/local/go/src/sync/mutex.go:138 +0xfc
occamy    | sync.(*Mutex).Lock(...)
occamy    |     /usr/local/go/src/sync/mutex.go:81
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc0001b4360, 0xc00053c580, 0xc000580140, 0x8, 0xc00053a678)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:200 +0x3ed
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc0001b4360, 0xc00037e160)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:191 +0x464
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00037e160)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc0001fe120, 0xc00037e160)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc00037e160)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00037e160)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc00037e160)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x64
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00037e160)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc00037e160)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00037e160)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc0001da3c0, 0xc00037e160)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b2
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc0001da3c0, 0xc86c40, 0xc00037a700, 0xc0003c5a00)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x134
occamy    | net/http.serverHandler.ServeHTTP(0xc0002160e0, 0xc86c40, 0xc00037a700, 0xc0003c5a00)
occamy    |     /usr/local/go/src/net/http/server.go:2802 +0xa4
occamy    | net/http.(*conn).serve(0xc0002ef0e0, 0xc88640, 0xc000370a80)
occamy    |     /usr/local/go/src/net/http/server.go:1890 +0x875
occamy    | created by net/http.(*Server).Serve
occamy    |     /usr/local/go/src/net/http/server.go:2927 +0x38e
occamy    |
occamy    | goroutine 240 [syscall, 3 minutes]:
occamy    | syscall.Syscall(0x0, 0x4c, 0xc000444000, 0x2000, 0xc0000685b0, 0xc68152, 0xb9e201)
occamy    |     /usr/local/go/src/syscall/asm_linux_amd64.s:18 +0x5
occamy    | syscall.read(0x4c, 0xc000444000, 0x2000, 0x2000, 0xc0000bb4a0, 0xc00001450c, 0x2a)
occamy    |     /usr/local/go/src/syscall/zsyscall_linux_amd64.go:732 +0x5a
occamy    | syscall.Read(...)
occamy    |     /usr/local/go/src/syscall/syscall_unix.go:183
occamy    | github.com/changkun/occamy/protocol.IO.Read(0x4c, 0xc000444000, 0x2000, 0x2000, 0xc00049cda0, 0x9e3207, 0x0)
occamy    |     /go/src/github.com/changkun/occamy/protocol/io.go:21 +0x49
occamy    | bufio.(*Reader).fill(0xc00039a3c0)
occamy    |     /usr/local/go/src/bufio/bufio.go:100 +0x103
occamy    | bufio.(*Reader).ReadSlice(0xc00039a3c0, 0xc00044413b, 0x28, 0xc0000bb4a0, 0xc00049cf58, 0x9e54dc, 0xc00049cf28)
occamy    |     /usr/local/go/src/bufio/bufio.go:359 +0x3d
occamy    | bufio.(*Reader).ReadBytes(0xc00039a3c0, 0x3b, 0xc000338690, 0x28, 0x28, 0x0, 0x0)
occamy    |     /usr/local/go/src/bufio/bufio.go:437 +0x73
occamy    | github.com/changkun/occamy/protocol.(*InstructionIO).ReadRaw(...)
occamy    |     /go/src/github.com/changkun/occamy/protocol/instruction.go:148
occamy    | github.com/changkun/occamy/server.(*Session).serveIO.func1(0xc00039a420, 0xc00036a170, 0xc00036e2e0, 0xc0000bb4a0)
occamy    |     /go/src/github.com/changkun/occamy/server/session.go:126 +0x41
occamy    | created by github.com/changkun/occamy/server.(*Session).serveIO
occamy    |     /go/src/github.com/changkun/occamy/server/session.go:123 +0xb8
occamy    |
occamy    | goroutine 97 [semacquire, 3 minutes]:
occamy    | sync.runtime_SemacquireMutex(0xc0001b436c, 0x0, 0x1)
occamy    |     /usr/local/go/src/runtime/sema.go:71 +0x47
occamy    | sync.(*Mutex).lockSlow(0xc0001b4368)
occamy    |     /usr/local/go/src/sync/mutex.go:138 +0xfc
occamy    | sync.(*Mutex).Lock(...)
occamy    |     /usr/local/go/src/sync/mutex.go:81
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc0001b4360, 0xc000550420, 0xc000580100, 0x8, 0xc000512538)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:200 +0x3ed
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc0001b4360, 0xc00037e000)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:191 +0x464
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00037e000)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc0001fe120, 0xc00037e000)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc00037e000)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00037e000)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc00037e000)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x64
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00037e000)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc00037e000)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00037e000)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc0001da3c0, 0xc00037e000)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b2
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc0001da3c0, 0xc86c40, 0xc00037a620, 0xc0003c5900)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x134
occamy    | net/http.serverHandler.ServeHTTP(0xc0002160e0, 0xc86c40, 0xc00037a620, 0xc0003c5900)
occamy    |     /usr/local/go/src/net/http/server.go:2802 +0xa4
occamy    | net/http.(*conn).serve(0xc0002ef040, 0xc88640, 0xc0003709c0)
occamy    |     /usr/local/go/src/net/http/server.go:1890 +0x875
occamy    | created by net/http.(*Server).Serve
occamy    |     /usr/local/go/src/net/http/server.go:2927 +0x38e
occamy    |
occamy    | goroutine 30 [chan receive, 3 minutes, locked to thread]:
occamy    | github.com/changkun/occamy/server.(*Session).serveIO(0xc00046a750, 0xc0001b4900, 0xc000277b80, 0x26, 0x1)
occamy    |     /go/src/github.com/changkun/occamy/server/session.go:153 +0x11b
occamy    | github.com/changkun/occamy/server.(*Session).Join(0xc00046a750, 0xc000277b80, 0xc00029ec80, 0x1, 0x0, 0x0)
occamy    |     /go/src/github.com/changkun/occamy/server/session.go:99 +0x1bd
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc0001b4360, 0xc000277b80, 0xc00029ec80, 0x8, 0xc00031d198)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:217 +0x2dd
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc0001b4360, 0xc000270000)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:191 +0x464
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000270000)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc0001fe120, 0xc000270000)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc000270000)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000270000)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc000270000)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x64
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000270000)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc000270000)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000270000)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc0001da3c0, 0xc000270000)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b2
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc0001da3c0, 0xc86c40, 0xc0004148c0, 0xc0002ade00)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x134
occamy    | net/http.serverHandler.ServeHTTP(0xc0002160e0, 0xc86c40, 0xc0004148c0, 0xc0002ade00)
occamy    |     /usr/local/go/src/net/http/server.go:2802 +0xa4
occamy    | net/http.(*conn).serve(0xc0001d83c0, 0xc88640, 0xc00029eb80)
occamy    |     /usr/local/go/src/net/http/server.go:1890 +0x875
occamy    | created by net/http.(*Server).Serve
occamy    |     /usr/local/go/src/net/http/server.go:2927 +0x38e
occamy    |
occamy    | goroutine 249 [syscall, 3 minutes]:
occamy    | github.com/changkun/occamy/lib._Cfunc_guac_client_add_user(0x7f7fa00029e0, 0x7f7f00000014, 0x7f7fa0002b90, 0x0)
occamy    |     _cgo_gotypes.go:312 +0x4d
occamy    | github.com/changkun/occamy/lib.(*User).HandleConnection.func5(0xc0002f8540, 0xc0001da000, 0x14, 0x14, 0x7f7fa0002b90, 0xc0002f8540)
occamy    |     /go/src/github.com/changkun/occamy/lib/user.go:150 +0xa0
occamy    | github.com/changkun/occamy/lib.(*User).HandleConnection(0xc0002f8540, 0x0, 0x0)
occamy    |     /go/src/github.com/changkun/occamy/lib/user.go:150 +0x4ea
occamy    | github.com/changkun/occamy/server.(*Session).Join.func1(0xc00046a750, 0x4b, 0x0, 0xc0001a4bc0)
occamy    |     /go/src/github.com/changkun/occamy/server/session.go:88 +0x2ed
occamy    | created by github.com/changkun/occamy/server.(*Session).Join
occamy    |     /go/src/github.com/changkun/occamy/server/session.go:65 +0x14c
occamy    |
occamy    | goroutine 212 [semacquire, 3 minutes]:
occamy    | sync.runtime_SemacquireMutex(0xc0001b436c, 0x0, 0x1)
occamy    |     /usr/local/go/src/runtime/sema.go:71 +0x47
occamy    | sync.(*Mutex).lockSlow(0xc0001b4368)
occamy    |     /usr/local/go/src/sync/mutex.go:138 +0xfc
occamy    | sync.(*Mutex).Lock(...)
occamy    |     /usr/local/go/src/sync/mutex.go:81
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc0001b4360, 0xc0000ba160, 0xc0001a5900, 0x8, 0xc00055e638)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:200 +0x3ed
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc0001b4360, 0xc00037e2c0)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:191 +0x464
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00037e2c0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc0001fe120, 0xc00037e2c0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc00037e2c0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00037e2c0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc00037e2c0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x64
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00037e2c0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc00037e2c0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00037e2c0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc0001da3c0, 0xc00037e2c0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b2
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc0001da3c0, 0xc86c40, 0xc00037a7e0, 0xc0000d7600)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x134
occamy    | net/http.serverHandler.ServeHTTP(0xc0002160e0, 0xc86c40, 0xc00037a7e0, 0xc0000d7600)
occamy    |     /usr/local/go/src/net/http/server.go:2802 +0xa4
occamy    | net/http.(*conn).serve(0xc0002ef220, 0xc88640, 0xc000370bc0)
occamy    |     /usr/local/go/src/net/http/server.go:1890 +0x875
occamy    | created by net/http.(*Server).Serve
occamy    |     /usr/local/go/src/net/http/server.go:2927 +0x38e
occamy    |
occamy    | goroutine 211 [semacquire, 3 minutes]:
occamy    | sync.runtime_SemacquireMutex(0xc0001b436c, 0x0, 0x1)
occamy    |     /usr/local/go/src/runtime/sema.go:71 +0x47
occamy    | sync.(*Mutex).lockSlow(0xc0001b4368)
occamy    |     /usr/local/go/src/sync/mutex.go:138 +0xfc
occamy    | sync.(*Mutex).Lock(...)
occamy    |     /usr/local/go/src/sync/mutex.go:81
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc0001b4360, 0xc000457a20, 0xc0001a5740, 0x8, 0xc0005832d8)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:200 +0x3ed
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc0001b4360, 0xc0000b06e0)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:191 +0x464
occamy    | github.com/gin-gonic/gin.(*Context).Next(occamy-lib[140185997338368]: Failed to load guacdr plugin. Drive redirection and printing will not work. Sound MAY not work.
occamy    | 0xc0000b06e0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc0001fe120, 0xc0000b06e0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc0000b06e0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0000b06e0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc0000b06e0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x64
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0000b06e0occamy-lib[140185997338368]: Failed to load guacsnd alongside guacdr plugin. Sound will not work. Drive redirection and printing MAY not work.
occamy    | )
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc0000b06e0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0000b06e0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc0001da3c0, 0xc0000b06e0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b2
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc0001da3c0, 0xc86c40, 0xc00047a7e0, 0xc0000d6300)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x134
occamy    | net/http.serverHandler.ServeHTTP(0xc0002160e0, 0xc86c40, 0xc00047a7e0, 0xc0000d6300)
occamy    |     /usr/local/go/src/net/http/server.go:2802 +0xa4
occamy    | net/http.(*conn).serve(0xc0002ef180, 0xc88640, 0xc000370b80)
occamy    |     /usr/local/go/src/net/http/server.go:1890 +0x875
occamy    | created by net/http.(*Server).Serve
occamy    |     /usr/local/go/src/net/http/server.go:2927 +0x38e
occamy    |
occamy    | goroutine 215 [semacquire, 3 minutes]:
occamy    | sync.runtime_SemacquireMutex(0xc0001b436c, 0x0, 0x1)
occamy    |     /usr/local/go/src/runtime/sema.go:71 +0x47
occamy    | sync.(*Mutex).lockSlow(0xc0001b4368)
occamy    |     /usr/local/go/src/sync/mutex.go:138 +0xfc
occamy    | sync.(*Mutex).Lock(...)
occamy    |     /usr/local/go/src/sync/mutex.go:81
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc0001b4360, 0xc0003182c0, 0xc0002f6780, 0x8, 0xc00055fcc8)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:200 +0x3ed
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc0001b4360, 0xc00037e8f0)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:191 +0x464
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00037e8f0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc0001fe120, 0xc00037e8f0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc00037e8f0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00037e8f0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc00037e8f0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x64
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00037e8f0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc00037e8f0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00037e8f0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc0001da3c0, 0xc00037e8f0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b2
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc0001da3c0, 0xc86c40, 0xc000216460, 0xc0002ac000)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x134
occamy    | net/http.serverHandler.ServeHTTP(0xc0002160e0, 0xc86c40, 0xc000216460, 0xc0002ac000)
occamy    |     /usr/local/go/src/net/http/server.go:2802 +0xa4
occamy    | net/http.(*conn).serve(0xc0002ef400, 0xc88640, 0xc0001a5440)
occamy    |     /usr/local/go/src/net/http/server.go:1890 +0x875
occamy    | created by net/http.(*Server).Serve
occamy    |     /usr/local/go/src/net/http/server.go:2927 +0x38e
occamy    |
occamy    | goroutine 32 [chan receive, 3 minutes]:
occamy    | github.com/changkun/occamy/server.(*Session).serveIO(0xc00046a750, 0xc00036e2e0, 0xc0000bb4a0, 0x4b, 0x0)
occamy    |     /go/src/github.com/changkun/occamy/server/session.go:153 +0x11b
occamy    | github.com/changkun/occamy/server.(*Session).Join(0xc00046a750, 0xc0000bb4a0, 0xc0001a4bc0, 0x0, 0x0, 0x0)
occamy    |     /go/src/github.com/changkun/occamy/server/session.go:99 +0x1bd
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc0001b4360, 0xc0000bb4a0, 0xc0001a4bc0, 0x8, 0xc0000a5708)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:204 +0xe2
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc0001b4360, 0xc0002700b0)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:191 +0x464
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0002700b0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc0001fe120, 0xc0002700b0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc0002700b0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0002700b0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc0002700b0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x64
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0002700b0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc0002700b0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0002700b0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc0001da3c0, 0xc0002700b0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b2
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc0001da3c0, 0xc86c40, 0xc00047a0e0, 0xc0000d6900)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x134
occamy    | net/http.serverHandler.ServeHTTP(0xc0002160e0, 0xc86c40, 0xc00047a0e0, 0xc0000d6900)
occamy    |     /usr/local/go/src/net/http/server.go:2802 +0xa4
occamy    | net/http.(*conn).serve(0xc0001d8500, 0xc88640, 0xc0001a4ac0)
occamy    |     /usr/local/go/src/net/http/server.go:1890 +0x875
occamy    | created by net/http.(*Server).Serve
occamy    |     /usr/local/go/src/net/http/server.go:2927 +0x38e
occamy    |
occamy    | goroutine 33 [runnable, locked to thread]:
occamy    | github.com/changkun/occamy/lib._Cfunc_guac_client_load_plugin(0x7f7fbc000b80, 0x7f7fbc0008c0, 0x0)
occamy    |     _cgo_gotypes.go:352 +0x4d
occamy    | github.com/changkun/occamy/lib.(*Client).LoadProtocolPlugin.func2(0xc00010c5c0, 0x7f7fbc0008c0, 0x7f7fbc0008c0)
occamy    |     /go/src/github.com/changkun/occamy/lib/client.go:115 +0x68
occamy    | github.com/changkun/occamy/lib.(*Client).LoadProtocolPlugin(0xc00010c5c0, 0xc0002f2888, 0x3, 0x0, 0x0)
occamy    |     /go/src/github.com/changkun/occamy/lib/client.go:115 +0x9d
occamy    | github.com/changkun/occamy/server.(*Session).initialize(0xc0004788d0, 0xc0002f2888, 0x3, 0xa5cba0, 0xc00010c5a0)
occamy    |     /go/src/github.com/changkun/occamy/server/session.go:104 +0x72
occamy    | github.com/changkun/occamy/server.NewSession(0xc0002f2888, 0x3, 0xc0000fe6e0, 0x20, 0x12cd4a0)
occamy    |     /go/src/github.com/changkun/occamy/server/session.go:40 +0x119
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc0001b4360, 0xc000476c60, 0xc0002f7380, 0x8, 0xc000469f38)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:208 +0x141
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc0001b4360, 0xc000328160)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:191 +0x464
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000328160)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc0001fe120, 0xc000328160)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc000328160)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000328160)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc000328160)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x64
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000328160)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc000328160)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000328160)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc0001da3c0, 0xc000328160)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b2
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc0001da3c0, 0xc86c40, 0xc000324b60, 0xc000300d00)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x134
occamy    | net/http.serverHandler.ServeHTTP(0xc0002160e0, 0xc86c40, 0xc000324b60, 0xc000300d00)
occamy    |     /usr/local/go/src/net/http/server.go:2802 +0xa4
occamy    | net/http.(*conn).serve(0xc0001d85a0, 0xc88640, 0xc0002f7280)
occamy    |     /usr/local/go/src/net/http/server.go:1890 +0x875
occamy    | created by net/http.(*Server).Serve
occamy    |     /usr/local/go/src/net/http/server.go:2927 +0x38e
occamy    |
occamy    | goroutine 162 [semacquire, 3 minutes]:
occamy    | sync.runtime_SemacquireMutex(0xc0001b436c, 0x0, 0x1)
occamy    |     /usr/local/go/src/runtime/sema.go:71 +0x47
occamy    | sync.(*Mutex).lockSlow(0xc0001b4368)
occamy    |     /usr/local/go/src/sync/mutex.go:138 +0xfc
occamy    | sync.(*Mutex).Lock(...)
occamy    |     /usr/local/go/src/sync/mutex.go:81
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc0001b4360, 0xc0000bba20, 0xc0001a4d00, 0x8, 0xc0000a5bb8)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:200 +0x3ed
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc0001b4360, 0xc0000b04d0)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:191 +0x464
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0000b04d0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc0001fe120, 0xc0000b04d0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc0000b04d0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0000b04d0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc0000b04d0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x64
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0000b04d0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc0000b04d0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0000b04d0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc0001da3c0, 0xc0000b04d0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b2
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc0001da3c0, 0xc86c40, 0xc00047a1c0, 0xc0000d6a00)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x134
occamy    | net/http.serverHandler.ServeHTTP(0xc0002160e0, 0xc86c40, 0xc00047a1c0, 0xc0000d6a00)
occamy    |     /usr/local/go/src/net/http/server.go:2802 +0xa4
occamy    | net/http.(*conn).serve(0xc0001d8640, 0xc88640, 0xc0001a4c00)
occamy    |     /usr/local/go/src/net/http/server.go:1890 +0x875
occamy    | created by net/http.(*Server).Serve
occamy    |     /usr/local/go/src/net/http/server.go:2927 +0x38e
occamy    |
occamy    | goroutine 163 [semacquire, 3 minutes]:
occamy    | sync.runtime_SemacquireMutex(0xc0001b436c, 0x0, 0x1)
occamy    |     /usr/local/go/src/runtime/sema.go:71 +0x47
occamy    | sync.(*Mutex).lockSlow(0xc0001b4368)
occamy    |     /usr/local/go/src/sync/mutex.go:138 +0xfc
occamy    | sync.(*Mutex).Lock(...)
occamy    |     /usr/local/go/src/sync/mutex.go:81
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc0001b4360, 0xc00050f600, 0xc000370c80, 0x8, 0xc000512428)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:200 +0x3ed
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc0001b4360, 0xc0003282c0)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:191 +0x464
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0003282c0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc0001fe120, 0xc0003282c0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc0003282c0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0003282c0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc0003282c0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x64
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0003282c0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc0003282c0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0003282c0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc0001da3c0, 0xc0003282c0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b2
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc0001da3c0, 0xc86c40, 0xc000324c40, 0xc000300e00)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x134
occamy    | net/http.serverHandler.ServeHTTP(0xc0002160e0, 0xc86c40, 0xc000324c40, 0xc000300e00)
occamy    |     /usr/local/go/src/net/http/server.go:2802 +0xa4
occamy    | net/http.(*conn).serve(0xc0001d86e0, 0xc88640, 0xc0002f73c0)
occamy    |     /usr/local/go/src/net/http/server.go:1890 +0x875
occamy    | created by net/http.(*Server).Serve
occamy    |     /usr/local/go/src/net/http/server.go:2927 +0x38e
occamy    |
occamy    | goroutine 164 [semacquire, 3 minutes]:
occamy    | sync.runtime_SemacquireMutex(0xc0001b436c, 0x0, 0x1)
occamy    |     /usr/local/go/src/runtime/sema.go:71 +0x47
occamy    | sync.(*Mutex).lockSlow(0xc0001b4368)
occamy    |     /usr/local/go/src/sync/mutex.go:138 +0xfc
occamy    | sync.(*Mutex).Lock(...)
occamy    |     /usr/local/go/src/sync/mutex.go:81
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc0001b4360, 0xc0004766e0, 0xc0002f7240, 0x8, 0xc000469aa8)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:200 +0x3ed
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc0001b4360, 0xc000328000)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:191 +0x464
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000328000)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc0001fe120, 0xc000328000)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc000328000)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000328000)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc000328000)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x64
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000328000)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc000328000)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000328000)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc0001da3c0, 0xc000328000)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b2
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc0001da3c0, 0xc86c40, 0xc000324a80, 0xc000300c00)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x134
occamy    | net/http.serverHandler.ServeHTTP(0xc0002160e0, 0xc86c40, 0xc000324a80, 0xc000300c00)
occamy    |     /usr/local/go/src/net/http/server.go:2802 +0xa4
occamy    | net/http.(*conn).serve(0xc0001d8780, 0xc88640, 0xc0002f7140)
occamy    |     /usr/local/go/src/net/http/server.go:1890 +0x875
occamy    | created by net/http.(*Server).Serve
occamy    |     /usr/local/go/src/net/http/server.go:2927 +0x38e
occamy    |
occamy    | goroutine 165 [semacquire, 3 minutes]:
occamy    | sync.runtime_SemacquireMutex(0xc0001b436c, 0x0, 0x1)
occamy    |     /usr/local/go/src/runtime/sema.go:71 +0x47
occamy    | sync.(*Mutex).lockSlow(0xc0001b4368)
occamy    |     /usr/local/go/src/sync/mutex.go:138 +0xfc
occamy    | sync.(*Mutex).Lock(...)
occamy    |     /usr/local/go/src/sync/mutex.go:81
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc0001b4360, 0xc0003a1b80, 0xc0001b7c00, 0x8, 0xc000361bb8)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:200 +0x3ed
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc0001b4360, 0xc0002040b0)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:191 +0x464
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0002040b0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc0001fe120, 0xc0002040b0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc0002040b0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0002040b0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc0002040b0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x64
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0002040b0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc0002040b0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0002040b0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc0001da3c0, 0xc0002040b0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b2
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc0001da3c0, 0xc86c40, 0xc000216a80, 0xc0001bb600)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x134
occamy    | net/http.serverHandler.ServeHTTP(0xc0002160e0, 0xc86c40, 0xc000216a80, 0xc0001bb600)
occamy    |     /usr/local/go/src/net/http/server.go:2802 +0xa4
occamy    | net/http.(*conn).serve(0xc0001d8820, 0xc88640, 0xc0001b7b00)
occamy    |     /usr/local/go/src/net/http/server.go:1890 +0x875
occamy    | created by net/http.(*Server).Serve
occamy    |     /usr/local/go/src/net/http/server.go:2927 +0x38e
occamy    |
occamy    | goroutine 166 [semacquire, 3 minutes]:
occamy    | sync.runtime_SemacquireMutex(0xc0001b436c, 0x0, 0x1)
occamy    |     /usr/local/go/src/runtime/sema.go:71 +0x47
occamy    | sync.(*Mutex).lockSlow(0xc0001b4368)
occamy    |     /usr/local/go/src/sync/mutex.go:138 +0xfc
occamy    | sync.(*Mutex).Lock(...)
occamy    |     /usr/local/go/src/sync/mutex.go:81
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc0001b4360, 0xc00050e160, 0xc0001b7d40, 0x8, 0xc0005100c8)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:200 +0x3ed
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc0001b4360, 0xc000204210)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:191 +0x464
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000204210)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc0001fe120, 0xc000204210)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc000204210)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000204210)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc000204210)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x64
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000204210)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc000204210)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000204210)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc0001da3c0, 0xc000204210)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b2
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc0001da3c0, 0xc86c40, 0xc000216b60, 0xc0001bb700)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x134
occamy    | net/http.serverHandler.ServeHTTP(0xc0002160e0, 0xc86c40, 0xc000216b60, 0xc0001bb700)
occamy    |     /usr/local/go/src/net/http/server.go:2802 +0xa4
occamy    | net/http.(*conn).serve(0xc0001d88c0, 0xc88640, 0xc0001b7c40)
occamy    |     /usr/local/go/src/net/http/server.go:1890 +0x875
occamy    | created by net/http.(*Server).Serve
occamy    |     /usr/local/go/src/net/http/server.go:2927 +0x38e
occamy    |
occamy    | goroutine 167 [semacquire, 3 minutes]:
occamy    | sync.runtime_SemacquireMutex(0xc0001b436c, 0x0, 0x1)
occamy    |     /usr/local/go/src/runtime/sema.go:71 +0x47
occamy    | sync.(*Mutex).lockSlow(0xc0001b4368)
occamy    |     /usr/local/go/src/sync/mutex.go:138 +0xfc
occamy    | sync.(*Mutex).Lock(...)
occamy    |     /usr/local/go/src/sync/mutex.go:81
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc0001b4360, 0xc00050e6e0, 0xc0001b7e80, 0x8, 0xc000510528)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:200 +0x3ed
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc0001b4360, 0xc000204370)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:191 +0x464
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000204370)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc0001fe120, 0xc000204370)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc000204370)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000204370)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc000204370)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x64
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000204370)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc000204370)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000204370)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc0001da3c0, 0xc000204370)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b2
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc0001da3c0, 0xc86c40, 0xc000216c40, 0xc0001bb800)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x134
occamy    | net/http.serverHandler.ServeHTTP(0xc0002160e0, 0xc86c40, 0xc000216c40, 0xc0001bb800)
occamy    |     /usr/local/go/src/net/http/server.go:2802 +0xa4
occamy    | net/http.(*conn).serve(0xc0001d8960, 0xc88640, 0xc0001b7d80)
occamy    |     /usr/local/go/src/net/http/server.go:1890 +0x875
occamy    | created by net/http.(*Server).Serve
occamy    |     /usr/local/go/src/net/http/server.go:2927 +0x38e
occamy    |
occamy    | goroutine 168 [semacquire, 3 minutes]:
occamy    | sync.runtime_SemacquireMutex(0xc0001b436c, 0x0, 0x1)
occamy    |     /usr/local/go/src/runtime/sema.go:71 +0x47
occamy    | sync.(*Mutex).lockSlow(0xc0001b4368)
occamy    |     /usr/local/go/src/sync/mutex.go:138 +0xfc
occamy    | sync.(*Mutex).Lock(...)
occamy    |     /usr/local/go/src/sync/mutex.go:81
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc0001b4360, 0xc00050f4a0, 0xc0005362c0, 0x8, 0xc000510988)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:200 +0x3ed
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc0001b4360, 0xc0002044d0)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:191 +0x464
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0002044d0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc0001fe120, 0xc0002044d0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc0002044d0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0002044d0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc0002044d0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x64
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0002044d0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc0002044d0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0002044d0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc0001da3c0, 0xc0002044d0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b2
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc0001da3c0, 0xc86c40, 0xc000216d20, 0xc0001bb900)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x134
occamy    | net/http.serverHandler.ServeHTTP(0xc0002160e0, 0xc86c40, 0xc000216d20, 0xc0001bb900)
occamy    |     /usr/local/go/src/net/http/server.go:2802 +0xa4
occamy    | net/http.(*conn).serve(0xc0001d8a00, 0xc88640, 0xc0001b7ec0)
occamy    |     /usr/local/go/src/net/http/server.go:1890 +0x875
occamy    | created by net/http.(*Server).Serve
occamy    |     /usr/local/go/src/net/http/server.go:2927 +0x38e
occamy    |
occamy    | goroutine 169 [semacquire, 3 minutes]:
occamy    | sync.runtime_SemacquireMutex(0xc0001b436c, 0x0, 0x1)
occamy    |     /usr/local/go/src/runtime/sema.go:71 +0x47
occamy    | sync.(*Mutex).lockSlow(0xc0001b4368)
occamy    |     /usr/local/go/src/sync/mutex.go:138 +0xfc
occamy    | sync.(*Mutex).Lock(...)
occamy    |     /usr/local/go/src/sync/mutex.go:81
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc0001b4360, 0xc00053cdc0, 0xc0001a5500, 0x8, 0xc000431198)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:200 +0x3ed
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc0001b4360, 0xc0002706e0)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:191 +0x464
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0002706e0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc0001fe120, 0xc0002706e0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc0002706e0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0002706e0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc0002706e0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x64
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0002706e0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc0002706e0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0002706e0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc0001da3c0, 0xc0002706e0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b2
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc0001da3c0, 0xc86c40, 0xc00026d5e0, 0xc0001bba00)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x134
occamy    | net/http.serverHandler.ServeHTTP(0xc0002160e0, 0xc86c40, 0xc00026d5e0, 0xc0001bba00)
occamy    |     /usr/local/go/src/net/http/server.go:2802 +0xa4
occamy    | net/http.(*conn).serve(0xc0001d8aa0, 0xc88640, 0xc0001b7fc0)
occamy    |     /usr/local/go/src/net/http/server.go:1890 +0x875
occamy    | created by net/http.(*Server).Serve
occamy    |     /usr/local/go/src/net/http/server.go:2927 +0x38e
occamy    |
occamy    | goroutine 170 [semacquire, 3 minutes]:
occamy    | sync.runtime_SemacquireMutex(0xc0001b436c, 0x0, 0x1)
occamy    |     /usr/local/go/src/runtime/sema.go:71 +0x47
occamy    | sync.(*Mutex).lockSlow(0xc0001b4368)
occamy    |     /usr/local/go/src/sync/mutex.go:138 +0xfc
occamy    | sync.(*Mutex).Lock(...)
occamy    |     /usr/local/go/src/sync/mutex.go:81
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc0001b4360, 0xc000318580, 0xc0002f6880, 0x8, 0xc000511ca8)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:200 +0x3ed
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc0001b4360, 0xc000418160)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:191 +0x464
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000418160)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc0001fe120, 0xc000418160)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc000418160)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000418160)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc000418160)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x64
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000418160)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc000418160)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000418160)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc0001da3c0, 0xc000418160)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b2
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc0001da3c0, 0xc86c40, 0xc0004149a0, 0xc000534100)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x134
occamy    | net/http.serverHandler.ServeHTTP(0xc0002160e0, 0xc86c40, 0xc0004149a0, 0xc000534100)
occamy    |     /usr/local/go/src/net/http/server.go:2802 +0xa4
occamy    | net/http.(*conn).serve(0xc0001d8b40, 0xc88640, 0xc00029ed00)
occamy    |     /usr/local/go/src/net/http/server.go:1890 +0x875
occamy    | created by net/http.(*Server).Serve
occamy    |     /usr/local/go/src/net/http/server.go:2927 +0x38e
occamy    |
occamy    | goroutine 171 [semacquire, 3 minutes]:
occamy    | sync.runtime_SemacquireMutex(0xc0001b436c, 0x0, 0x1)
occamy    |     /usr/local/go/src/runtime/sema.go:71 +0x47
occamy    | sync.(*Mutex).lockSlow(0xc0001b4368)
occamy    |     /usr/local/go/src/sync/mutex.go:138 +0xfc
occamy    | sync.(*Mutex).Lock(...)
occamy    |     /usr/local/go/src/sync/mutex.go:81
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc0001b4360, 0xc000318160, 0xc0002f6740, 0x8, 0xc0000a53e8)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:200 +0x3ed
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc0001b4360, 0xc000328580)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:191 +0x464
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000328580)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc0001fe120, 0xc000328580)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc000328580)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000328580)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc000328580)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x64
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000328580)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc000328580)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000328580)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc0001da3c0, 0xc000328580)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b2
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc0001da3c0, 0xc86c40, 0xc000324e00, 0xc000301000)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x134
occamy    | net/http.serverHandler.ServeHTTP(0xc0002160e0, 0xc86c40, 0xc000324e00, 0xc000301000)
occamy    |     /usr/local/go/src/net/http/server.go:2802 +0xa4
occamy    | net/http.(*conn).serve(0xc0001d8be0, 0xc88640, 0xc0002f75c0)
occamy    |     /usr/local/go/src/net/http/server.go:1890 +0x875
occamy    | created by net/http.(*Server).Serve
occamy    |     /usr/local/go/src/net/http/server.go:2927 +0x38e
occamy    |
occamy    | goroutine 172 [semacquire, 3 minutes]:
occamy    | sync.runtime_SemacquireMutex(0xc0001b436c, 0x0, 0x1)
occamy    |     /usr/local/go/src/runtime/sema.go:71 +0x47
occamy    | sync.(*Mutex).lockSlow(0xc0001b4368)
occamy    |     /usr/local/go/src/sync/mutex.go:138 +0xfc
occamy    | sync.(*Mutex).Lock(...)
occamy    |     /usr/local/go/src/sync/mutex.go:81
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc0001b4360, 0xc00053ef20, 0xc00029e200, 0x8, 0xc000512e08)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:200 +0x3ed
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc0001b4360, 0xc0003286e0)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:191 +0x464
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0003286e0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc0001fe120, 0xc0003286e0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc0003286e0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0003286e0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc0003286e0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x64
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0003286e0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc0003286e0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0003286e0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc0001da3c0, 0xc0003286e0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b2
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc0001da3c0, 0xc86c40, 0xc000324ee0, 0xc000301100)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x134
occamy    | net/http.serverHandler.ServeHTTP(0xc0002160e0, 0xc86c40, 0xc000324ee0, 0xc000301100)
occamy    |     /usr/local/go/src/net/http/server.go:2802 +0xa4
occamy    | net/http.(*conn).serve(0xc0001d8c80, 0xc88640, 0xc0002f7680)
occamy    |     /usr/local/go/src/net/http/server.go:1890 +0x875
occamy    | created by net/http.(*Server).Serve
occamy    |     /usr/local/go/src/net/http/server.go:2927 +0x38e
occamy    |
occamy    | goroutine 173 [semacquire, 3 minutes]:
occamy    | sync.runtime_SemacquireMutex(0xc0001b436c, 0x0, 0x1)
occamy    |     /usr/local/go/src/runtime/sema.go:71 +0x47
occamy    | sync.(*Mutex).lockSlow(0xc0001b4368)
occamy    |     /usr/local/go/src/sync/mutex.go:138 +0xfc
occamy    | sync.(*Mutex).Lock(...)
occamy    |     /usr/local/go/src/sync/mutex.go:81
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc0001b4360, 0xc00050eb00, 0xc0002f61c0, 0x8, 0xc000510788)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:200 +0x3ed
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc0001b4360, 0xc0004180b0)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:191 +0x464
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0004180b0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc0001fe120, 0xc0004180b0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc0004180b0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0004180b0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc0004180b0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x64
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0004180b0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc0004180b0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0004180b0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc0001da3c0, 0xc0004180b0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b2
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc0001da3c0, 0xc86c40, 0xc00037a000, 0xc0003c4000)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x134
occamy    | net/http.serverHandler.ServeHTTP(0xc0002160e0, 0xc86c40, 0xc00037a000, 0xc0003c4000)
occamy    |     /usr/local/go/src/net/http/server.go:2802 +0xa4
occamy    | net/http.(*conn).serve(0xc0001d8d20, 0xc88640, 0xc00025bf80)
occamy    |     /usr/local/go/src/net/http/server.go:1890 +0x875
occamy    | created by net/http.(*Server).Serve
occamy    |     /usr/local/go/src/net/http/server.go:2927 +0x38e
occamy    |
occamy    | goroutine 174 [semacquire, 3 minutes]:
occamy    | sync.runtime_SemacquireMutex(0xc0001b436c, 0x0, 0x1)
occamy    |     /usr/local/go/src/runtime/sema.go:71 +0x47
occamy    | sync.(*Mutex).lockSlow(0xc0001b4368)
occamy    |     /usr/local/go/src/sync/mutex.go:138 +0xfc
occamy    | sync.(*Mutex).Lock(...)
occamy    |     /usr/local/go/src/sync/mutex.go:81
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc0001b4360, 0xc000456420, 0xc0001a4a40, 0x8, 0xc0005829b8)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:200 +0x3ed
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc0001b4360, 0xc0000b02c0)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:191 +0x464
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0000b02c0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc0001fe120, 0xc0000b02c0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc0000b02c0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0000b02c0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc0000b02c0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x64
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0000b02c0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc0000b02c0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0000b02c0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc0001da3c0, 0xc0000b02c0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b2
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc0001da3c0, 0xc86c40, 0xc00047a000, 0xc0000d6100)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x134
occamy    | net/http.serverHandler.ServeHTTP(0xc0002160e0, 0xc86c40, 0xc00047a000, 0xc0000d6100)
occamy    |     /usr/local/go/src/net/http/server.go:2802 +0xa4
occamy    | net/http.(*conn).serve(0xc0001d8dc0, 0xc88640, 0xc000580000)
occamy    |     /usr/local/go/src/net/http/server.go:1890 +0x875
occamy    | created by net/http.(*Server).Serve
occamy    |     /usr/local/go/src/net/http/server.go:2927 +0x38e
occamy    |
occamy    | goroutine 175 [semacquire, 3 minutes]:
occamy    | sync.runtime_SemacquireMutex(0xc0001b436c, 0x0, 0x1)
occamy    |     /usr/local/go/src/runtime/sema.go:71 +0x47
occamy    | sync.(*Mutex).lockSlow(0xc0001b4368)
occamy    |     /usr/local/go/src/sync/mutex.go:138 +0xfc
occamy    | sync.(*Mutex).Lock(...)
occamy    |     /usr/local/go/src/sync/mutex.go:81
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc0001b4360, 0xc00053c420, 0xc000370000, 0x8, 0xc000512898)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:200 +0x3ed
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc0001b4360, 0xc000328420)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:191 +0x464
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000328420)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc0001fe120, 0xc000328420)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc000328420)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000328420)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc000328420)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x64
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000328420)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc000328420)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000328420)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc0001da3c0, 0xc000328420)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b2
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc0001da3c0, 0xc86c40, 0xc000324d20, 0xc000300f00)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x134
occamy    | net/http.serverHandler.ServeHTTP(0xc0002160e0, 0xc86c40, 0xc000324d20, 0xc000300f00)
occamy    |     /usr/local/go/src/net/http/server.go:2802 +0xa4
occamy    | net/http.(*conn).serve(0xc0001d8e60, 0xc88640, 0xc0002f7480)
occamy    |     /usr/local/go/src/net/http/server.go:1890 +0x875
occamy    | created by net/http.(*Server).Serve
occamy    |     /usr/local/go/src/net/http/server.go:2927 +0x38e
occamy    |
occamy    | goroutine 176 [chan receive, 3 minutes]:
occamy    | github.com/changkun/occamy/server.(*Session).serveIO(0xc00046a450, 0xc0004c47c0, 0xc00053e580, 0x47, 0x0)
occamy    |     /go/src/github.com/changkun/occamy/server/session.go:153 +0x11b
occamy    | github.com/changkun/occamy/server.(*Session).Join(0xc00046a450, 0xc00053e580, 0xc00029e080, 0x0, 0x0, 0x0)
occamy    |     /go/src/github.com/changkun/occamy/server/session.go:99 +0x1bd
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc0001b4360, 0xc00053e580, 0xc00029e080, 0x8, 0xc00055eaa8)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:204 +0xe2
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc0001b4360, 0xc0004182c0)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:191 +0x464
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0004182c0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc0001fe120, 0xc0004182c0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc0004182c0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0004182c0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc0004182c0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x64
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0004182c0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc0004182c0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0004182c0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc0001da3c0, 0xc0004182c0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b2
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc0001da3c0, 0xc86c40, 0xc000414a80, 0xc000534200)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x134
occamy    | net/http.serverHandler.ServeHTTP(0xc0002160e0, 0xc86c40, 0xc000414a80, 0xc000534200)
occamy    |     /usr/local/go/src/net/http/server.go:2802 +0xa4
occamy    | net/http.(*conn).serve(0xc0001d8f00, 0xc88640, 0xc00029edc0)
occamy    |     /usr/local/go/src/net/http/server.go:1890 +0x875
occamy    | created by net/http.(*Server).Serve
occamy    |     /usr/local/go/src/net/http/server.go:2927 +0x38e
occamy    |
occamy    | goroutine 177 [semacquire, 3 minutes]:
occamy    | sync.runtime_SemacquireMutex(0xc0001b436c, 0x0, 0x1)
occamy    |     /usr/local/go/src/runtime/sema.go:71 +0x47
occamy    | sync.(*Mutex).lockSlow(0xc0001b4368)
occamy    |     /usr/local/go/src/sync/mutex.go:138 +0xfc
occamy    | sync.(*Mutex).Lock(...)
occamy    |     /usr/local/go/src/sync/mutex.go:81
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc0001b4360, 0xc0002766e0, 0xc00029e5c0, 0x8, 0xc00031d718)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:200 +0x3ed
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc0001b4360, 0xc000418370)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:191 +0x464
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000418370)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc0001fe120, 0xc000418370)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc000418370)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000418370)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc000418370)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x64
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000418370)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc000418370)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000418370)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc0001da3c0, 0xc000418370)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b2
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc0001da3c0, 0xc86c40, 0xc000414b60, 0xc000534300)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x134
occamy    | net/http.serverHandler.ServeHTTP(0xc0002160e0, 0xc86c40, 0xc000414b60, 0xc000534300)
occamy    |     /usr/local/go/src/net/http/server.go:2802 +0xa4
occamy    | net/http.(*conn).serve(0xc0001d8fa0, 0xc88640, 0xc00029eec0)
occamy    |     /usr/local/go/src/net/http/server.go:1890 +0x875
occamy    | created by net/http.(*Server).Serve
occamy    |     /usr/local/go/src/net/http/server.go:2927 +0x38e
occamy    |
occamy    | goroutine 178 [semacquire, 3 minutes]:
occamy    | sync.runtime_SemacquireMutex(0xc0001b436c, 0x0, 0x1)
occamy    |     /usr/local/go/src/runtime/sema.go:71 +0x47
occamy    | sync.(*Mutex).lockSlow(0xc0001b4368)
occamy    |     /usr/local/go/src/sync/mutex.go:138 +0xfc
occamy    | sync.(*Mutex).Lock(...)
occamy    |     /usr/local/go/src/sync/mutex.go:81
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc0001b4360, 0xc000276dc0, 0xc00029e6c0, 0x8, 0xc00031dba8)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:200 +0x3ed
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc0001b4360, 0xc0004184d0)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:191 +0x464
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0004184d0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc0001fe120, 0xc0004184d0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc0004184d0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0004184d0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc0004184d0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x64
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0004184d0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc0004184d0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0004184d0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc0001da3c0, 0xc0004184d0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b2
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc0001da3c0, 0xc86c40, 0xc000414c40, 0xc000534400)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x134
occamy    | net/http.serverHandler.ServeHTTP(0xc0002160e0, 0xc86c40, 0xc000414c40, 0xc000534400)
occamy    |     /usr/local/go/src/net/http/server.go:2802 +0xa4
occamy    | net/http.(*conn).serve(0xc0001d9040, 0xc88640, 0xc00029f000)
occamy    |     /usr/local/go/src/net/http/server.go:1890 +0x875
occamy    | created by net/http.(*Server).Serve
occamy    |     /usr/local/go/src/net/http/server.go:2927 +0x38e
occamy    |
occamy    | goroutine 179 [semacquire, 3 minutes]:
occamy    | sync.runtime_SemacquireMutex(0xc0001b436c, 0x0, 0x1)
occamy    |     /usr/local/go/src/runtime/sema.go:71 +0x47
occamy    | sync.(*Mutex).lockSlow(0xc0001b4368)
occamy    |     /usr/local/go/src/sync/mutex.go:138 +0xfc
occamy    | sync.(*Mutex).Lock(...)
occamy    |     /usr/local/go/src/sync/mutex.go:81
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc0001b4360, 0xc00053c840, 0xc000370100, 0x8, 0xc0005820b8)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:200 +0x3ed
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc0001b4360, 0xc000418630)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:191 +0x464
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000418630)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc0001fe120, 0xc000418630)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc000418630)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000418630)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc000418630)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x64
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000418630)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc000418630)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000418630)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc0001da3c0, 0xc000418630)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b2
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc0001da3c0, 0xc86c40, 0xc000414d20, 0xc000534500)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x134
occamy    | net/http.serverHandler.ServeHTTP(0xc0002160e0, 0xc86c40, 0xc000414d20, 0xc000534500)
occamy    |     /usr/local/go/src/net/http/server.go:2802 +0xa4
occamy    | net/http.(*conn).serve(0xc0001d90e0, 0xc88640, 0xc00029f0c0)
occamy    |     /usr/local/go/src/net/http/server.go:1890 +0x875
occamy    | created by net/http.(*Server).Serve
occamy    |     /usr/local/go/src/net/http/server.go:2927 +0x38e
occamy    |
occamy    | goroutine 180 [semacquire, 3 minutes]:
occamy    | sync.runtime_SemacquireMutex(0xc0001b436c, 0x0, 0x1)
occamy    |     /usr/local/go/src/runtime/sema.go:71 +0x47
occamy    | sync.(*Mutex).lockSlow(0xc0001b4368)
occamy    |     /usr/local/go/src/sync/mutex.go:138 +0xfc
occamy    | sync.(*Mutex).Lock(...)
occamy    |     /usr/local/go/src/sync/mutex.go:81
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc0001b4360, 0xc00050fe40, 0xc0002f66c0, 0x8, 0xc000511988)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:200 +0x3ed
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc0001b4360, 0xc0004186e0)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:191 +0x464
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0004186e0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc0001fe120, 0xc0004186e0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc0004186e0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0004186e0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc0004186e0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x64
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0004186e0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc0004186e0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0004186e0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc0001da3c0, 0xc0004186e0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b2
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc0001da3c0, 0xc86c40, 0xc00037a1c0, 0xc0003c4300)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x134
occamy    | net/http.serverHandler.ServeHTTP(0xc0002160e0, 0xc86c40, 0xc00037a1c0, 0xc0003c4300)
occamy    |     /usr/local/go/src/net/http/server.go:2802 +0xa4
occamy    | net/http.(*conn).serve(0xc0001d9180, 0xc88640, 0xc0002f7780)
occamy    |     /usr/local/go/src/net/http/server.go:1890 +0x875
occamy    | created by net/http.(*Server).Serve
occamy    |     /usr/local/go/src/net/http/server.go:2927 +0x38e
occamy    |
occamy    | goroutine 181 [semacquire, 3 minutes]:
occamy    | sync.runtime_SemacquireMutex(0xc0001b436c, 0x0, 0x1)
occamy    |     /usr/local/go/src/runtime/sema.go:71 +0x47
occamy    | sync.(*Mutex).lockSlow(0xc0001b4368)
occamy    |     /usr/local/go/src/sync/mutex.go:138 +0xfc
occamy    | sync.(*Mutex).Lock(...)
occamy    |     /usr/local/go/src/sync/mutex.go:81
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc0001b4360, 0xc0005ba2c0, 0xc0002f7880, 0x8, 0xc0005132a8)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:200 +0x3ed
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc0001b4360, 0xc000328840)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:191 +0x464
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000328840)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc0001fe120, 0xc000328840)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc000328840)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000328840)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc000328840)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x64
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000328840)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc000328840)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000328840)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc0001da3c0, 0xc000328840)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b2
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc0001da3c0, 0xc86c40, 0xc000324fc0, 0xc000534000)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x134
occamy    | net/http.serverHandler.ServeHTTP(0xc0002160e0, 0xc86c40, 0xc000324fc0, 0xc000534000)
occamy    |     /usr/local/go/src/net/http/server.go:2802 +0xa4
occamy    | net/http.(*conn).serve(0xc0001d9220, 0xc88640, 0xc00029ecc0)
occamy    |     /usr/local/go/src/net/http/server.go:1890 +0x875
occamy    | created by net/http.(*Server).Serve
occamy    |     /usr/local/go/src/net/http/server.go:2927 +0x38e
occamy    |
occamy    | goroutine 182 [semacquire, 3 minutes]:
occamy    | sync.runtime_SemacquireMutex(0xc0001b436c, 0x0, 0x1)
occamy    |     /usr/local/go/src/runtime/sema.go:71 +0x47
occamy    | sync.(*Mutex).lockSlow(0xc0001b4368)
occamy    |     /usr/local/go/src/sync/mutex.go:138 +0xfc
occamy    | sync.(*Mutex).Lock(...)
occamy    |     /usr/local/go/src/sync/mutex.go:81
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc0001b4360, 0xc000276580, 0xc00029e580, 0x8, 0xc000510e58)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:200 +0x3ed
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc0001b4360, 0xc000204630)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:191 +0x464
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000204630)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc0001fe120, 0xc000204630)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc000204630)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000204630)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc000204630)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x64
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000204630)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc000204630)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000204630)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc0001da3c0, 0xc000204630)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b2
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc0001da3c0, 0xc86c40, 0xc000216e00, 0xc0001bbb00)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x134
occamy    | net/http.serverHandler.ServeHTTP(0xc0002160e0, 0xc86c40, 0xc000216e00, 0xc0001bbb00)
occamy    |     /usr/local/go/src/net/http/server.go:2802 +0xa4
occamy    | net/http.(*conn).serve(0xc0001d92c0, 0xc88640, 0xc000536040)
occamy    |     /usr/local/go/src/net/http/server.go:1890 +0x875
occamy    | created by net/http.(*Server).Serve
occamy    |     /usr/local/go/src/net/http/server.go:2927 +0x38e
occamy    |
occamy    | goroutine 183 [semacquire, 3 minutes]:
occamy    | sync.runtime_SemacquireMutex(0xc0001b436c, 0x0, 0x1)
occamy    |     /usr/local/go/src/runtime/sema.go:71 +0x47
occamy    | sync.(*Mutex).lockSlow(0xc0001b4368)
occamy    |     /usr/local/go/src/sync/mutex.go:138 +0xfc
occamy    | sync.(*Mutex).Lock(...)
occamy    |     /usr/local/go/src/sync/mutex.go:81
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc0001b4360, 0xc00053d080, 0xc000370240, 0x8, 0xc00053ace8)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:200 +0x3ed
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc0001b4360, 0xc000270160)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:191 +0x464
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000270160)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc0001fe120, 0xc000270160)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc000270160)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000270160)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc000270160)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x64
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000270160)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc000270160)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000270160)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc0001da3c0, 0xc000270160)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b2
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc0001da3c0, 0xc86c40, 0xc00026c000, 0xc000548000)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x134
occamy    | net/http.serverHandler.ServeHTTP(0xc0002160e0, 0xc86c40, 0xc00026c000, 0xc000548000)
occamy    |     /usr/local/go/src/net/http/server.go:2802 +0xa4
occamy    | net/http.(*conn).serve(0xc0001d9360, 0xc88640, 0xc00025bcc0)
occamy    |     /usr/local/go/src/net/http/server.go:1890 +0x875
occamy    | created by net/http.(*Server).Serve
occamy    |     /usr/local/go/src/net/http/server.go:2927 +0x38e
occamy    |
occamy    | goroutine 184 [semacquire, 3 minutes]:
occamy    | sync.runtime_SemacquireMutex(0xc0001b436c, 0x0, 0x1)
occamy    |     /usr/local/go/src/runtime/sema.go:71 +0x47
occamy    | sync.(*Mutex).lockSlow(0xc0001b4368)
occamy    |     /usr/local/go/src/sync/mutex.go:138 +0xfc
occamy    | sync.(*Mutex).Lock(...)
occamy    |     /usr/local/go/src/sync/mutex.go:81
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc0001b4360, 0xc000277340, 0xc00029e800, 0x8, 0xc0001fee18)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:200 +0x3ed
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc0001b4360, 0xc00037ec60)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:191 +0x464
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00037ec60)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc0001fe120, 0xc00037ec60)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc00037ec60)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00037ec60)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc00037ec60)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x64
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00037ec60)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc00037ec60)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00037ec60)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc0001da3c0, 0xc00037ec60)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b2
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc0001da3c0, 0xc86c40, 0xc000216620, 0xc00025e200)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x134
occamy    | net/http.serverHandler.ServeHTTP(0xc0002160e0, 0xc86c40, 0xc000216620, 0xc00025e200)
occamy    |     /usr/local/go/src/net/http/server.go:2802 +0xa4
occamy    | net/http.(*conn).serve(0xc0001d9400, 0xc88640, 0xc00025bd00)
occamy    |     /usr/local/go/src/net/http/server.go:1890 +0x875
occamy    | created by net/http.(*Server).Serve
occamy    |     /usr/local/go/src/net/http/server.go:2927 +0x38e
occamy    |
occamy    | goroutine 185 [semacquire, 3 minutes]:
occamy    | sync.runtime_SemacquireMutex(0xc0001b436c, 0x0, 0x1)
occamy    |     /usr/local/go/src/runtime/sema.go:71 +0x47
occamy    | sync.(*Mutex).lockSlow(0xc0001b4368)
occamy    |     /usr/local/go/src/sync/mutex.go:138 +0xfc
occamy    | sync.(*Mutex).Lock(...)
occamy    |     /usr/local/go/src/sync/mutex.go:81
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc0001b4360, 0xc000551b80, 0xc000580580, 0x8, 0xc0000a4678)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:200 +0x3ed
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc0001b4360, 0xc0002704d0)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:191 +0x464
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0002704d0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc0001fe120, 0xc0002704d0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc0002704d0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0002704d0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc0002704d0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x64
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0002704d0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc0002704d0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0002704d0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc0001da3c0, 0xc0002704d0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b2
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc0001da3c0, 0xc86c40, 0xc00026d420, 0xc000548100)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x134
occamy    | net/http.serverHandler.ServeHTTP(0xc0002160e0, 0xc86c40, 0xc00026d420, 0xc000548100)
occamy    |     /usr/local/go/src/net/http/server.go:2802 +0xa4
occamy    | net/http.(*conn).serve(0xc0001d94a0, 0xc88640, 0xc00025bd40)
occamy    |     /usr/local/go/src/net/http/server.go:1890 +0x875
occamy    | created by net/http.(*Server).Serve
occamy    |     /usr/local/go/src/net/http/server.go:2927 +0x38e
occamy    |
occamy    | goroutine 186 [semacquire, 3 minutes]:
occamy    | sync.runtime_SemacquireMutex(0xc0001b436c, 0x0, 0x1)
occamy    |     /usr/local/go/src/runtime/sema.go:71 +0x47
occamy    | sync.(*Mutex).lockSlow(0xc0001b4368)
occamy    |     /usr/local/go/src/sync/mutex.go:138 +0xfc
occamy    | sync.(*Mutex).Lock(...)
occamy    |     /usr/local/go/src/sync/mutex.go:81
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc0001b4360, 0xc0005ba420, 0xc000536100, 0x8, 0xc000430ce8)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:200 +0x3ed
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc0001b4360, 0xc000270580)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:191 +0x464
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000270580)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc0001fe120, 0xc000270580)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc000270580)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000270580)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc000270580)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x64
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000270580)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc000270580)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000270580)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc0001da3c0, 0xc000270580)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b2
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc0001da3c0, 0xc86c40, 0xc00026d500, 0xc000548200)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x134
occamy    | net/http.serverHandler.ServeHTTP(0xc0002160e0, 0xc86c40, 0xc00026d500, 0xc000548200)
occamy    |     /usr/local/go/src/net/http/server.go:2802 +0xa4
occamy    | net/http.(*conn).serve(0xc0001d9540, 0xc88640, 0xc00025be40)
occamy    |     /usr/local/go/src/net/http/server.go:1890 +0x875
occamy    | created by net/http.(*Server).Serve
occamy    |     /usr/local/go/src/net/http/server.go:2927 +0x38e
occamy    |
occamy    | goroutine 187 [semacquire, 3 minutes]:
occamy    | sync.runtime_SemacquireMutex(0xc0001b436c, 0x0, 0x1)
occamy    |     /usr/local/go/src/runtime/sema.go:71 +0x47
occamy    | sync.(*Mutex).lockSlow(0xc0001b4368)
occamy    |     /usr/local/go/src/sync/mutex.go:138 +0xfc
occamy    | sync.(*Mutex).Lock(...)
occamy    |     /usr/local/go/src/sync/mutex.go:81
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc0001b4360, 0xc00053f340, 0xc00029f340, 0x8, 0xc000430898)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:200 +0x3ed
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc0001b4360, 0xc000270370)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:191 +0x464
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000270370)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc0001fe120, 0xc000270370)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc000270370)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000270370)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc000270370)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x64
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000270370)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc000270370)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000270370)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc0001da3c0, 0xc000270370)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b2
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc0001da3c0, 0xc86c40, 0xc00026d340, 0xc00025ff00)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x134
occamy    | net/http.serverHandler.ServeHTTP(0xc0002160e0, 0xc86c40, 0xc00026d340, 0xc00025ff00)
occamy    |     /usr/local/go/src/net/http/server.go:2802 +0xa4
occamy    | net/http.(*conn).serve(0xc0001d95e0, 0xc88640, 0xc00025bc00)
occamy    |     /usr/local/go/src/net/http/server.go:1890 +0x875
occamy    | created by net/http.(*Server).Serve
occamy    |     /usr/local/go/src/net/http/server.go:2927 +0x38e
occamy    |
occamy    | goroutine 188 [semacquire, 3 minutes]:
occamy    | sync.runtime_SemacquireMutex(0xc0001b436c, 0x0, 0x1)
occamy    |     /usr/local/go/src/runtime/sema.go:71 +0x47
occamy    | sync.(*Mutex).lockSlow(0xc0001b4368)
occamy    |     /usr/local/go/src/sync/mutex.go:138 +0xfc
occamy    | sync.(*Mutex).Lock(...)
occamy    |     /usr/local/go/src/sync/mutex.go:81
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc0001b4360, 0xc00050edc0, 0xc0002f6280, 0x8, 0xc000511078)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:200 +0x3ed
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc0001b4360, 0xc000204790)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:191 +0x464
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000204790)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc0001fe120, 0xc000204790)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc000204790)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000204790)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc000204790)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x64
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000204790)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc000204790)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000204790)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc0001da3c0, 0xc000204790)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b2
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc0001da3c0, 0xc86c40, 0xc000216ee0, 0xc0001bbc00)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x134
occamy    | net/http.serverHandler.ServeHTTP(0xc0002160e0, 0xc86c40, 0xc000216ee0, 0xc0001bbc00)
occamy    |     /usr/local/go/src/net/http/server.go:2802 +0xa4
occamy    | net/http.(*conn).serve(0xc0001d9680, 0xc88640, 0xc000536140)
occamy    |     /usr/local/go/src/net/http/server.go:1890 +0x875
occamy    | created by net/http.(*Server).Serve
occamy    |     /usr/local/go/src/net/http/server.go:2927 +0x38e
occamy    |
occamy    | goroutine 189 [semacquire, 3 minutes]:
occamy    | sync.runtime_SemacquireMutex(0xc0001b436c, 0x0, 0x1)
occamy    |     /usr/local/go/src/runtime/sema.go:71 +0x47
occamy    | sync.(*Mutex).lockSlow(0xc0001b4368)
occamy    |     /usr/local/go/src/sync/mutex.go:138 +0xfc
occamy    | sync.(*Mutex).Lock(...)
occamy    |     /usr/local/go/src/sync/mutex.go:81
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc0001b4360, 0xc0005baf20, 0xc000536580, 0x8, 0xc0004313e8)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:200 +0x3ed
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc0001b4360, 0xc000328370)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:191 +0x464
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000328370)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc0001fe120, 0xc000328370)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc000328370)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000328370)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc000328370)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x64
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000328370)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc000328370)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000328370)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc0001da3c0, 0xc000328370)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b2
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc0001da3c0, 0xc86c40, 0xc0004140e0, 0xc000534700)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x134
occamy    | net/http.serverHandler.ServeHTTP(0xc0002160e0, 0xc86c40, 0xc0004140e0, 0xc000534700)
occamy    |     /usr/local/go/src/net/http/server.go:2802 +0xa4
occamy    | net/http.(*conn).serve(0xc0001d9720, 0xc88640, 0xc000536200)
occamy    |     /usr/local/go/src/net/http/server.go:1890 +0x875
occamy    | created by net/http.(*Server).Serve
occamy    |     /usr/local/go/src/net/http/server.go:2927 +0x38e
occamy    |
occamy    | goroutine 190 [semacquire, 3 minutes]:
occamy    | sync.runtime_SemacquireMutex(0xc0001b436c, 0x0, 0x1)
occamy    |     /usr/local/go/src/runtime/sema.go:71 +0x47
occamy    | sync.(*Mutex).lockSlow(0xc0001b4368)
occamy    |     /usr/local/go/src/sync/mutex.go:138 +0xfc
occamy    | sync.(*Mutex).Lock(...)
occamy    |     /usr/local/go/src/sync/mutex.go:81
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc0001b4360, 0xc000550dc0, 0xc000580280, 0x8, 0xc0005133a8)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:200 +0x3ed
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc0001b4360, 0xc000204160)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:191 +0x464
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000204160)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc0001fe120, 0xc000204160)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc000204160)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000204160)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc000204160)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x64
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000204160)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc000204160)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000204160)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc0001da3c0, 0xc000204160)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b2
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc0001da3c0, 0xc86c40, 0xc000324000, 0xc000300000)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x134
occamy    | net/http.serverHandler.ServeHTTP(0xc0002160e0, 0xc86c40, 0xc000324000, 0xc000300000)
occamy    |     /usr/local/go/src/net/http/server.go:2802 +0xa4
occamy    | net/http.(*conn).serve(0xc0001d97c0, 0xc88640, 0xc000536240)
occamy    |     /usr/local/go/src/net/http/server.go:1890 +0x875
occamy    | created by net/http.(*Server).Serve
occamy    |     /usr/local/go/src/net/http/server.go:2927 +0x38e
occamy    |
occamy    | goroutine 191 [semacquire, 3 minutes]:
occamy    | sync.runtime_SemacquireMutex(0xc0001b436c, 0x0, 0x1)
occamy    |     /usr/local/go/src/runtime/sema.go:71 +0x47
occamy    | sync.(*Mutex).lockSlow(0xc0001b4368)
occamy    |     /usr/local/go/src/sync/mutex.go:138 +0xfc
occamy    | sync.(*Mutex).Lock(...)
occamy    |     /usr/local/go/src/sync/mutex.go:81
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc0001b4360, 0xc0003a0b00, 0xc000580840, 0x8, 0xc0000a5cc8)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:200 +0x3ed
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc0001b4360, 0xc000204bb0)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:191 +0x464
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000204bb0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc0001fe120, 0xc000204bb0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc000204bb0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000204bb0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc000204bb0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x64
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000204bb0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc000204bb0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000204bb0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc0001da3c0, 0xc000204bb0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b2
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc0001da3c0, 0xc86c40, 0xc000324380, 0xc000300300)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x134
occamy    | net/http.serverHandler.ServeHTTP(0xc0002160e0, 0xc86c40, 0xc000324380, 0xc000300300)
occamy    |     /usr/local/go/src/net/http/server.go:2802 +0xa4
occamy    | net/http.(*conn).serve(0xc0001d9860, 0xc88640, 0xc000536280)
occamy    |     /usr/local/go/src/net/http/server.go:1890 +0x875
occamy    | created by net/http.(*Server).Serve
occamy    |     /usr/local/go/src/net/http/server.go:2927 +0x38e
occamy    |
occamy    | goroutine 192 [semacquire, 3 minutes]:
occamy    | sync.runtime_SemacquireMutex(0xc0001b436c, 0x0, 0x1)
occamy    |     /usr/local/go/src/runtime/sema.go:71 +0x47
occamy    | sync.(*Mutex).lockSlow(0xc0001b4368)
occamy    |     /usr/local/go/src/sync/mutex.go:138 +0xfc
occamy    | sync.(*Mutex).Lock(...)
occamy    |     /usr/local/go/src/sync/mutex.go:81
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc0001b4360, 0xc000551340, 0xc0005803c0, 0x8, 0xc000513858)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:200 +0x3ed
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc0001b4360, 0xc000204420)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:191 +0x464
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000204420)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc0001fe120, 0xc000204420)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc000204420)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000204420)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc000204420)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x64
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000204420)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc000204420)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000204420)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc0001da3c0, 0xc000204420)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b2
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc0001da3c0, 0xc86c40, 0xc0003240e0, 0xc000300100)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x134
occamy    | net/http.serverHandler.ServeHTTP(0xc0002160e0, 0xc86c40, 0xc0003240e0, 0xc000300100)
occamy    |     /usr/local/go/src/net/http/server.go:2802 +0xa4
occamy    | net/http.(*conn).serve(0xc0001d9900, 0xc88640, 0xc00025bfc0)
occamy    |     /usr/local/go/src/net/http/server.go:1890 +0x875
occamy    | created by net/http.(*Server).Serve
occamy    |     /usr/local/go/src/net/http/server.go:2927 +0x38e
occamy    |
occamy    | goroutine 193 [semacquire, 3 minutes]:
occamy    | sync.runtime_SemacquireMutex(0xc0001b436c, 0x0, 0x1)
occamy    |     /usr/local/go/src/runtime/sema.go:71 +0x47
occamy    | sync.(*Mutex).lockSlow(0xc0001b4368)
occamy    |     /usr/local/go/src/sync/mutex.go:138 +0xfc
occamy    | sync.(*Mutex).Lock(...)
occamy    |     /usr/local/go/src/sync/mutex.go:81
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc0001b4360, 0xc0003198c0, 0xc00025bbc0, 0x8, 0xc000430408)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:200 +0x3ed
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc0001b4360, 0xc000270210)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:191 +0x464
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000270210)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc0001fe120, 0xc000270210)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc000270210)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000270210)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc000270210)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x64
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000270210)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc000270210)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000270210)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc0001da3c0, 0xc000270210)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b2
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc0001da3c0, 0xc86c40, 0xc00026d260, 0xc0001bb500)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x134
occamy    | net/http.serverHandler.ServeHTTP(0xc0002160e0, 0xc86c40, 0xc00026d260, 0xc0001bb500)
occamy    |     /usr/local/go/src/net/http/server.go:2802 +0xa4
occamy    | net/http.(*conn).serve(0xc0001d99a0, 0xc88640, 0xc0001b7a80)
occamy    |     /usr/local/go/src/net/http/server.go:1890 +0x875
occamy    | created by net/http.(*Server).Serve
occamy    |     /usr/local/go/src/net/http/server.go:2927 +0x38e
occamy    |
occamy    | goroutine 216 [semacquire, 3 minutes]:
occamy    | sync.runtime_SemacquireMutex(0xc0001b436c, 0x0, 0x1)
occamy    |     /usr/local/go/src/runtime/sema.go:71 +0x47
occamy    | sync.(*Mutex).lockSlow(0xc0001b4368)
occamy    |     /usr/local/go/src/sync/mutex.go:138 +0xfc
occamy    | sync.(*Mutex).Lock(...)
occamy    |     /usr/local/go/src/sync/mutex.go:81
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc0001b4360, 0xc0005bb4a0, 0xc0005366c0, 0x8, 0xc000431848)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:200 +0x3ed
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc0001b4360, 0xc000328630)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:191 +0x464
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000328630)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc0001fe120, 0xc000328630)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc000328630)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000328630)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc000328630)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x64
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000328630)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc000328630)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000328630)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc0001da3c0, 0xc000328630)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b2
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc0001da3c0, 0xc86c40, 0xc0004141c0, 0xc000534800)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x134
occamy    | net/http.serverHandler.ServeHTTP(0xc0002160e0, 0xc86c40, 0xc0004141c0, 0xc000534800)
occamy    |     /usr/local/go/src/net/http/server.go:2802 +0xa4
occamy    | net/http.(*conn).serve(0xc0002ef4a0, 0xc88640, 0xc00029f200)
occamy    |     /usr/local/go/src/net/http/server.go:1890 +0x875
occamy    | created by net/http.(*Server).Serve
occamy    |     /usr/local/go/src/net/http/server.go:2927 +0x38e
occamy    |
occamy    | goroutine 217 [semacquire, 3 minutes]:
occamy    | sync.runtime_SemacquireMutex(0xc0001b436c, 0x0, 0x1)
occamy    |     /usr/local/go/src/runtime/sema.go:71 +0x47
occamy    | sync.(*Mutex).lockSlow(0xc0001b4368)
occamy    |     /usr/local/go/src/sync/mutex.go:138 +0xfc
occamy    | sync.(*Mutex).Lock(...)
occamy    |     /usr/local/go/src/sync/mutex.go:81
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc0001b4360, 0xc00053f8c0, 0xc00029e340, 0x8, 0xc00055f3b8)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:200 +0x3ed
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc0001b4360, 0xc00037e630)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:191 +0x464
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00037e630)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc0001fe120, 0xc00037e630)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc00037e630)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00037e630)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc00037e630)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x64
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00037e630)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc00037e630)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00037e630)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc0001da3c0, 0xc00037e630)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b2
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc0001da3c0, 0xc86c40, 0xc0002162a0, 0xc00025e000)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x134
occamy    | net/http.serverHandler.ServeHTTP(0xc0002160e0, 0xc86c40, 0xc0002162a0, 0xc00025e000)
occamy    |     /usr/local/go/src/net/http/server.go:2802 +0xa4
occamy    | net/http.(*conn).serve(0xc0002ef540, 0xc88640, 0xc0001a5400)
occamy    |     /usr/local/go/src/net/http/server.go:1890 +0x875
occamy    | created by net/http.(*Server).Serve
occamy    |     /usr/local/go/src/net/http/server.go:2927 +0x38e
occamy    |
occamy    | goroutine 218 [semacquire, 3 minutes]:
occamy    | sync.runtime_SemacquireMutex(0xc0001b436c, 0x0, 0x1)
occamy    |     /usr/local/go/src/runtime/sema.go:71 +0x47
occamy    | sync.(*Mutex).lockSlow(0xc0001b4368)
occamy    |     /usr/local/go/src/sync/mutex.go:138 +0xfc
occamy    | sync.(*Mutex).Lock(...)
occamy    |     /usr/local/go/src/sync/mutex.go:81
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc0001b4360, 0xc0000ba6e0, 0xc0001a5ac0, 0x8, 0xc000583bc8)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:200 +0x3ed
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc0001b4360, 0xc0000b0bb0)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:191 +0x464
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0000b0bb0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc0001fe120, 0xc0000b0bb0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc0000b0bb0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0000b0bb0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc0000b0bb0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x64
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0000b0bb0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc0000b0bb0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0000b0bb0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc0001da3c0, 0xc0000b0bb0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b2
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc0001da3c0, 0xc86c40, 0xc00047a9a0, 0xc0000d6600)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x134
occamy    | net/http.serverHandler.ServeHTTP(0xc0002160e0, 0xc86c40, 0xc00047a9a0, 0xc0000d6600)
occamy    |     /usr/local/go/src/net/http/server.go:2802 +0xa4
occamy    | net/http.(*conn).serve(0xc0002ef5e0, 0xc88640, 0xc00029f1c0)
occamy    |     /usr/local/go/src/net/http/server.go:1890 +0x875
occamy    | created by net/http.(*Server).Serve
occamy    |     /usr/local/go/src/net/http/server.go:2927 +0x38e
occamy    |
occamy    | goroutine 219 [semacquire, 3 minutes]:
occamy    | sync.runtime_SemacquireMutex(0xc0001b436c, 0x0, 0x1)
occamy    |     /usr/local/go/src/runtime/sema.go:71 +0x47
occamy    | sync.(*Mutex).lockSlow(0xc0001b4368)
occamy    |     /usr/local/go/src/sync/mutex.go:138 +0xfc
occamy    | sync.(*Mutex).Lock(...)
occamy    |     /usr/local/go/src/sync/mutex.go:81
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc0001b4360, 0xc000318000, 0xc0002f6700, 0x8, 0xc00055f858)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:200 +0x3ed
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc0001b4360, 0xc00037e790)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:191 +0x464
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00037e790)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc0001fe120, 0xc00037e790)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc00037e790)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00037e790)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc00037e790)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x64
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00037e790)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc00037e790)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00037e790)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc0001da3c0, 0xc00037e790)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b2
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc0001da3c0, 0xc86c40, 0xc000216380, 0xc00025e100)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x134
occamy    | net/http.serverHandler.ServeHTTP(0xc0002160e0, 0xc86c40, 0xc000216380, 0xc00025e100)
occamy    |     /usr/local/go/src/net/http/server.go:2802 +0xa4
occamy    | net/http.(*conn).serve(0xc0002ef680, 0xc88640, 0xc00029f240)
occamy    |     /usr/local/go/src/net/http/server.go:1890 +0x875
occamy    | created by net/http.(*Server).Serve
occamy    |     /usr/local/go/src/net/http/server.go:2927 +0x38e
occamy    |
occamy    | goroutine 220 [semacquire, 3 minutes]:
occamy    | sync.runtime_SemacquireMutex(0xc0001b436c, 0x0, 0x1)
occamy    |     /usr/local/go/src/runtime/sema.go:71 +0x47
occamy    | sync.(*Mutex).lockSlow(0xc0001b4368)
occamy    |     /usr/local/go/src/sync/mutex.go:138 +0xfc
occamy    | sync.(*Mutex).Lock(...)
occamy    |     /usr/local/go/src/sync/mutex.go:81
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc0001b4360, 0xc000276c60, 0xc00029e680, 0x8, 0xc0001fe888)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:200 +0x3ed
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc0001b4360, 0xc00037eb00)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:191 +0x464
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00037eb00)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc0001fe120, 0xc00037eb00)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc00037eb00)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00037eb00)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc00037eb00)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x64
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00037eb00)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc00037eb00)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00037eb00)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc0001da3c0, 0xc00037eb00)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b2
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc0001da3c0, 0xc86c40, 0xc000216540, 0xc0003c5800)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x134
occamy    | net/http.serverHandler.ServeHTTP(0xc0002160e0, 0xc86c40, 0xc000216540, 0xc0003c5800)
occamy    |     /usr/local/go/src/net/http/server.go:2802 +0xa4
occamy    | net/http.(*conn).serve(0xc0002ef720, 0xc88640, 0xc000370940)
occamy    |     /usr/local/go/src/net/http/server.go:1890 +0x875
occamy    | created by net/http.(*Server).Serve
occamy    |     /usr/local/go/src/net/http/server.go:2927 +0x38e
occamy    |
occamy    | goroutine 221 [semacquire, 3 minutes]:
occamy    | sync.runtime_SemacquireMutex(0xc0001b436c, 0x0, 0x1)
occamy    |     /usr/local/go/src/runtime/sema.go:71 +0x47
occamy    | sync.(*Mutex).lockSlow(0xc0001b4368)
occamy    |     /usr/local/go/src/sync/mutex.go:138 +0xfc
occamy    | sync.(*Mutex).Lock(...)
occamy    |     /usr/local/go/src/sync/mutex.go:81
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc0001b4360, 0xc000456f20, 0xc000370d80, 0x8, 0xc000582538)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:200 +0x3ed
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc0001b4360, 0xc000418790)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:191 +0x464
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000418790)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc0001fe120, 0xc000418790)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc000418790)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000418790)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc000418790)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x64
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000418790)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc000418790)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000418790)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc0001da3c0, 0xc000418790)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b2
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc0001da3c0, 0xc86c40, 0xc000414e00, 0xc0000d7100)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x134
occamy    | net/http.serverHandler.ServeHTTP(0xc0002160e0, 0xc86c40, 0xc000414e00, 0xc0000d7100)
occamy    |     /usr/local/go/src/net/http/server.go:2802 +0xa4
occamy    | net/http.(*conn).serve(0xc0002ef7c0, 0xc88640, 0xc0001a4e00)
occamy    |     /usr/local/go/src/net/http/server.go:1890 +0x875
occamy    | created by net/http.(*Server).Serve
occamy    |     /usr/local/go/src/net/http/server.go:2927 +0x38e
occamy    |
occamy    | goroutine 222 [semacquire, 3 minutes]:
occamy    | sync.runtime_SemacquireMutex(0xc0001b436c, 0x0, 0x1)
occamy    |     /usr/local/go/src/runtime/sema.go:71 +0x47
occamy    | sync.(*Mutex).lockSlow(0xc0001b4368)
occamy    |     /usr/local/go/src/sync/mutex.go:138 +0xfc
occamy    | sync.(*Mutex).Lock(...)
occamy    |     /usr/local/go/src/sync/mutex.go:81
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc0001b4360, 0xc0003a0580, 0xc0005806c0, 0x8, 0xc0000a5058)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:200 +0x3ed
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc0001b4360, 0xc00037e420)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:191 +0x464
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00037e420)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc0001fe120, 0xc00037e420)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc00037e420)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00037e420)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc00037e420)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x64
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00037e420)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc00037e420)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00037e420)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc0001da3c0, 0xc00037e420)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b2
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc0001da3c0, 0xc86c40, 0xc00047a380, 0xc0000d7200)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x134
occamy    | net/http.serverHandler.ServeHTTP(0xc0002160e0, 0xc86c40, 0xc00047a380, 0xc0000d7200)
occamy    |     /usr/local/go/src/net/http/server.go:2802 +0xa4
occamy    | net/http.(*conn).serve(0xc0002ef860, 0xc88640, 0xc0001a4e80)
occamy    |     /usr/local/go/src/net/http/server.go:1890 +0x875
occamy    | created by net/http.(*Server).Serve
occamy    |     /usr/local/go/src/net/http/server.go:2927 +0x38e
occamy    |
occamy    | goroutine 223 [semacquire, 3 minutes]:
occamy    | sync.runtime_SemacquireMutex(0xc0001b436c, 0x0, 0x1)
occamy    |     /usr/local/go/src/runtime/sema.go:71 +0x47
occamy    | sync.(*Mutex).lockSlow(0xc0001b4368)
occamy    |     /usr/local/go/src/sync/mutex.go:138 +0xfc
occamy    | sync.(*Mutex).Lock(...)
occamy    |     /usr/local/go/src/sync/mutex.go:81
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc0001b4360, 0xc000318420, 0xc0002f67c0, 0x8, 0xc00053a558)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:200 +0x3ed
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc0001b4360, 0xc0000b0790)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:191 +0x464
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0000b0790)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc0001fe120, 0xc0000b0790)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc0000b0790)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0000b0790)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc0000b0790)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x64
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0000b0790)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc0000b0790)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0000b0790)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc0001da3c0, 0xc0000b0790)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b2
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc0001da3c0, 0xc86c40, 0xc00047a460, 0xc0000d7300)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x134
occamy    | net/http.serverHandler.ServeHTTP(0xc0002160e0, 0xc86c40, 0xc00047a460, 0xc0000d7300)
occamy    |     /usr/local/go/src/net/http/server.go:2802 +0xa4
occamy    | net/http.(*conn).serve(0xc0002ef900, 0xc88640, 0xc0001a4f40)
occamy    |     /usr/local/go/src/net/http/server.go:1890 +0x875
occamy    | created by net/http.(*Server).Serve
occamy    |     /usr/local/go/src/net/http/server.go:2927 +0x38e
occamy    |
occamy    | goroutine 224 [semacquire, 3 minutes]:
occamy    | sync.runtime_SemacquireMutex(0xc0001b436c, 0x0, 0x1)
occamy    |     /usr/local/go/src/runtime/sema.go:71 +0x47
occamy    | sync.(*Mutex).lockSlow(0xc0001b4368)
occamy    |     /usr/local/go/src/sync/mutex.go:138 +0xfc
occamy    | sync.(*Mutex).Lock(...)
occamy    |     /usr/local/go/src/sync/mutex.go:81
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc0001b4360, 0xc000276420, 0xc00029e540, 0x8, 0xc0001fe2f8)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:200 +0x3ed
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc0001b4360, 0xc0000b08f0)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:191 +0x464
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0000b08f0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc0001fe120, 0xc0000b08f0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc0000b08f0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0000b08f0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc0000b08f0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x64
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0000b08f0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc0000b08f0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0000b08f0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc0001da3c0, 0xc0000b08f0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b2
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc0001da3c0, 0xc86c40, 0xc00047a540, 0xc0000d7400)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x134
occamy    | net/http.serverHandler.ServeHTTP(0xc0002160e0, 0xc86c40, 0xc00047a540, 0xc0000d7400)
occamy    |     /usr/local/go/src/net/http/server.go:2802 +0xa4
occamy    | net/http.(*conn).serve(0xc0002ef9a0, 0xc88640, 0xc0001a5040)
occamy    |     /usr/local/go/src/net/http/server.go:1890 +0x875
occamy    | created by net/http.(*Server).Serve
occamy    |     /usr/local/go/src/net/http/server.go:2927 +0x38e
occamy    |
occamy    | goroutine 225 [semacquire, 3 minutes]:
occamy    | sync.runtime_SemacquireMutex(0xc0001b436c, 0x0, 0x1)
occamy    |     /usr/local/go/src/runtime/sema.go:71 +0x47
occamy    | sync.(*Mutex).lockSlow(0xc0001b4368)
occamy    |     /usr/local/go/src/sync/mutex.go:138 +0xfc
occamy    | sync.(*Mutex).Lock(...)
occamy    |     /usr/local/go/src/sync/mutex.go:81
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc0001b4360, 0xc00050e000, 0xc0002f6000, 0x8, 0xc00053a988)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:200 +0x3ed
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc0001b4360, 0xc0000b09a0)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:191 +0x464
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0000b09a0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc0001fe120, 0xc0000b09a0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc0000b09a0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0000b09a0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc0000b09a0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x64
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0000b09a0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc0000b09a0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0000b09a0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc0001da3c0, 0xc0000b09a0)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b2
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc0001da3c0, 0xc86c40, 0xc00047a620, 0xc0000d7500)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x134
occamy    | net/http.serverHandler.ServeHTTP(0xc0002160e0, 0xc86c40, 0xc00047a620, 0xc0000d7500)
occamy    |     /usr/local/go/src/net/http/server.go:2802 +0xa4
occamy    | net/http.(*conn).serve(0xc0002efa40, 0xc88640, 0xc0001a5140)
occamy    |     /usr/local/go/src/net/http/server.go:1890 +0x875
occamy    | created by net/http.(*Server).Serve
occamy    |     /usr/local/go/src/net/http/server.go:2927 +0x38e
occamy    |
occamy    | goroutine 226 [semacquire, 3 minutes]:
occamy    | sync.runtime_SemacquireMutex(0xc0001b436c, 0x0, 0x1)
occamy    |     /usr/local/go/src/runtime/sema.go:71 +0x47
occamy    | sync.(*Mutex).lockSlow(0xc0001b4368)
occamy    |     /usr/local/go/src/sync/mutex.go:138 +0xfc
occamy    | sync.(*Mutex).Lock(...)
occamy    |     /usr/local/go/src/sync/mutex.go:81
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc0001b4360, 0xc0004574a0, 0xc0001a5600, 0x8, 0xc000582e28)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:200 +0x3ed
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc0001b4360, 0xc0000b0420)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:191 +0x464
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0000b0420)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc0001fe120, 0xc0000b0420)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc0000b0420)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0000b0420)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc0000b0420)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x64
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0000b0420)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc0000b0420)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0000b0420)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc0001da3c0, 0xc0000b0420)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b2
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc0001da3c0, 0xc86c40, 0xc00047a700, 0xc0000d6200)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x134
occamy    | net/http.serverHandler.ServeHTTP(0xc0002160e0, 0xc86c40, 0xc00047a700, 0xc0000d6200)
occamy    |     /usr/local/go/src/net/http/server.go:2802 +0xa4
occamy    | net/http.(*conn).serve(0xc0002efae0, 0xc88640, 0xc0001a5280)
occamy    |     /usr/local/go/src/net/http/server.go:1890 +0x875
occamy    | created by net/http.(*Server).Serve
occamy    |     /usr/local/go/src/net/http/server.go:2927 +0x38e
occamy    |
occamy    | goroutine 227 [semacquire, 3 minutes]:
occamy    | sync.runtime_SemacquireMutex(0xc0001b436c, 0x0, 0x1)
occamy    |     /usr/local/go/src/runtime/sema.go:71 +0x47
occamy    | sync.(*Mutex).lockSlow(0xc0001b4368)
occamy    |     /usr/local/go/src/sync/mutex.go:138 +0xfc
occamy    | sync.(*Mutex).Lock(...)
occamy    |     /usr/local/go/src/sync/mutex.go:81
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc0001b4360, 0xc00050f8c0, 0xc0002f6400, 0x8, 0xc0005114f8)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:200 +0x3ed
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc0001b4360, 0xc000418420)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:191 +0x464
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000418420)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc0001fe120, 0xc000418420)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc000418420)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000418420)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc000418420)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x64
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000418420)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc000418420)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000418420)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc0001da3c0, 0xc000418420)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b2
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc0001da3c0, 0xc86c40, 0xc00037a0e0, 0xc0003c4100)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x134
occamy    | net/http.serverHandler.ServeHTTP(0xc0002160e0, 0xc86c40, 0xc00037a0e0, 0xc0003c4100)
occamy    |     /usr/local/go/src/net/http/server.go:2802 +0xa4
occamy    | net/http.(*conn).serve(0xc0002efb80, 0xc88640, 0xc0001a52c0)
occamy    |     /usr/local/go/src/net/http/server.go:1890 +0x875
occamy    | created by net/http.(*Server).Serve
occamy    |     /usr/local/go/src/net/http/server.go:2927 +0x38e
occamy    |
occamy    | goroutine 228 [semacquire, 3 minutes]:
occamy    | sync.runtime_SemacquireMutex(0xc0001b436c, 0x0, 0x1)
occamy    |     /usr/local/go/src/runtime/sema.go:71 +0x47
occamy    | sync.(*Mutex).lockSlow(0xc0001b4368)
occamy    |     /usr/local/go/src/sync/mutex.go:138 +0xfc
occamy    | sync.(*Mutex).Lock(...)
occamy    |     /usr/local/go/src/sync/mutex.go:81
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc0001b4360, 0xc0000ba000, 0xc0001a5880, 0x8, 0xc000583738)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:200 +0x3ed
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc0001b4360, 0xc0000b0a50)
occamy    |     /go/src/github.com/changkun/occamy/server/connection.go:191 +0x464
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0000b0a50)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc0001fe120, 0xc0000b0a50)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc0000b0a50)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0000b0a50)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc0000b0a50)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x64
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0000b0a50)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc0000b0a50)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0000b0a50)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc0001da3c0, 0xc0000b0a50)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b2
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc0001da3c0, 0xc86c40, 0xc00047a8c0, 0xc0000d6400)
occamy    |     /go/src/github.com/changkun/occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x134
occamy    | net/http.serverHandler.ServeHTTP(0xc0002160e0, 0xc86c40, 0xc00047a8c0, 0xc0000d6400)
occamy    |     /usr/local/go/src/net/http/server.go:2802 +0xa4
occamy    | net/http.(*conn).serve(0xc0002efc20, 0xc88640, 0xc0001a5300)
changkun commented 4 years ago

The bug can be reproduced in the pressure test which was just committed in https://github.com/changkun/occamy/commit/daa6393fbe58d2207bd91839fc624999ae4036e3.

changkun commented 4 years ago

This bug may be introduced in https://github.com/changkun/occamy/commit/d2afb2dc2d4c64e685a9f53fb9251167a16dbb42.

The handshake process may still need to lock until everything(clients, parser, input threads, and so on) is ready.

changkun commented 4 years ago

Sadly, no.

changkun commented 4 years ago

This bug seems only exists in RDP connections:

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7fdc557fa700 (LWP 35)]
0x00007fdc65f12cc0 in pthread_mutex_lock () from /lib64/libpthread.so.0
Missing separate debuginfos, use: debuginfo-install bzip2-libs-1.0.6-13.el7.x86_64 cairo-1.15.12-4.el7.x86_64 expat-2.1.0-10.el7_3.x86_64 fontconfig-2.13.0-4.3.el7.x86_64 freerdp-libs-1.0.2-15.el7.x86_64 freetype-2.8-14.el7.x86_64 glibc-2.17-292.el7.x86_64 keyutils-libs-1.5.8-3.el7.x86_64 krb5-libs-1.15.1-37.el7_7.2.x86_64 libX11-1.6.7-2.el7.x86_64 libXau-1.0.8-2.1.el7.x86_64 libXext-1.3.3-3.el7.x86_64 libXrender-0.9.10-1.el7.x86_64 libcom_err-1.42.9-16.el7.x86_64 libglvnd-1.0.1-0.8.git5baa1e5.el7.x86_64 libglvnd-egl-1.0.1-0.8.git5baa1e5.el7.x86_64 libglvnd-glx-1.0.1-0.8.git5baa1e5.el7.x86_64 libjpeg-turbo-1.2.90-8.el7.x86_64 libpng-1.5.13-7.el7_2.x86_64 libselinux-2.5-14.1.el7.x86_64 libuuid-2.23.2-61.el7.x86_64 libwebp-0.3.0-7.el7.x86_64 libxcb-1.13-1.el7.x86_64 openssl-libs-1.0.2k-19.el7.x86_64 pcre-8.32-17.el7.x86_64 pixman-0.34.0-1.el7.x86_64 uuid-1.6.2-26.el7.x86_64 zlib-1.2.7-18.el7.x86_64
(gdb) bt
#0  0x00007fdc65f12cc0 in pthread_mutex_lock () from /lib64/libpthread.so.0
#1  0x00007fdc545e2049 in guac_common_list_lock (list=<optimized out>) at list.c:75
#2  0x00007fdc545e0658 in guac_rdp_svc_send_pipes (user=0x7fdc380029a0) at rdp_svc.c:78
#3  0x00007fdc545e0a1b in guac_rdp_user_join_handler (user=0x7fdc380029a0, argc=<optimized out>, 
    argv=<optimized out>) at user.c:85
#4  0x00007fdc6612be1d in guac_client_add_user (user=0x7fdc380029a0, argc=<optimized out>, 
    argv=<optimized out>) at client.c:285
#5  0x00000000009f80fe in _cgo_5063686ecc33_Cfunc_guac_client_add_user (v=0xc0003bb4c8)
    at cgo-gcc-prolog:89
#6  0x0000000000460c70 in runtime.asmcgocall () at /usr/local/go/src/runtime/asm_amd64.s:655
#7  0x000000000045e601 in runtime.exitsyscallfast.func1 ()
    at /usr/local/go/src/runtime/proc.go:3053
#8  0x000000c0003b6780 in ?? ()
#9  0x0000000000435e20 in ?? () at /usr/local/go/src/runtime/proc.go:1080
#10 0x0000000000000000 in ?? ()
changkun commented 4 years ago

However, VNC/SSH still have double free corruption, in a very rare case.

changkun commented 4 years ago

some random panics:

occamy    | [GIN] 2020/02/17 - 18:05:40 | 200 |     184.589µs |    172.16.238.1 | POST     /api/v1/login
occamy    | [GIN] 2020/02/17 - 18:05:40 | 200 |     127.039µs |    172.16.238.1 | POST     /api/v1/login
occamy    | time="2020-02-17T18:05:40Z" level=info msg="occamy-proxy: new session was created: $147f05a5-77cd-43c9-8f29-68d281185fe8"
occamy    | occamy-lib[140465286407936]: Cursor rendering: local
occamy    | occamy-lib[140465286407936]: Parameter "swap-red-blue" omitted. Using default value of 0.
occamy    | occamy-lib[140465286407936]: Parameter "read-only" omitted. Using default value of 0.
occamy    | occamy-lib[140465286407936]: Parameter "color-depth" omitted. Using default value of 0.
occamy    | occamy-lib[140465286407936]: Parameter "dest-port" omitted. Using default value of 0.
occamy    | occamy-lib[140465286407936]: Parameter "encodings" omitted. Using default value of "zrle ultra copyrect hextile zlib corre rre raw".
occamy    | occamy-lib[140465286407936]: Parameter "autoretry" omitted. Using default value of 0.
occamy    | occamy-lib[140465286407936]: Parameter "reverse-connect" omitted. Using default value of 0.
occamy    | occamy-lib[140465286407936]: Parameter "listen-timeout" omitted. Using default value of 5000.
occamy    | occamy-lib[140465264764672]: Cursor rendering: local
occamy    | occamy-lib[140465264764672]: Parameter "swap-red-blue" omitted. Using default value of 0.
occamy    | occamy-lib[140465264764672]: Parameter "read-only" omitted. Using default value of 0.
occamy    | occamy-lib[140465264764672]: Parameter "color-depth" omitted. Using default value of 0.
occamy    | occamy-lib[140465264764672]: Parameter "dest-port" omitted. Using default value of 0.
occamy    | occamy-lib[140465264764672]: Parameter "encodings" omitted. Using default value of "zrle ultra copyrect hextile zlib corre rre raw".
occamy    | occamy-lib[140465264764672]: Parameter "autoretry" omitted. Using default value of 0.
occamy    | occamy-lib[140465264764672]: Parameter "reverse-connect" omitted. Using default value of 0.
occamy    | occamy-lib[140465264764672]: Parameter "listen-timeout" omitted. Using default value of 5000.
occamy    | occamy-lib[140465264764672]: Cursor rendering: local
occamy    | occamy-lib[140465264764672]: Parameter "swap-red-blue" omitted. Using default value of 0.
occamy    | occamy-lib[140465264764672]: Parameter "read-only" omitted. Using default value of 0.
occamy    | occamy-lib[140465264764672]: Parameter "color-depth" omitted. Using default value of 0.
occamy    | occamy-lib[140465264764672]: Parameter "dest-port" omitted. Using default value of 0.
occamy    | occamy-lib[140465264764672]: Parameter "encodings" omitted. Using default value of "zrle ultra copyrect hextile zlib corre rre raw".
occamy    | occamy-lib[140465264764672]: Parameter "autoretry" omitted. Using default value of 0.
occamy    | occamy-lib[140465264764672]: Parameter "reverse-connect" omitted. Using default value of 0.
occamy    | occamy-lib[140465264764672]: Parameter "listen-timeout" omitted. Using default value of 5000.
occamy    | occamy-lib[140465143797504]: Cursor rendering: local
occamy    | occamy-lib[140465143797504]: Parameter "swap-red-blue" omitted. Using default value of 0.
occamy    | occamy-lib[140465143797504]: Parameter "read-only" omitted. Using default value of 0.
occamy    | occamy-lib[140465143797504]: Parameter "color-depth" omitted. Using default value of 0.
occamy    | occamy-lib[140465143797504]: Parameter "dest-port" omitted. Using default value of 0.
occamy    | occamy-lib[140465143797504]: Parameter "encodings" omitted. Using default value of "zrle ultra copyrect hextile zlib corre rre raw".
occamy    | occamy-lib[140465143797504]: Parameter "autoretry" omitted. Using default value of 0.
occamy    | occamy-lib[140465143797504]: Parameter "reverse-connect" omitted. Using default value of 0.
occamy    | occamy-lib[140465143797504]: Parameter "listen-timeout" omitted. Using default value of 5000.
occamy    | occamy-lib[140465143797504]: Cursor rendering: local
occamy    | occamy-lib[140465143797504]: Parameter "swap-red-blue" omitted. Using default value of 0.
occamy    | occamy-lib[140465143797504]: Parameter "read-only" omitted. Using default value of 0.
occamy    | occamy-lib[140465143797504]: Parameter "color-depth" omitted. Using default value of 0.
occamy    | occamy-lib[140465143797504]: Parameter "dest-port" omitted. Using default value of 0.
occamy    | occamy-lib[140465143797504]: Parameter "encodings" omitted. Using default value of "zrle ultra copyrect hextile zlib corre rre raw".
occamy    | occamy-lib[140465143797504]: Parameter "autoretry" omitted. Using default value of 0.
occamy    | occamy-lib[140465143797504]: Parameter "reverse-connect" omitted. Using default value of 0.
occamy    | occamy-lib[140465143797504]: Parameter "listen-timeout" omitted. Using default value of 5000.
occamy    | occamy-lib[140465135404800]: Cursor rendering: local
occamy    | occamy-lib[140465135404800]: Parameter "swap-red-blue" omitted. Using default value of 0.
occamy    | occamy-lib[140465135404800]: Parameter "read-only" omitted. Using default value of 0.
occamy    | occamy-lib[140465135404800]: Parameter "color-depth" omitted. Using default value of 0.
occamy    | occamy-lib[140465135404800]: Parameter "dest-port" omitted. Using default value of 0.
occamy    | occamy-lib[140465135404800]: Parameter "encodings" omitted. Using default value of "zrle ultra copyrect hextile zlib corre rre raw".
occamy    | occamy-lib[140465135404800]: Parameter "autoretry" omitted. Using default value of 0.
occamy    | occamy-lib[140465135404800]: Parameter "reverse-connect" omitted. Using default value of 0.
occamy    | occamy-lib[140465135404800]: Parameter "listen-timeout" omitted. Using default value of 5000.
occamy    | occamy-lib[140465143797504]: Cursor rendering: local
occamy    | occamy-lib[140465143797504]: Parameter "swap-red-blue" omitted. Using default value of 0.
occamy    | occamy-lib[140465143797504]: Parameter "read-only" omitted. Using default value of 0.
occamy    | occamy-lib[140465143797504]: Parameter "color-depth" omitted. Using default value of 0.
occamy    | occamy-lib[140465143797504]: Parameter "dest-port" omitted. Using default value of 0.
occamy    | occamy-lib[140465143797504]: Parameter "encodings" omitted. Using default value of "zrle ultra copyrect hextile zlib corre rre raw".
occamy    | occamy-lib[140465143797504]: Parameter "autoretry" omitted. Using default value of 0.
occamy    | occamy-lib[140465143797504]: Parameter "reverse-connect" omitted. Using default value of 0.
occamy    | occamy-lib[140465143797504]: Parameter "listen-timeout" omitted. Using default value of 5000.
occamy    | occamy-lib[140464925685504]: Cursor rendering: local
occamy    | occamy-lib[140464925685504]: Parameter "swap-red-blue" omitted. Using default value of 0.
occamy    | occamy-lib[140464925685504]: Parameter "read-only" omitted. Using default value of 0.
occamy    | occamy-lib[140464925685504]: Parameter "color-depth" omitted. Using default value of 0.
occamy    | occamy-lib[140464925685504]: Parameter "dest-port" omitted. Using default value of 0.
occamy    | occamy-lib[140464925685504]: Parameter "encodings" omitted. Using default value of "zrle ultra copyrect hextile zlib corre rre raw".
occamy    | occamy-lib[140464925685504]: Parameter "autoretry" omitted. Using default value of 0.
occamy    | occamy-lib[140464925685504]: Parameter "reverse-connect" omitted. Using default value of 0.
occamy    | occamy-lib[140464925685504]: Parameter "listen-timeout" omitted. Using default value of 5000.
occamy    | occamy-lib[140464925685504]: Cursor rendering: local
occamy    | occamy-lib[140464925685504]: Parameter "swap-red-blue" omitted. Using default value of 0.
occamy    | occamy-lib[140464925685504]: Parameter "read-only" omitted. Using default value of 0.
occamy    | occamy-lib[140464925685504]: Parameter "color-depth" omitted. Using default value of 0.
occamy    | occamy-lib[140464925685504]: Parameter "dest-port" omitted. Using default value of 0.
occamy    | occamy-lib[140464925685504]: Parameter "encodings" omitted. Using default value of "zrle ultra copyrect hextile zlib corre rre raw".
occamy    | occamy-lib[140464925685504]: Parameter "autoretry" omitted. Using default value of 0.
occamy    | occamy-lib[140464925685504]: Parameter "reverse-connect" omitted. Using default value of 0.
occamy    | occamy-lib[140464925685504]: Parameter "listen-timeout" omitted. Using default value of 5000.
occamy    | occamyd: cairo-surface.c:2092: _cairo_surface_release_source_image: Assertion `!surface->finished' failed.
occamy    | SIGABRT: abort
occamy    | PC=0x7fc0da1d8337 m=23 sigcode=18446744073709551610
occamy    | 
occamy    | goroutine 0 [idle]:
occamy    | runtime: unknown pc 0x7fc0da1d8337
occamy    | stack: frame={sp:0x7fc089ff7898, fp:0x0} stack=[0x7fc0897fb0e8,0x7fc089fface8)
occamy    | 00007fc089ff7798:  000000000000006b  000000000000006b 
occamy    | 00007fc089ff77a8:  00007fc089ff7a20  00007fc05c006cf0 
occamy    | 00007fc089ff77b8:  00007fc089ff78f8  00007fc08c058800 
occamy    | 00007fc089ff77c8:  00007fc0da219e1c  000000fffbad8000 
occamy    | 00007fc089ff77d8:  00007fc05c006cf0  00007fc05c006d55 
occamy    | 00007fc089ff77e8:  00007fc05c006cf0  00007fc05c006cf0 
occamy    | 00007fc089ff77f8:  00007fc05c006d5b  00007fc05c006e1c 
occamy    | 00007fc089ff7808:  00007fc05c006cf0  00007fc05c006e1c 
occamy    | 00007fc089ff7818:  0000000000000000  0000000000000000 
occamy    | 00007fc089ff7828:  0000000000000000  0000000000000000 
occamy    | 00007fc089ff7838:  0000000000000000  0000000000c795c0 
occamy    | 00007fc089ff7848:  000000c0004a2340  0000000000000000 
occamy    | 00007fc089ff7858:  0000000000000000  0000000000000000 
occamy    | 00007fc089ff7868:  00007fc0dabb9000  00007fc0da32cbe0 
occamy    | 00007fc089ff7878:  00007fc0d9f61fb1  00007fc0d9f62340 
occamy    | 00007fc089ff7888:  000000000000000c  00007fc08c058800 
occamy    | 00007fc089ff7898: <00007fc0da1d9a28  0000000000000020 
occamy    | 00007fc089ff78a8:  0000000000000000  0000000000000000 
occamy    | 00007fc089ff78b8:  0000000000000000  0000000000000000 
occamy    | 00007fc089ff78c8:  0000000000000000  0000000000000000 
occamy    | 00007fc089ff78d8:  0000000000000000  0000000000000000 
occamy    | 00007fc089ff78e8:  0000000000000000  0000000000000000 
occamy    | 00007fc089ff78f8:  0000000000000000  0000000000000000 
occamy    | 00007fc089ff7908:  0000000000000000  0000000000000000 
occamy    | 00007fc089ff7918:  0000000000000000  00007ffec221ad48 
occamy    | 00007fc089ff7928:  00007fc0da329cf0  00007fc0d9f61f4d 
occamy    | 00007fc089ff7938:  000000000000082c  0000000000000000 
occamy    | 00007fc089ff7948:  00007fc0da1d2b53  00007fc089ff7930 
occamy    | 00007fc089ff7958:  0000000000000004  0000000000000000 
occamy    | 00007fc089ff7968:  0000000000000000  0000000000000000 
occamy    | 00007fc089ff7978:  0000000000000000  0000000000000000 
occamy    | 00007fc089ff7988:  0000000000000000  0000000500000000 
occamy    | runtime: unknown pc 0x7fc0da1d8337
occamy    | stack: frame={sp:0x7fc089ff7898, fp:0x0} stack=[0x7fc0897fb0e8,0x7fc089fface8)
occamy    | 00007fc089ff7798:  000000000000006b  000000000000006b 
occamy    | 00007fc089ff77a8:  00007fc089ff7a20  00007fc05c006cf0 
occamy    | 00007fc089ff77b8:  00007fc089ff78f8  00007fc08c058800 
occamy    | 00007fc089ff77c8:  00007fc0da219e1c  000000fffbad8000 
occamy    | 00007fc089ff77d8:  00007fc05c006cf0  00007fc05c006d55 
occamy    | 00007fc089ff77e8:  00007fc05c006cf0  00007fc05c006cf0 
occamy    | 00007fc089ff77f8:  00007fc05c006d5b  00007fc05c006e1c 
occamy    | 00007fc089ff7808:  00007fc05c006cf0  00007fc05c006e1c 
occamy    | 00007fc089ff7818:  0000000000000000  0000000000000000 
occamy    | 00007fc089ff7828:  0000000000000000  0000000000000000 
occamy    | 00007fc089ff7838:  0000000000000000  0000000000c795c0 
occamy    | 00007fc089ff7848:  000000c0004a2340  0000000000000000 
occamy    | 00007fc089ff7858:  0000000000000000  0000000000000000 
occamy    | 00007fc089ff7868:  00007fc0dabb9000  00007fc0da32cbe0 
occamy    | 00007fc089ff7878:  00007fc0d9f61fb1  00007fc0d9f62340 
occamy    | 00007fc089ff7888:  000000000000000c  00007fc08c058800 
occamy    | 00007fc089ff7898: <00007fc0da1d9a28  0000000000000020 
occamy    | 00007fc089ff78a8:  0000000000000000  0000000000000000 
occamy    | 00007fc089ff78b8:  0000000000000000  0000000000000000 
occamy    | 00007fc089ff78c8:  0000000000000000  0000000000000000 
occamy    | 00007fc089ff78d8:  0000000000000000  0000000000000000 
occamy    | 00007fc089ff78e8:  0000000000000000  0000000000000000 
occamy    | 00007fc089ff78f8:  0000000000000000  0000000000000000 
occamy    | 00007fc089ff7908:  0000000000000000  0000000000000000 
occamy    | 00007fc089ff7918:  0000000000000000  00007ffec221ad48 
occamy    | 00007fc089ff7928:  00007fc0da329cf0  00007fc0d9f61f4d 
occamy    | 00007fc089ff7938:  000000000000082c  0000000000000000 
occamy    | 00007fc089ff7948:  00007fc0da1d2b53  00007fc089ff7930 
occamy    | 00007fc089ff7958:  0000000000000004  0000000000000000 
occamy    | 00007fc089ff7968:  0000000000000000  0000000000000000 
occamy    | 00007fc089ff7978:  0000000000000000  0000000000000000 
occamy    | 00007fc089ff7988:  0000000000000000  0000000500000000 
occamy    | 
occamy    | goroutine 73 [syscall]:
occamy    | runtime.cgocall(0x9f3a40, 0xc0005bd190, 0xc05c002c80)
occamy    |     /golang/go/src/runtime/cgocall.go:133 +0x5b fp=0xc0005bd160 sp=0xc0005bd128 pc=0x40572b
occamy    | github.com/changkun/occamy/lib._Cfunc_join_handler_bridge(0x7fc05c002990, 0x7fc00000000e, 0x7fc05c002c80, 0x0)
occamy    |     _cgo_gotypes.go:525 +0x4d fp=0xc0005bd190 sp=0xc0005bd160 pc=0x9eacad
occamy    | github.com/changkun/occamy/lib.(*User).Prepare.func5(0xc0002db300, 0xc00017c1c0, 0xe, 0xe, 0x7fc05c002c80, 0x0)
occamy    |     /occamy/lib/user.go:221 +0x8e fp=0xc0005bd1c8 sp=0xc0005bd190 pc=0x9edeae
occamy    | github.com/changkun/occamy/lib.(*User).Prepare(0xc0002db300, 0x0, 0x0)
occamy    |     /occamy/lib/user.go:221 +0x5b3 fp=0xc0005bd2a0 sp=0xc0005bd1c8 pc=0x9ecb23
occamy    | github.com/changkun/occamy/server.(*Session).Join(0xc000307d70, 0xc0004b14a0, 0xc000367658, 0x0, 0xc0005bd550, 0x0, 0x0)
occamy    |     /occamy/server/session.go:84 +0x3f7 fp=0xc0005bd4e8 sp=0xc0005bd2a0 pc=0x9f20e7
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc00000e580, 0xc0004b14a0, 0xc000367658, 0x8, 0xc0004bf178)
occamy    |     /occamy/server/routers.go:58 +0x3a8 fp=0xc0005bd570 sp=0xc0005bd4e8 pc=0x9f1a28
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc00000e580, 0xc0004d8210)
occamy    |     /occamy/server/routers.go:46 +0x447 fp=0xc0005bd7b8 sp=0xc0005bd570 pc=0x9f1467
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS-fm(0xc0004d8210)
occamy    |     /occamy/server/routers.go:31 +0x34 fp=0xc0005bd7d8 sp=0xc0005bd7b8 pc=0x9f3484
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0004d8210)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b fp=0xc0005bd7f8 sp=0xc0005bd7d8 pc=0x9a918b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc00011c7e0, 0xc0004d8210)
occamy    |     /occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf fp=0xc0005bd868 sp=0xc0005bd7f8 pc=0x9be1ff
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc0004d8210)
occamy    |     /occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34 fp=0xc0005bd888 sp=0xc0005bd868 pc=0x9c0f94
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0004d8210)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b fp=0xc0005bd8a8 sp=0xc0005bd888 pc=0x9a918b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc0004d8210)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x60 fp=0xc0005bd8e8 sp=0xc0005bd8a8 pc=0x9bbda0
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0004d8210)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b fp=0xc0005bd908 sp=0xc0005bd8e8 pc=0x9a918b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc0004d8210)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1 fp=0xc0005bdaa8 sp=0xc0005bd908 pc=0x9bae51
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0004d8210)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b fp=0xc0005bdac8 sp=0xc0005bdaa8 pc=0x9a918b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc000136640, 0xc0004d8210)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b0 fp=0xc0005bdbb0 sp=0xc0005bdac8 pc=0x9b26d0
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc000136640, 0xc77d40, 0xc0004ba2a0, 0xc0004aa200)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x133 fp=0xc0005bdbe8 sp=0xc0005bdbb0 pc=0x9b1f03
occamy    | net/http.serverHandler.ServeHTTP(0xc00017c0e0, 0xc77d40, 0xc0004ba2a0, 0xc0004aa200)
occamy    |     /golang/go/src/net/http/server.go:2807 +0xa3 fp=0xc0005bdc18 sp=0xc0005bdbe8 pc=0x6d5813
occamy    | net/http.(*conn).serve(0xc00045a1e0, 0xc795c0, 0xc0004a2340)
occamy    |     /golang/go/src/net/http/server.go:1895 +0x86c fp=0xc0005bdfc8 sp=0xc0005bdc18 pc=0x6d118c
occamy    | runtime.goexit()
occamy    |     /golang/go/src/runtime/asm_amd64.s:1375 +0x1 fp=0xc0005bdfd0 sp=0xc0005bdfc8 pc=0x469271
occamy    | created by net/http.(*Server).Serve
occamy    |     /golang/go/src/net/http/server.go:2933 +0x35c
occamy    | 
occamy    | goroutine 1 [IO wait, locked to thread]:
occamy    | internal/poll.runtime_pollWait(0x7fc0ad8c0f48, 0x72, 0x0)
occamy    |     /golang/go/src/runtime/netpoll.go:203 +0x55
occamy    | internal/poll.(*pollDesc).wait(0xc00016a198, 0x72, 0x0, 0x0, 0xb60197)
occamy    |     /golang/go/src/internal/poll/fd_poll_runtime.go:87 +0x45
occamy    | internal/poll.(*pollDesc).waitRead(...)
occamy    |     /golang/go/src/internal/poll/fd_poll_runtime.go:92
occamy    | internal/poll.(*FD).Accept(0xc00016a180, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/internal/poll/fd_unix.go:384 +0x1d4
occamy    | net.(*netFD).accept(0xc00016a180, 0x484f01e265c25fdb, 0x0, 0x484f01e265c25fdb)
occamy    |     /golang/go/src/net/fd_unix.go:238 +0x42
occamy    | net.(*TCPListener).accept(0xc00000e920, 0x5e4ad5f4, 0xc000159cf0, 0x48a536)
occamy    |     /golang/go/src/net/tcpsock_posix.go:139 +0x32
occamy    | net.(*TCPListener).Accept(0xc00000e920, 0xc000159d40, 0x18, 0xc000000180, 0x6d5cbc)
occamy    |     /golang/go/src/net/tcpsock.go:261 +0x64
occamy    | net/http.(*Server).Serve(0xc00017c0e0, 0xc77a80, 0xc00000e920, 0x0, 0x0)
occamy    |     /golang/go/src/net/http/server.go:2901 +0x25d
occamy    | net/http.(*Server).ListenAndServe(0xc00017c0e0, 0x4, 0xb748a6)
occamy    |     /golang/go/src/net/http/server.go:2830 +0xb7
occamy    | github.com/changkun/occamy/server.(*proxy).serve(0xc00000e580)
occamy    |     /occamy/server/connection.go:70 +0x219
occamy    | github.com/changkun/occamy/server.Run(...)
occamy    |     /occamy/server/connection.go:39
occamy    | main.main()
occamy    |     /occamy/occamy.go:18 +0xe4
occamy    | 
occamy    | goroutine 34 [syscall]:
occamy    | os/signal.signal_recv(0x0)
occamy    |     /golang/go/src/runtime/sigqueue.go:147 +0x9c
occamy    | os/signal.loop()
occamy    |     /golang/go/src/os/signal/signal_unix.go:23 +0x22
occamy    | created by os/signal.Notify.func1
occamy    |     /golang/go/src/os/signal/signal.go:127 +0x44
occamy    | 
occamy    | goroutine 7 [chan receive]:
occamy    | github.com/changkun/occamy/server.(*proxy).serve.func1(0xc00017c0e0, 0xc00007e1e0)
occamy    |     /occamy/server/connection.go:60 +0xe9
occamy    | created by github.com/changkun/occamy/server.(*proxy).serve
occamy    |     /occamy/server/connection.go:57 +0x17c
occamy    | 
occamy    | goroutine 8 [IO wait]:
occamy    | internal/poll.runtime_pollWait(0x7fc0ad8c0e68, 0x72, 0xffffffffffffffff)
occamy    |     /golang/go/src/runtime/netpoll.go:203 +0x55
occamy    | internal/poll.(*pollDesc).wait(0xc00016a218, 0x72, 0x1000, 0x1000, 0xffffffffffffffff)
occamy    |     /golang/go/src/internal/poll/fd_poll_runtime.go:87 +0x45
occamy    | internal/poll.(*pollDesc).waitRead(...)
occamy    |     /golang/go/src/internal/poll/fd_poll_runtime.go:92
occamy    | internal/poll.(*FD).Read(0xc00016a200, 0xc000268000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/internal/poll/fd_unix.go:169 +0x19b
occamy    | net.(*netFD).Read(0xc00016a200, 0xc000268000, 0x1000, 0x1000, 0x1aa, 0x0, 0x4cf6d2)
occamy    |     /golang/go/src/net/fd_unix.go:202 +0x4f
occamy    | net.(*conn).Read(0xc0000101c0, 0xc000268000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/net/net.go:184 +0x8e
occamy    | net/http.(*connReader).Read(0xc00025e3c0, 0xc000268000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/net/http/server.go:786 +0xf4
occamy    | bufio.(*Reader).fill(0xc00008ed20)
occamy    |     /golang/go/src/bufio/bufio.go:100 +0x103
occamy    | bufio.(*Reader).Peek(0xc00008ed20, 0x4, 0x0, 0x0, 0x0, 0x0, 0x4393c0)
occamy    |     /golang/go/src/bufio/bufio.go:138 +0x4f
occamy    | net/http.(*conn).readRequest(0xc000117360, 0xc795c0, 0xc000258700, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/net/http/server.go:963 +0xc76
occamy    | net/http.(*conn).serve(0xc000117360, 0xc795c0, 0xc000258700)
occamy    |     /golang/go/src/net/http/server.go:1822 +0x6d4
occamy    | created by net/http.(*Server).Serve
occamy    |     /golang/go/src/net/http/server.go:2933 +0x35c
occamy    | 
occamy    | goroutine 132 [syscall]:
occamy    | syscall.Syscall(0x0, 0x21, 0xc00052e000, 0x2000, 0xc0001b42f8, 0xc0001a6880, 0xc00032c5a0)
occamy    |     /golang/go/src/syscall/asm_linux_amd64.s:18 +0x5
occamy    | syscall.read(0x21, 0xc00052e000, 0x2000, 0x2000, 0x9e170b, 0xc0001b42a0, 0xc591f4)
occamy    |     /golang/go/src/syscall/zsyscall_linux_amd64.go:686 +0x5a
occamy    | syscall.Read(...)
occamy    |     /golang/go/src/syscall/syscall_unix.go:189
occamy    | github.com/changkun/occamy/protocol.IO.Read(0x21, 0xc00052e000, 0x2000, 0x2000, 0x2a, 0x0, 0x0)
occamy    |     /occamy/protocol/io.go:21 +0x49
occamy    | bufio.(*Reader).fill(0xc0003372c0)
occamy    |     /golang/go/src/bufio/bufio.go:100 +0x103
occamy    | bufio.(*Reader).ReadSlice(0xc0003372c0, 0x3b, 0x28, 0xc000338030, 0xc0001f6000, 0xc00032c748, 0x9d8b67)
occamy    |     /golang/go/src/bufio/bufio.go:359 +0x3d
occamy    | bufio.(*Reader).ReadBytes(0xc0003372c0, 0x3b, 0xc000338030, 0x28, 0x28, 0x0, 0x0)
occamy    |     /golang/go/src/bufio/bufio.go:438 +0x7a
occamy    | github.com/changkun/occamy/protocol.(*InstructionIO).ReadRaw(...)
occamy    |     /occamy/protocol/instruction.go:156
occamy    | github.com/changkun/occamy/server.(*Session).serveIO.func1(0xc000337320, 0xc000308840, 0xc00030cd60, 0xc0001f6000)
occamy    |     /occamy/server/session.go:119 +0x41
occamy    | created by github.com/changkun/occamy/server.(*Session).serveIO
occamy    |     /occamy/server/session.go:116 +0xbb
occamy    | 
occamy    | goroutine 104 [syscall]:
occamy    | github.com/changkun/occamy/lib._Cfunc_guac_user_input_thread(0x7fc074002a00, 0x7fc000e4e1c0)
occamy    |     _cgo_gotypes.go:497 +0x41
occamy    | github.com/changkun/occamy/lib.(*User).HandleConnection.func2(0xc0002d8000)
occamy    |     /occamy/lib/user.go:239 +0x5d
occamy    | github.com/changkun/occamy/lib.(*User).HandleConnection(0xc0002d8000, 0xc00007e4e0)
occamy    |     /occamy/lib/user.go:239 +0x3d
occamy    | created by github.com/changkun/occamy/server.(*Session).Join
occamy    |     /occamy/server/session.go:93 +0x51a
occamy    | 
occamy    | goroutine 99 [chan receive]:
occamy    | github.com/changkun/occamy/server.(*Session).serveIO(0xc000307d70, 0xc0003a03e0, 0xc000135340, 0xc0002368a0, 0xc0003c5980)
occamy    |     /occamy/server/session.go:148 +0x121
occamy    | github.com/changkun/occamy/server.(*Session).Join(0xc000307d70, 0xc000135340, 0xc000363658, 0x0, 0xc0002e7550, 0x0, 0x0)
occamy    |     /occamy/server/session.go:99 +0x59b
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc00000e580, 0xc000135340, 0xc000363658, 0x8, 0xc00011d198)
occamy    |     /occamy/server/routers.go:58 +0x3a8
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc00000e580, 0xc00012a370)
occamy    |     /occamy/server/routers.go:46 +0x447
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00012a370)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc00011c7e0, 0xc00012a370)
occamy    |     /occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc00012a370)
occamy    |     /occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00012a370)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc00012a370)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x60
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00012a370)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc00012a370)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00012a370)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc000136640, 0xc00012a370)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b0
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc000136640, 0xc77d40, 0xc00017c2a0, 0xc00014ed00)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x133
occamy    | net/http.serverHandler.ServeHTTP(0xc00017c0e0, 0xc77d40, 0xc00017c2a0, 0xc00014ed00)
occamy    |     /golang/go/src/net/http/server.go:2807 +0xa3
occamy    | net/http.(*conn).serve(0xc000117900, 0xc795c0, 0xc000070bc0)
occamy    |     /golang/go/src/net/http/server.go:1895 +0x86c
occamy    | created by net/http.(*Server).Serve
occamy    |     /golang/go/src/net/http/server.go:2933 +0x35c
occamy    | 
occamy    | goroutine 98 [chan receive]:
occamy    | github.com/changkun/occamy/server.(*Session).serveIO(0xc000307d70, 0xc00000f0e0, 0xc0004b09a0, 0xc00007e4e0, 0xc0002d8000)
occamy    |     /occamy/server/session.go:148 +0x121
occamy    | github.com/changkun/occamy/server.(*Session).Join(0xc000307d70, 0xc0004b09a0, 0xc000365658, 0x0, 0xc000233550, 0x0, 0x0)
occamy    |     /occamy/server/session.go:99 +0x59b
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc00000e580, 0xc0004b09a0, 0xc000365658, 0x8, 0xc0004be8a8)
occamy    |     /occamy/server/routers.go:58 +0x3a8
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc00000e580, 0xc0001bc000)
occamy    |     /occamy/server/routers.go:46 +0x447
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0001bc000)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc00011c7e0, 0xc0001bc000)
occamy    |     /occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc0001bc000)
occamy    |     /occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0001bc000)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc0001bc000)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x60
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0001bc000)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc0001bc000)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0001bc000)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc000136640, 0xc0001bc000)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b0
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc000136640, 0xc77d40, 0xc0004ba0e0, 0xc0001ae500)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x133
occamy    | net/http.serverHandler.ServeHTTP(0xc00017c0e0, 0xc77d40, 0xc0004ba0e0, 0xc0001ae500)
occamy    |     /golang/go/src/net/http/server.go:2807 +0xa3
occamy    | net/http.(*conn).serve(0xc000117860, 0xc795c0, 0xc0001926c0)
occamy    |     /golang/go/src/net/http/server.go:1895 +0x86c
occamy    | created by net/http.(*Server).Serve
occamy    |     /golang/go/src/net/http/server.go:2933 +0x35c
occamy    | 
occamy    | goroutine 48 [runnable]:
occamy    | github.com/gorilla/websocket.(*Conn).WriteMessage(0xc0001f6580, 0x1, 0xc0005ca000, 0x28, 0x28, 0x0, 0x0)
occamy    |     /occamy/vendor/github.com/gorilla/websocket/conn.go:740 +0x2d8
occamy    | github.com/changkun/occamy/server.(*Session).serveIO.func1(0xc000189320, 0xc0001968b0, 0xc000190e60, 0xc0001f6580)
occamy    |     /occamy/server/session.go:123 +0x92
occamy    | created by github.com/changkun/occamy/server.(*Session).serveIO
occamy    |     /occamy/server/session.go:116 +0xbb
occamy    | 
occamy    | goroutine 12 [IO wait]:
occamy    | internal/poll.runtime_pollWait(0x7fc0ad8c0a08, 0x72, 0xffffffffffffffff)
occamy    |     /golang/go/src/runtime/netpoll.go:203 +0x55
occamy    | internal/poll.(*pollDesc).wait(0xc00016a418, 0x72, 0x1000, 0x1000, 0xffffffffffffffff)
occamy    |     /golang/go/src/internal/poll/fd_poll_runtime.go:87 +0x45
occamy    | internal/poll.(*pollDesc).waitRead(...)
occamy    |     /golang/go/src/internal/poll/fd_poll_runtime.go:92
occamy    | internal/poll.(*FD).Read(0xc00016a400, 0xc0002ab000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/internal/poll/fd_unix.go:169 +0x19b
occamy    | net.(*netFD).Read(0xc00016a400, 0xc0002ab000, 0x1000, 0x1000, 0x1aa, 0x0, 0x4cf6d2)
occamy    |     /golang/go/src/net/fd_unix.go:202 +0x4f
occamy    | net.(*conn).Read(0xc0000101e0, 0xc0002ab000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/net/net.go:184 +0x8e
occamy    | net/http.(*connReader).Read(0xc00028a630, 0xc0002ab000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/net/http/server.go:786 +0xf4
occamy    | bufio.(*Reader).fill(0xc000073260)
occamy    |     /golang/go/src/bufio/bufio.go:100 +0x103
occamy    | bufio.(*Reader).Peek(0xc000073260, 0x4, 0x0, 0x0, 0x0, 0x0, 0x4393c0)
occamy    |     /golang/go/src/bufio/bufio.go:138 +0x4f
occamy    | net/http.(*conn).readRequest(0xc0001175e0, 0xc795c0, 0xc000070a00, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/net/http/server.go:963 +0xc76
occamy    | net/http.(*conn).serve(0xc0001175e0, 0xc795c0, 0xc000070a00)
occamy    |     /golang/go/src/net/http/server.go:1822 +0x6d4
occamy    | created by net/http.(*Server).Serve
occamy    |     /golang/go/src/net/http/server.go:2933 +0x35c
occamy    | 
occamy    | goroutine 31 [IO wait]:
occamy    | internal/poll.runtime_pollWait(0x7fc0ad8c03e8, 0x72, 0xffffffffffffffff)
occamy    |     /golang/go/src/runtime/netpoll.go:203 +0x55
occamy    | internal/poll.(*pollDesc).wait(0xc00016a818, 0x72, 0x2000, 0x2000, 0xffffffffffffffff)
occamy    |     /golang/go/src/internal/poll/fd_poll_runtime.go:87 +0x45
occamy    | internal/poll.(*pollDesc).waitRead(...)
occamy    |     /golang/go/src/internal/poll/fd_poll_runtime.go:92
occamy    | internal/poll.(*FD).Read(0xc00016a800, 0xc000370000, 0x2000, 0x2000, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/internal/poll/fd_unix.go:169 +0x19b
occamy    | net.(*netFD).Read(0xc00016a800, 0xc000370000, 0x2000, 0x2000, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/net/fd_unix.go:202 +0x4f
occamy    | net.(*conn).Read(0xc0000101f8, 0xc000370000, 0x2000, 0x2000, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/net/net.go:184 +0x8e
occamy    | bufio.(*Reader).fill(0xc000336de0)
occamy    |     /golang/go/src/bufio/bufio.go:100 +0x103
occamy    | bufio.(*Reader).Peek(0xc000336de0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/bufio/bufio.go:138 +0x4f
occamy    | github.com/gorilla/websocket.(*Conn).read(0xc00036a580, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0)
occamy    |     /occamy/vendor/github.com/gorilla/websocket/conn.go:357 +0x40
occamy    | github.com/gorilla/websocket.(*Conn).advanceFrame(0xc00036a580, 0x0, 0x0, 0x0)
occamy    |     /occamy/vendor/github.com/gorilla/websocket/conn.go:787 +0x5c
occamy    | github.com/gorilla/websocket.(*Conn).NextReader(0xc00036a580, 0x0, 0x0, 0x0, 0x0, 0x0)
occamy    |     /occamy/vendor/github.com/gorilla/websocket/conn.go:947 +0x8f
occamy    | github.com/gorilla/websocket.(*Conn).ReadMessage(0xc00036a580, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0)
occamy    |     /occamy/vendor/github.com/gorilla/websocket/conn.go:1028 +0x2f
occamy    | github.com/changkun/occamy/server.(*Session).serveIO.func2(0xc00008f680, 0xc00024ac40, 0xc0003a0320, 0xc00036a580)
occamy    |     /occamy/server/session.go:135 +0x3a
occamy    | created by github.com/changkun/occamy/server.(*Session).serveIO
occamy    |     /occamy/server/session.go:132 +0x101
occamy    | 
occamy    | goroutine 105 [runnable]:
occamy    | github.com/gorilla/websocket.(*Conn).WriteMessage(0xc0004b09a0, 0x1, 0xc0002fc000, 0x28, 0x28, 0x0, 0x0)
occamy    |     /occamy/vendor/github.com/gorilla/websocket/conn.go:740 +0x2d8
occamy    | github.com/changkun/occamy/server.(*Session).serveIO.func1(0xc000073b60, 0xc00002ae90, 0xc00000f0e0, 0xc0004b09a0)
occamy    |     /occamy/server/session.go:123 +0x92
occamy    | created by github.com/changkun/occamy/server.(*Session).serveIO
occamy    |     /occamy/server/session.go:116 +0xbb
occamy    | 
occamy    | goroutine 106 [IO wait]:
occamy    | internal/poll.runtime_pollWait(0x7fc0ad8c0068, 0x72, 0xffffffffffffffff)
occamy    |     /golang/go/src/runtime/netpoll.go:203 +0x55
occamy    | internal/poll.(*pollDesc).wait(0xc00016a898, 0x72, 0x2000, 0x2000, 0xffffffffffffffff)
occamy    |     /golang/go/src/internal/poll/fd_poll_runtime.go:87 +0x45
occamy    | internal/poll.(*pollDesc).waitRead(...)
occamy    |     /golang/go/src/internal/poll/fd_poll_runtime.go:92
occamy    | internal/poll.(*FD).Read(0xc00016a880, 0xc0004dc000, 0x2000, 0x2000, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/internal/poll/fd_unix.go:169 +0x19b
occamy    | net.(*netFD).Read(0xc00016a880, 0xc0004dc000, 0x2000, 0x2000, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/net/fd_unix.go:202 +0x4f
occamy    | net.(*conn).Read(0xc000010200, 0xc0004dc000, 0x2000, 0x2000, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/net/net.go:184 +0x8e
occamy    | bufio.(*Reader).fill(0xc0004a6360)
occamy    |     /golang/go/src/bufio/bufio.go:100 +0x103
occamy    | bufio.(*Reader).Peek(0xc0004a6360, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/bufio/bufio.go:138 +0x4f
occamy    | github.com/gorilla/websocket.(*Conn).read(0xc0004b09a0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0)
occamy    |     /occamy/vendor/github.com/gorilla/websocket/conn.go:357 +0x40
occamy    | github.com/gorilla/websocket.(*Conn).advanceFrame(0xc0004b09a0, 0x40b94b, 0xc000012000, 0x43947c)
occamy    |     /occamy/vendor/github.com/gorilla/websocket/conn.go:787 +0x5c
occamy    | github.com/gorilla/websocket.(*Conn).NextReader(0xc0004b09a0, 0xc000049f40, 0x44b2cf, 0xc000072000, 0x4, 0xc000072000)
occamy    |     /occamy/vendor/github.com/gorilla/websocket/conn.go:947 +0x8f
occamy    | github.com/gorilla/websocket.(*Conn).ReadMessage(0xc0004b09a0, 0x7fc0ac079101, 0xc000049fc8, 0x6cb413, 0xc000070a80, 0xc69e01, 0xc00007c640)
occamy    |     /occamy/vendor/github.com/gorilla/websocket/conn.go:1028 +0x2f
occamy    | github.com/changkun/occamy/server.(*Session).serveIO.func2(0xc000073b60, 0xc00002ae90, 0xc00000f0e0, 0xc0004b09a0)
occamy    |     /occamy/server/session.go:135 +0x3a
occamy    | created by github.com/changkun/occamy/server.(*Session).serveIO
occamy    |     /occamy/server/session.go:132 +0x101
occamy    | 
occamy    | goroutine 146 [IO wait]:
occamy    | internal/poll.runtime_pollWait(0x7fc0ad8c04c8, 0x72, 0xffffffffffffffff)
occamy    |     /golang/go/src/runtime/netpoll.go:203 +0x55
occamy    | internal/poll.(*pollDesc).wait(0xc00009db18, 0x72, 0x2000, 0x2000, 0xffffffffffffffff)
occamy    |     /golang/go/src/internal/poll/fd_poll_runtime.go:87 +0x45
occamy    | internal/poll.(*pollDesc).waitRead(...)
occamy    |     /golang/go/src/internal/poll/fd_poll_runtime.go:92
occamy    | internal/poll.(*FD).Read(0xc00009db00, 0xc0004ec000, 0x2000, 0x2000, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/internal/poll/fd_unix.go:169 +0x19b
occamy    | net.(*netFD).Read(0xc00009db00, 0xc0004ec000, 0x2000, 0x2000, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/net/fd_unix.go:202 +0x4f
occamy    | net.(*conn).Read(0xc000098578, 0xc0004ec000, 0x2000, 0x2000, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/net/net.go:184 +0x8e
occamy    | bufio.(*Reader).fill(0xc0004a64e0)
occamy    |     /golang/go/src/bufio/bufio.go:100 +0x103
occamy    | bufio.(*Reader).Peek(0xc0004a64e0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/bufio/bufio.go:138 +0x4f
occamy    | github.com/gorilla/websocket.(*Conn).read(0xc0004b0f20, 0x2, 0xc000328000, 0xc00032e5e0, 0x43238a, 0xb8b008, 0x7fc0ad8c0790)
occamy    |     /occamy/vendor/github.com/gorilla/websocket/conn.go:357 +0x40
occamy    | github.com/gorilla/websocket.(*Conn).advanceFrame(0xc0004b0f20, 0x40b94b, 0xc000012000, 0x43947c)
occamy    |     /occamy/vendor/github.com/gorilla/websocket/conn.go:787 +0x5c
occamy    | github.com/gorilla/websocket.(*Conn).NextReader(0xc0004b0f20, 0xc00032e740, 0x44b2cf, 0xc000336180, 0x4, 0xc000336180)
occamy    |     /occamy/vendor/github.com/gorilla/websocket/conn.go:947 +0x8f
occamy    | github.com/gorilla/websocket.(*Conn).ReadMessage(0xc0004b0f20, 0x7fc0ac079101, 0xc00032e7c8, 0x6cb413, 0xc00030e300, 0xc69e01, 0xc0000bcc80)
occamy    |     /occamy/vendor/github.com/gorilla/websocket/conn.go:1028 +0x2f
occamy    | github.com/changkun/occamy/server.(*Session).serveIO.func2(0xc00008f740, 0xc00024ac50, 0xc0003a0360, 0xc0004b0f20)
occamy    |     /occamy/server/session.go:135 +0x3a
occamy    | created by github.com/changkun/occamy/server.(*Session).serveIO
occamy    |     /occamy/server/session.go:132 +0x101
occamy    | 
occamy    | goroutine 33 [runnable]:
occamy    | syscall.Syscall(0x0, 0x28, 0xc0003d8000, 0x2000, 0x2dd, 0x2000, 0x0)
occamy    |     /golang/go/src/syscall/asm_linux_amd64.s:18 +0x5
occamy    | syscall.read(0x28, 0xc0003d8000, 0x2000, 0x2000, 0x43ffbc, 0x4393c0, 0xb8b030)
occamy    |     /golang/go/src/syscall/zsyscall_linux_amd64.go:686 +0x5a
occamy    | syscall.Read(...)
occamy    |     /golang/go/src/syscall/syscall_unix.go:189
occamy    | github.com/changkun/occamy/protocol.IO.Read(0x28, 0xc0003d8000, 0x2000, 0x2000, 0x5, 0x7fc0ad8c0cd0, 0x203000)
occamy    |     /occamy/protocol/io.go:21 +0x49
occamy    | bufio.(*Reader).fill(0xc00008f6e0)
occamy    |     /golang/go/src/bufio/bufio.go:100 +0x103
occamy    | bufio.(*Reader).ReadSlice(0xc00008f6e0, 0xc00048203b, 0xc000257180, 0x7fc0dab677d0, 0x40b94b, 0xc000012000, 0x43947c)
occamy    |     /golang/go/src/bufio/bufio.go:359 +0x3d
occamy    | bufio.(*Reader).ReadBytes(0xc00008f6e0, 0x7fc0ac07913b, 0xc0000497c8, 0x6cb413, 0xc000258bc0, 0xc69e01, 0xc0000bce60)
occamy    |     /golang/go/src/bufio/bufio.go:438 +0x7a
occamy    | github.com/changkun/occamy/protocol.(*InstructionIO).ReadRaw(...)
occamy    |     /occamy/protocol/instruction.go:156
occamy    | github.com/changkun/occamy/server.(*Session).serveIO.func1(0xc00008f740, 0xc00024ac50, 0xc0003a0360, 0xc0004b0f20)
occamy    |     /occamy/server/session.go:119 +0x41
occamy    | created by github.com/changkun/occamy/server.(*Session).serveIO
occamy    |     /occamy/server/session.go:116 +0xbb
occamy    | 
occamy    | goroutine 32 [syscall]:
occamy    | github.com/changkun/occamy/lib._Cfunc_guac_user_input_thread(0x7fc074004800, 0x7fc000e4e1c0)
occamy    |     _cgo_gotypes.go:497 +0x41
occamy    | github.com/changkun/occamy/lib.(*User).HandleConnection.func2(0xc0002d9980)
occamy    |     /occamy/lib/user.go:239 +0x5d
occamy    | github.com/changkun/occamy/lib.(*User).HandleConnection(0xc0002d9980, 0xc0002367e0)
occamy    |     /occamy/lib/user.go:239 +0x3d
occamy    | created by github.com/changkun/occamy/server.(*Session).Join
occamy    |     /occamy/server/session.go:93 +0x51a
occamy    | 
occamy    | goroutine 47 [syscall]:
occamy    | github.com/changkun/occamy/lib._Cfunc_guac_user_input_thread(0x7fc074004b20, 0x7fc000e4e1c0)
occamy    |     _cgo_gotypes.go:497 +0x41
occamy    | github.com/changkun/occamy/lib.(*User).HandleConnection.func2(0xc00059e000)
occamy    |     /occamy/lib/user.go:239 +0x5d
occamy    | github.com/changkun/occamy/lib.(*User).HandleConnection(0xc00059e000, 0xc00019a6c0)
occamy    |     /occamy/lib/user.go:239 +0x3d
occamy    | created by github.com/changkun/occamy/server.(*Session).Join
occamy    |     /occamy/server/session.go:93 +0x51a
occamy    | 
occamy    | goroutine 30 [runnable]:
occamy    | syscall.Syscall(0x1, 0xe, 0xc00037200c, 0xc, 0xc, 0xc, 0x0)
occamy    |     /golang/go/src/syscall/asm_linux_amd64.s:18 +0x5
occamy    | syscall.write(0xe, 0xc00037200c, 0xc, 0x2002, 0x0, 0x416253, 0xc000316370)
occamy    |     /golang/go/src/syscall/zsyscall_linux_amd64.go:914 +0x5a
occamy    | syscall.Write(...)
occamy    |     /golang/go/src/syscall/syscall_unix.go:214
occamy    | internal/poll.(*FD).Write(0xc00016a800, 0xc00037200c, 0xc, 0x2002, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/internal/poll/fd_unix.go:268 +0x179
occamy    | net.(*netFD).Write(0xc00016a800, 0xc00037200c, 0xc, 0x2002, 0x0, 0x77, 0x0)
occamy    |     /golang/go/src/net/fd_unix.go:220 +0x4f
occamy    | net.(*conn).Write(0xc0000101f8, 0xc00037200c, 0xc, 0x2002, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/net/net.go:196 +0x8e
occamy    | github.com/gorilla/websocket.(*Conn).write(0xc00036a580, 0x1, 0x0, 0x0, 0x0, 0xc00037200c, 0xc, 0x2002, 0xc00002a360, 0x0, ...)
occamy    |     /occamy/vendor/github.com/gorilla/websocket/conn.go:378 +0x151
occamy    | github.com/gorilla/websocket.(*messageWriter).flushFrame(0xc000044718, 0xc00002a301, 0xc00002a360, 0x0, 0x0, 0x0, 0x0)
occamy    |     /occamy/vendor/github.com/gorilla/websocket/conn.go:595 +0x25f
occamy    | github.com/gorilla/websocket.(*Conn).WriteMessage(0xc00036a580, 0x1, 0xc00002a360, 0xa, 0xa, 0x0, 0x0)
occamy    |     /occamy/vendor/github.com/gorilla/websocket/conn.go:752 +0x247
occamy    | github.com/changkun/occamy/server.(*Session).serveIO.func1(0xc00008f680, 0xc00024ac40, 0xc0003a0320, 0xc00036a580)
occamy    |     /occamy/server/session.go:123 +0x92
occamy    | created by github.com/changkun/occamy/server.(*Session).serveIO
occamy    |     /occamy/server/session.go:116 +0xbb
occamy    | 
occamy    | goroutine 131 [syscall]:
occamy    | github.com/changkun/occamy/lib._Cfunc_guac_user_input_thread(0x7fc07c002a00, 0x7fc000e4e1c0)
occamy    |     _cgo_gotypes.go:497 +0x41
occamy    | github.com/changkun/occamy/lib.(*User).HandleConnection.func2(0xc000526000)
occamy    |     /occamy/lib/user.go:239 +0x5d
occamy    | github.com/changkun/occamy/lib.(*User).HandleConnection(0xc000526000, 0xc0003106c0)
occamy    |     /occamy/lib/user.go:239 +0x3d
occamy    | created by github.com/changkun/occamy/server.(*Session).Join
occamy    |     /occamy/server/session.go:93 +0x51a
occamy    | 
occamy    | goroutine 42 [chan receive]:
occamy    | github.com/changkun/occamy/server.(*Session).serveIO(0xc000307d70, 0xc00030cd60, 0xc0001f6000, 0xc0003106c0, 0xc000526000)
occamy    |     /occamy/server/session.go:148 +0x121
occamy    | github.com/changkun/occamy/server.(*Session).Join(0xc000307d70, 0xc0001f6000, 0xc0003a5658, 0x0, 0xc000525550, 0x0, 0x0)
occamy    |     /occamy/server/session.go:99 +0x59b
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc00000e580, 0xc0001f6000, 0xc0003a5658, 0x8, 0xc0001c1cc8)
occamy    |     /occamy/server/routers.go:58 +0x3a8
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc00000e580, 0xc0001bc0b0)
occamy    |     /occamy/server/routers.go:46 +0x447
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0001bc0b0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc00011c7e0, 0xc0001bc0b0)
occamy    |     /occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc0001bc0b0)
occamy    |     /occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0001bc0b0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc0001bc0b0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x60
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0001bc0b0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc0001bc0b0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0001bc0b0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc000136640, 0xc0001bc0b0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b0
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc000136640, 0xc77d40, 0xc0001b6460, 0xc0001ae600)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x133
occamy    | net/http.serverHandler.ServeHTTP(0xc00017c0e0, 0xc77d40, 0xc0001b6460, 0xc0001ae600)
occamy    |     /golang/go/src/net/http/server.go:2807 +0xa3
occamy    | net/http.(*conn).serve(0xc0001aa0a0, 0xc795c0, 0xc000192740)
occamy    |     /golang/go/src/net/http/server.go:1895 +0x86c
occamy    | created by net/http.(*Server).Serve
occamy    |     /golang/go/src/net/http/server.go:2933 +0x35c
occamy    | 
occamy    | goroutine 25 [chan receive]:
occamy    | github.com/changkun/occamy/server.(*Session).serveIO(0xc000307d70, 0xc00000e040, 0xc00036ab00, 0xc0004b4000, 0xc00059f980)
occamy    |     /occamy/server/session.go:148 +0x121
occamy    | github.com/changkun/occamy/server.(*Session).Join(0xc000307d70, 0xc00036ab00, 0xc0001eb658, 0x0, 0xc0005c1550, 0x0, 0x0)
occamy    |     /occamy/server/session.go:99 +0x59b
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc00000e580, 0xc00036ab00, 0xc0001eb658, 0x8, 0xc000508418)
occamy    |     /occamy/server/routers.go:58 +0x3a8
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc00000e580, 0xc00031c160)
occamy    |     /occamy/server/routers.go:46 +0x447
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00031c160)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc00011c7e0, 0xc00031c160)
occamy    |     /occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc00031c160)
occamy    |     /occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00031c160)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc00031c160)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x60
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00031c160)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc00031c160)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00031c160)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc000136640, 0xc00031c160)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b0
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc000136640, 0xc77d40, 0xc000318620, 0xc000356d00)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x133
occamy    | net/http.serverHandler.ServeHTTP(0xc00017c0e0, 0xc77d40, 0xc000318620, 0xc000356d00)
occamy    |     /golang/go/src/net/http/server.go:2807 +0xa3
occamy    | net/http.(*conn).serve(0xc0003ac0a0, 0xc795c0, 0xc00030ea40)
occamy    |     /golang/go/src/net/http/server.go:1895 +0x86c
occamy    | created by net/http.(*Server).Serve
occamy    |     /golang/go/src/net/http/server.go:2933 +0x35c
occamy    | 
occamy    | goroutine 23 [chan receive]:
occamy    | github.com/changkun/occamy/server.(*Session).serveIO(0xc000307d70, 0xc00030cde0, 0xc00040b4a0, 0xc000310780, 0xc000527980)
occamy    |     /occamy/server/session.go:148 +0x121
occamy    | github.com/changkun/occamy/server.(*Session).Join(0xc000307d70, 0xc00040b4a0, 0xc0001e7658, 0x0, 0xc000521550, 0x0, 0x0)
occamy    |     /occamy/server/session.go:99 +0x59b
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc00000e580, 0xc00040b4a0, 0xc0001e7658, 0x8, 0xc000423198)
occamy    |     /occamy/server/routers.go:58 +0x3a8
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc00000e580, 0xc00041c000)
occamy    |     /occamy/server/routers.go:46 +0x447
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00041c000)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc00011c7e0, 0xc00041c000)
occamy    |     /occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc00041c000)
occamy    |     /occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00041c000)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc00041c000)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x60
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00041c000)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc00041c000)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00041c000)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc000136640, 0xc00041c000)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b0
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc000136640, 0xc77d40, 0xc0004182a0, 0xc000356c00)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x133
occamy    | net/http.serverHandler.ServeHTTP(0xc00017c0e0, 0xc77d40, 0xc0004182a0, 0xc000356c00)
occamy    |     /golang/go/src/net/http/server.go:2807 +0xa3
occamy    | net/http.(*conn).serve(0xc0000bff40, 0xc795c0, 0xc00030e9c0)
occamy    |     /golang/go/src/net/http/server.go:1895 +0x86c
occamy    | created by net/http.(*Server).Serve
occamy    |     /golang/go/src/net/http/server.go:2933 +0x35c
occamy    | 
occamy    | goroutine 24 [chan receive]:
occamy    | github.com/changkun/occamy/server.(*Session).serveIO(0xc000307d70, 0xc0003a0360, 0xc0004b0f20, 0xc0002367e0, 0xc0002d9980)
occamy    |     /occamy/server/session.go:148 +0x121
occamy    | github.com/changkun/occamy/server.(*Session).Join(0xc000307d70, 0xc0004b0f20, 0xc0003a9658, 0x0, 0xc0002eb550, 0x0, 0x0)
occamy    |     /occamy/server/session.go:99 +0x59b
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc00000e580, 0xc0004b0f20, 0xc0003a9658, 0x8, 0xc0004becf8)
occamy    |     /occamy/server/routers.go:58 +0x3a8
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc00000e580, 0xc0004d80b0)
occamy    |     /occamy/server/routers.go:46 +0x447
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0004d80b0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc00011c7e0, 0xc0004d80b0)
occamy    |     /occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc0004d80b0)
occamy    |     /occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0004d80b0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc0004d80b0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x60
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0004d80b0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc0004d80b0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0004d80b0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc000136640, 0xc0004d80b0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b0
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc000136640, 0xc77d40, 0xc0004ba1c0, 0xc000356b00)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x133
occamy    | net/http.serverHandler.ServeHTTP(0xc00017c0e0, 0xc77d40, 0xc0004ba1c0, 0xc000356b00)
occamy    |     /golang/go/src/net/http/server.go:2807 +0xa3
occamy    | net/http.(*conn).serve(0xc0003ac000, 0xc795c0, 0xc00030e940)
occamy    |     /golang/go/src/net/http/server.go:1895 +0x86c
occamy    | created by net/http.(*Server).Serve
occamy    |     /golang/go/src/net/http/server.go:2933 +0x35c
occamy    | 
occamy    | goroutine 133 [IO wait]:
occamy    | internal/poll.runtime_pollWait(0x7fc0ac03dee8, 0x72, 0xffffffffffffffff)
occamy    |     /golang/go/src/runtime/netpoll.go:203 +0x55
occamy    | internal/poll.(*pollDesc).wait(0xc0001a6898, 0x72, 0x2000, 0x2000, 0xffffffffffffffff)
occamy    |     /golang/go/src/internal/poll/fd_poll_runtime.go:87 +0x45
occamy    | internal/poll.(*pollDesc).waitRead(...)
occamy    |     /golang/go/src/internal/poll/fd_poll_runtime.go:92
occamy    | internal/poll.(*FD).Read(0xc0001a6880, 0xc0001f4000, 0x2000, 0x2000, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/internal/poll/fd_unix.go:169 +0x19b
occamy    | net.(*netFD).Read(0xc0001a6880, 0xc0001f4000, 0x2000, 0x2000, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/net/fd_unix.go:202 +0x4f
occamy    | net.(*conn).Read(0xc00018e088, 0xc0001f4000, 0x2000, 0x2000, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/net/net.go:184 +0x8e
occamy    | bufio.(*Reader).fill(0xc000188d20)
occamy    |     /golang/go/src/bufio/bufio.go:100 +0x103
occamy    | bufio.(*Reader).Peek(0xc000188d20, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/bufio/bufio.go:138 +0x4f
occamy    | github.com/gorilla/websocket.(*Conn).read(0xc0001f6000, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0)
occamy    |     /occamy/vendor/github.com/gorilla/websocket/conn.go:357 +0x40
occamy    | github.com/gorilla/websocket.(*Conn).advanceFrame(0xc0001f6000, 0x40b94b, 0xc000012000, 0x43947c)
occamy    |     /occamy/vendor/github.com/gorilla/websocket/conn.go:787 +0x5c
occamy    | github.com/gorilla/websocket.(*Conn).NextReader(0xc0001f6000, 0xc00032ff40, 0x44b2cf, 0xc000336360, 0x4, 0xc000336360)
occamy    |     /occamy/vendor/github.com/gorilla/websocket/conn.go:947 +0x8f
occamy    | github.com/gorilla/websocket.(*Conn).ReadMessage(0xc0001f6000, 0x7fc0ac079101, 0xc00032ffc8, 0x6cb413, 0xc00030e780, 0xc69e01, 0xc000304730)
occamy    |     /occamy/vendor/github.com/gorilla/websocket/conn.go:1028 +0x2f
occamy    | github.com/changkun/occamy/server.(*Session).serveIO.func2(0xc000337320, 0xc000308840, 0xc00030cd60, 0xc0001f6000)
occamy    |     /occamy/server/session.go:135 +0x3a
occamy    | created by github.com/changkun/occamy/server.(*Session).serveIO
occamy    |     /occamy/server/session.go:132 +0x101
occamy    | 
occamy    | goroutine 16 [chan receive, locked to thread]:
occamy    | github.com/changkun/occamy/server.(*Session).serveIO(0xc000307d70, 0xc0003a0320, 0xc00036a580, 0xc000236780, 0xc0003c4000)
occamy    |     /occamy/server/session.go:148 +0x121
occamy    | github.com/changkun/occamy/server.(*Session).Join(0xc000307d70, 0xc00036a580, 0xc00022f658, 0x1, 0xc00022f550, 0x0, 0x0)
occamy    |     /occamy/server/session.go:99 +0x59b
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc00000e580, 0xc00036a580, 0xc00022f658, 0x8, 0xc000333ee8)
occamy    |     /occamy/server/routers.go:70 +0x269
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc00000e580, 0xc00031c000)
occamy    |     /occamy/server/routers.go:46 +0x447
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00031c000)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc00011c7e0, 0xc00031c000)
occamy    |     /occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc00031c000)
occamy    |     /occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00031c000)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc00031c000)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x60
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00031c000)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc00031c000)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00031c000)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc000136640, 0xc00031c000)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b0
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc000136640, 0xc77d40, 0xc000318540, 0xc000356f00)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x133
occamy    | net/http.serverHandler.ServeHTTP(0xc00017c0e0, 0xc77d40, 0xc000318540, 0xc000356f00)
occamy    |     /golang/go/src/net/http/server.go:2807 +0xa3
occamy    | net/http.(*conn).serve(0xc0001177c0, 0xc795c0, 0xc00030eb40)
occamy    |     /golang/go/src/net/http/server.go:1895 +0x86c
occamy    | created by net/http.(*Server).Serve
occamy    |     /golang/go/src/net/http/server.go:2933 +0x35c
occamy    | 
occamy    | goroutine 26 [chan receive]:
occamy    | github.com/changkun/occamy/server.(*Session).serveIO(0xc000307d70, 0xc000190e60, 0xc0001f6580, 0xc00019a6c0, 0xc00059e000)
occamy    |     /occamy/server/session.go:148 +0x121
occamy    | github.com/changkun/occamy/server.(*Session).Join(0xc000307d70, 0xc0001f6580, 0xc0001ed658, 0x0, 0xc00059d550, 0x0, 0x0)
occamy    |     /occamy/server/session.go:99 +0x59b
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc00000e580, 0xc0001f6580, 0xc0001ed658, 0x8, 0xc0001f81d8)
occamy    |     /occamy/server/routers.go:58 +0x3a8
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc00000e580, 0xc0001bc210)
occamy    |     /occamy/server/routers.go:46 +0x447
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0001bc210)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc00011c7e0, 0xc0001bc210)
occamy    |     /occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc0001bc210)
occamy    |     /occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0001bc210)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc0001bc210)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x60
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0001bc210)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc0001bc210)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0001bc210)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc000136640, 0xc0001bc210)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b0
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc000136640, 0xc77d40, 0xc0001b6540, 0xc000356e00)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x133
occamy    | net/http.serverHandler.ServeHTTP(0xc00017c0e0, 0xc77d40, 0xc0001b6540, 0xc000356e00)
occamy    |     /golang/go/src/net/http/server.go:2807 +0xa3
occamy    | net/http.(*conn).serve(0xc0003ac140, 0xc795c0, 0xc00030eac0)
occamy    |     /golang/go/src/net/http/server.go:1895 +0x86c
occamy    | created by net/http.(*Server).Serve
occamy    |     /golang/go/src/net/http/server.go:2933 +0x35c
occamy    | 
occamy    | goroutine 29 [syscall]:
occamy    | github.com/changkun/occamy/lib._Cfunc_guac_user_input_thread(0x7fc098023ba0, 0x7fc000e4e1c0)
occamy    |     _cgo_gotypes.go:497 +0x41
occamy    | github.com/changkun/occamy/lib.(*User).HandleConnection.func2(0xc0003c4000)
occamy    |     /occamy/lib/user.go:239 +0x5d
occamy    | github.com/changkun/occamy/lib.(*User).HandleConnection(0xc0003c4000, 0xc000236780)
occamy    |     /occamy/lib/user.go:239 +0x3d
occamy    | created by github.com/changkun/occamy/server.(*Session).Join
occamy    |     /occamy/server/session.go:93 +0x51a
occamy    | 
occamy    | goroutine 27 [semacquire]:
occamy    | sync.runtime_SemacquireMutex(0xc00000e594, 0xc000098500, 0x1)
occamy    |     /golang/go/src/runtime/sema.go:71 +0x47
occamy    | sync.(*Mutex).lockSlow(0xc00000e590)
occamy    |     /golang/go/src/sync/mutex.go:138 +0xfc
occamy    | sync.(*Mutex).Lock(...)
occamy    |     /golang/go/src/sync/mutex.go:81
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc00000e580, 0xc000253ce0, 0xc0001e9658, 0x8, 0xc0003ae428)
occamy    |     /occamy/server/routers.go:55 +0x3d5
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc00000e580, 0xc000250370)
occamy    |     /occamy/server/routers.go:46 +0x447
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000250370)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc00011c7e0, 0xc000250370)
occamy    |     /occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc000250370)
occamy    |     /occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000250370)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc000250370)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x60
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000250370)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc000250370)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc000250370)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc000136640, 0xc000250370)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b0
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc000136640, 0xc77d40, 0xc000388380, 0xc0000d0d00)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x133
occamy    | net/http.serverHandler.ServeHTTP(0xc00017c0e0, 0xc77d40, 0xc000388380, 0xc0000d0d00)
occamy    |     /golang/go/src/net/http/server.go:2807 +0xa3
occamy    | net/http.(*conn).serve(0xc0003ac1e0, 0xc795c0, 0xc000258cc0)
occamy    |     /golang/go/src/net/http/server.go:1895 +0x86c
occamy    | created by net/http.(*Server).Serve
occamy    |     /golang/go/src/net/http/server.go:2933 +0x35c
occamy    | 
occamy    | goroutine 70 [semacquire]:
occamy    | sync.runtime_SemacquireMutex(0xc00000e594, 0xc000446000, 0x1)
occamy    |     /golang/go/src/runtime/sema.go:71 +0x47
occamy    | sync.(*Mutex).lockSlow(0xc00000e590)
occamy    |     /golang/go/src/sync/mutex.go:138 +0xfc
occamy    | sync.(*Mutex).Lock(...)
occamy    |     /golang/go/src/sync/mutex.go:81
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc00000e580, 0xc0004b1a20, 0xc0004f7658, 0x8, 0xc0004bf618)
occamy    |     /occamy/server/routers.go:55 +0x3d5
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc00000e580, 0xc0004d8370)
occamy    |     /occamy/server/routers.go:46 +0x447
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0004d8370)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc00011c7e0, 0xc0004d8370)
occamy    |     /occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc0004d8370)
occamy    |     /occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0004d8370)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc0004d8370)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x60
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0004d8370)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc0004d8370)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0004d8370)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc000136640, 0xc0004d8370)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b0
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc000136640, 0xc77d40, 0xc0004ba380, 0xc0004aa300)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x133
occamy    | net/http.serverHandler.ServeHTTP(0xc00017c0e0, 0xc77d40, 0xc0004ba380, 0xc0004aa300)
occamy    |     /golang/go/src/net/http/server.go:2807 +0xa3
occamy    | net/http.(*conn).serve(0xc00045a000, 0xc795c0, 0xc0004a2440)
occamy    |     /golang/go/src/net/http/server.go:1895 +0x86c
occamy    | created by net/http.(*Server).Serve
occamy    |     /golang/go/src/net/http/server.go:2933 +0x35c
occamy    | 
occamy    | goroutine 71 [semacquire]:
occamy    | sync.runtime_SemacquireMutex(0xc00000e594, 0xc000446000, 0x1)
occamy    |     /golang/go/src/runtime/sema.go:71 +0x47
occamy    | sync.(*Mutex).lockSlow(0xc00000e590)
occamy    |     /golang/go/src/sync/mutex.go:138 +0xfc
occamy    | sync.(*Mutex).Lock(...)
occamy    |     /golang/go/src/sync/mutex.go:81
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc00000e580, 0xc0001f7080, 0xc000185658, 0x8, 0xc0001f8ae8)
occamy    |     /occamy/server/routers.go:55 +0x3d5
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc00000e580, 0xc0001bc4d0)
occamy    |     /occamy/server/routers.go:46 +0x447
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0001bc4d0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc00011c7e0, 0xc0001bc4d0)
occamy    |     /occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc0001bc4d0)
occamy    |     /occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0001bc4d0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc0001bc4d0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x60
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0001bc4d0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc0001bc4d0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0001bc4d0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc000136640, 0xc0001bc4d0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b0
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc000136640, 0xc77d40, 0xc0001b6700, 0xc0001ae800)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x133
occamy    | net/http.serverHandler.ServeHTTP(0xc00017c0e0, 0xc77d40, 0xc0001b6700, 0xc0001ae800)
occamy    |     /golang/go/src/net/http/server.go:2807 +0xa3
occamy    | net/http.(*conn).serve(0xc00045a0a0, 0xc795c0, 0xc0001929c0)
occamy    |     /golang/go/src/net/http/server.go:1895 +0x86c
occamy    | created by net/http.(*Server).Serve
occamy    |     /golang/go/src/net/http/server.go:2933 +0x35c
occamy    | 
occamy    | goroutine 72 [semacquire]:
occamy    | sync.runtime_SemacquireMutex(0xc00000e594, 0xc000446000, 0x1)
occamy    |     /golang/go/src/runtime/sema.go:71 +0x47
occamy    | sync.(*Mutex).lockSlow(0xc00000e590)
occamy    |     /golang/go/src/sync/mutex.go:138 +0xfc
occamy    | sync.(*Mutex).Lock(...)
occamy    |     /golang/go/src/sync/mutex.go:81
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc00000e580, 0xc0002c8420, 0xc000183658, 0x8, 0xc00011df18)
occamy    |     /occamy/server/routers.go:55 +0x3d5
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc00000e580, 0xc00012a790)
occamy    |     /occamy/server/routers.go:46 +0x447
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00012a790)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc00011c7e0, 0xc00012a790)
occamy    |     /occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc00012a790)
occamy    |     /occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00012a790)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc00012a790)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x60
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00012a790)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc00012a790)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00012a790)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc000136640, 0xc00012a790)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b0
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc000136640, 0xc77d40, 0xc00017c540, 0xc00014f000)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x133
occamy    | net/http.serverHandler.ServeHTTP(0xc00017c0e0, 0xc77d40, 0xc00017c540, 0xc00014f000)
occamy    |     /golang/go/src/net/http/server.go:2807 +0xa3
occamy    | net/http.(*conn).serve(0xc00045a140, 0xc795c0, 0xc000070ec0)
occamy    |     /golang/go/src/net/http/server.go:1895 +0x86c
occamy    | created by net/http.(*Server).Serve
occamy    |     /golang/go/src/net/http/server.go:2933 +0x35c
occamy    | 
occamy    | goroutine 74 [semacquire]:
occamy    | sync.runtime_SemacquireMutex(0xc00000e594, 0xc000446000, 0x1)
occamy    |     /golang/go/src/runtime/sema.go:71 +0x47
occamy    | sync.(*Mutex).lockSlow(0xc00000e590)
occamy    |     /golang/go/src/sync/mutex.go:138 +0xfc
occamy    | sync.(*Mutex).Lock(...)
occamy    |     /golang/go/src/sync/mutex.go:81
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc00000e580, 0xc000135e40, 0xc000321658, 0x8, 0xc00011da98)
occamy    |     /occamy/server/routers.go:55 +0x3d5
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc00000e580, 0xc00012a630)
occamy    |     /occamy/server/routers.go:46 +0x447
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00012a630)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc00011c7e0, 0xc00012a630)
occamy    |     /occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc00012a630)
occamy    |     /occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00012a630)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc00012a630)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x60
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00012a630)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc00012a630)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00012a630)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc000136640, 0xc00012a630)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b0
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc000136640, 0xc77d40, 0xc00017c460, 0xc00014ef00)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x133
occamy    | net/http.serverHandler.ServeHTTP(0xc00017c0e0, 0xc77d40, 0xc00017c460, 0xc00014ef00)
occamy    |     /golang/go/src/net/http/server.go:2807 +0xa3
occamy    | net/http.(*conn).serve(0xc00045a280, 0xc795c0, 0xc000070dc0)
occamy    |     /golang/go/src/net/http/server.go:1895 +0x86c
occamy    | created by net/http.(*Server).Serve
occamy    |     /golang/go/src/net/http/server.go:2933 +0x35c
occamy    | 
occamy    | goroutine 75 [semacquire]:
occamy    | sync.runtime_SemacquireMutex(0xc00000e594, 0xc000446000, 0x1)
occamy    |     /golang/go/src/runtime/sema.go:71 +0x47
occamy    | sync.(*Mutex).lockSlow(0xc00000e590)
occamy    |     /golang/go/src/sync/mutex.go:138 +0xfc
occamy    | sync.(*Mutex).Lock(...)
occamy    |     /golang/go/src/sync/mutex.go:81
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc00000e580, 0xc00036b600, 0xc000517658, 0x8, 0xc000508ce8)
occamy    |     /occamy/server/routers.go:55 +0x3d5
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc00000e580, 0xc00031c420)
occamy    |     /occamy/server/routers.go:46 +0x447
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00031c420)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc00011c7e0, 0xc00031c420)
occamy    |     /occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc00031c420)
occamy    |     /occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00031c420)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc00031c420)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x60
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00031c420)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc00031c420)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00031c420)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc000136640, 0xc00031c420)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b0
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc000136640, 0xc77d40, 0xc0003187e0, 0xc000357100)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x133
occamy    | net/http.serverHandler.ServeHTTP(0xc00017c0e0, 0xc77d40, 0xc0003187e0, 0xc000357100)
occamy    |     /golang/go/src/net/http/server.go:2807 +0xa3
occamy    | net/http.(*conn).serve(0xc00045a320, 0xc795c0, 0xc00030edc0)
occamy    |     /golang/go/src/net/http/server.go:1895 +0x86c
occamy    | created by net/http.(*Server).Serve
occamy    |     /golang/go/src/net/http/server.go:2933 +0x35c
occamy    | 
occamy    | goroutine 76 [semacquire]:
occamy    | sync.runtime_SemacquireMutex(0xc00000e594, 0xc000446000, 0x1)
occamy    |     /golang/go/src/runtime/sema.go:71 +0x47
occamy    | sync.(*Mutex).lockSlow(0xc00000e590)
occamy    |     /golang/go/src/sync/mutex.go:138 +0xfc
occamy    | sync.(*Mutex).Lock(...)
occamy    |     /golang/go/src/sync/mutex.go:81
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc00000e580, 0xc0001358c0, 0xc000187658, 0x8, 0xc00011d638)
occamy    |     /occamy/server/routers.go:55 +0x3d5
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc00000e580, 0xc00012a4d0)
occamy    |     /occamy/server/routers.go:46 +0x447
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00012a4d0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc00011c7e0, 0xc00012a4d0)
occamy    |     /occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc00012a4d0)
occamy    |     /occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00012a4d0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc00012a4d0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x60
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00012a4d0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc00012a4d0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00012a4d0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc000136640, 0xc00012a4d0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b0
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc000136640, 0xc77d40, 0xc00017c380, 0xc00014ee00)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x133
occamy    | net/http.serverHandler.ServeHTTP(0xc00017c0e0, 0xc77d40, 0xc00017c380, 0xc00014ee00)
occamy    |     /golang/go/src/net/http/server.go:2807 +0xa3
occamy    | net/http.(*conn).serve(0xc00045a3c0, 0xc795c0, 0xc000070cc0)
occamy    |     /golang/go/src/net/http/server.go:1895 +0x86c
occamy    | created by net/http.(*Server).Serve
occamy    |     /golang/go/src/net/http/server.go:2933 +0x35c
occamy    | 
occamy    | goroutine 77 [semacquire]:
occamy    | sync.runtime_SemacquireMutex(0xc00000e594, 0xc000446000, 0x1)
occamy    |     /golang/go/src/runtime/sema.go:71 +0x47
occamy    | sync.(*Mutex).lockSlow(0xc00000e590)
occamy    |     /golang/go/src/sync/mutex.go:138 +0xfc
occamy    | sync.(*Mutex).Lock(...)
occamy    |     /golang/go/src/sync/mutex.go:81
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc00000e580, 0xc00036b080, 0xc000369658, 0x8, 0xc0005088a8)
occamy    |     /occamy/server/routers.go:55 +0x3d5
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc00000e580, 0xc00031c2c0)
occamy    |     /occamy/server/routers.go:46 +0x447
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00031c2c0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc00011c7e0, 0xc00031c2c0)
occamy    |     /occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc00031c2c0)
occamy    |     /occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00031c2c0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc00031c2c0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x60
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00031c2c0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc00031c2c0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00031c2c0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc000136640, 0xc00031c2c0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b0
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc000136640, 0xc77d40, 0xc000318700, 0xc000357000)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x133
occamy    | net/http.serverHandler.ServeHTTP(0xc00017c0e0, 0xc77d40, 0xc000318700, 0xc000357000)
occamy    |     /golang/go/src/net/http/server.go:2807 +0xa3
occamy    | net/http.(*conn).serve(0xc00045a460, 0xc795c0, 0xc00030ecc0)
occamy    |     /golang/go/src/net/http/server.go:1895 +0x86c
occamy    | created by net/http.(*Server).Serve
occamy    |     /golang/go/src/net/http/server.go:2933 +0x35c
occamy    | 
occamy    | goroutine 78 [semacquire]:
occamy    | sync.runtime_SemacquireMutex(0xc00000e594, 0xc000446000, 0x1)
occamy    |     /golang/go/src/runtime/sema.go:71 +0x47
occamy    | sync.(*Mutex).lockSlow(0xc00000e590)
occamy    |     /golang/go/src/sync/mutex.go:138 +0xfc
occamy    | sync.(*Mutex).Lock(...)
occamy    |     /golang/go/src/sync/mutex.go:81
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc00000e580, 0xc0001f6b00, 0xc00031f658, 0x8, 0xc0001f8658)
occamy    |     /occamy/server/routers.go:55 +0x3d5
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc00000e580, 0xc0001bc370)
occamy    |     /occamy/server/routers.go:46 +0x447
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0001bc370)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc00011c7e0, 0xc0001bc370)
occamy    |     /occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc0001bc370)
occamy    |     /occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0001bc370)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc0001bc370)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x60
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0001bc370)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc0001bc370)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc0001bc370)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc000136640, 0xc0001bc370)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b0
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc000136640, 0xc77d40, 0xc0001b6620, 0xc0001ae700)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x133
occamy    | net/http.serverHandler.ServeHTTP(0xc00017c0e0, 0xc77d40, 0xc0001b6620, 0xc0001ae700)
occamy    |     /golang/go/src/net/http/server.go:2807 +0xa3
occamy    | net/http.(*conn).serve(0xc00045a500, 0xc795c0, 0xc0001928c0)
occamy    |     /golang/go/src/net/http/server.go:1895 +0x86c
occamy    | created by net/http.(*Server).Serve
occamy    |     /golang/go/src/net/http/server.go:2933 +0x35c
occamy    | 
occamy    | goroutine 79 [semacquire]:
occamy    | sync.runtime_SemacquireMutex(0xc00000e594, 0xc000446000, 0x1)
occamy    |     /golang/go/src/runtime/sema.go:71 +0x47
occamy    | sync.(*Mutex).lockSlow(0xc00000e590)
occamy    |     /golang/go/src/sync/mutex.go:138 +0xfc
occamy    | sync.(*Mutex).Lock(...)
occamy    |     /golang/go/src/sync/mutex.go:81
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc00000e580, 0xc000462000, 0xc0004f3658, 0x8, 0xc000423a98)
occamy    |     /occamy/server/routers.go:55 +0x3d5
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc00000e580, 0xc00041c2c0)
occamy    |     /occamy/server/routers.go:46 +0x447
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00041c2c0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc00011c7e0, 0xc00041c2c0)
occamy    |     /occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc00041c2c0)
occamy    |     /occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00041c2c0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc00041c2c0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x60
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00041c2c0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc00041c2c0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00041c2c0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc000136640, 0xc00041c2c0)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b0
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc000136640, 0xc77d40, 0xc000418460, 0xc000440500)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x133
occamy    | net/http.serverHandler.ServeHTTP(0xc00017c0e0, 0xc77d40, 0xc000418460, 0xc000440500)
occamy    |     /golang/go/src/net/http/server.go:2807 +0xa3
occamy    | net/http.(*conn).serve(0xc00045a5a0, 0xc795c0, 0xc00040e580)
occamy    |     /golang/go/src/net/http/server.go:1895 +0x86c
occamy    | created by net/http.(*Server).Serve
occamy    |     /golang/go/src/net/http/server.go:2933 +0x35c
occamy    | 
occamy    | goroutine 80 [semacquire]:
occamy    | sync.runtime_SemacquireMutex(0xc00000e594, 0xc000446000, 0x1)
occamy    |     /golang/go/src/runtime/sema.go:71 +0x47
occamy    | sync.(*Mutex).lockSlow(0xc00000e590)
occamy    |     /golang/go/src/sync/mutex.go:138 +0xfc
occamy    | sync.(*Mutex).Lock(...)
occamy    |     /golang/go/src/sync/mutex.go:81
occamy    | github.com/changkun/occamy/server.(*proxy).routeConn(0xc00000e580, 0xc00040ba20, 0xc0003a7658, 0x8, 0xc000423618)
occamy    |     /occamy/server/routers.go:55 +0x3d5
occamy    | github.com/changkun/occamy/server.(*proxy).serveWS(0xc00000e580, 0xc00041c160)
occamy    |     /occamy/server/routers.go:46 +0x447
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00041c160)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).middlewareImpl(0xc00011c7e0, 0xc00041c160)
occamy    |     /occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:382 +0x2bf
occamy    | github.com/appleboy/gin-jwt/v2.(*GinJWTMiddleware).MiddlewareFunc.func1(0xc00041c160)
occamy    |     /occamy/vendor/github.com/appleboy/gin-jwt/v2/auth_jwt.go:344 +0x34
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00041c160)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.RecoveryWithWriter.func1(0xc00041c160)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/recovery.go:83 +0x60
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00041c160)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.LoggerWithConfig.func1(0xc00041c160)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/logger.go:240 +0xe1
occamy    | github.com/gin-gonic/gin.(*Context).Next(0xc00041c160)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/context.go:124 +0x3b
occamy    | github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc000136640, 0xc00041c160)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/gin.go:389 +0x5b0
occamy    | github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc000136640, 0xc77d40, 0xc000418380, 0xc000440400)
occamy    |     /occamy/vendor/github.com/gin-gonic/gin/gin.go:351 +0x133
occamy    | net/http.serverHandler.ServeHTTP(0xc00017c0e0, 0xc77d40, 0xc000418380, 0xc000440400)
occamy    |     /golang/go/src/net/http/server.go:2807 +0xa3
occamy    | net/http.(*conn).serve(0xc00045a640, 0xc795c0, 0xc00040e480)
occamy    |     /golang/go/src/net/http/server.go:1895 +0x86c
occamy    | created by net/http.(*Server).Serve
occamy    |     /golang/go/src/net/http/server.go:2933 +0x35c
occamy    | 
occamy    | goroutine 134 [syscall]:
occamy    | github.com/changkun/occamy/lib._Cfunc_guac_user_input_thread(0x7fc07c004800, 0x7fc000e4e1c0)
occamy    |     _cgo_gotypes.go:497 +0x41
occamy    | github.com/changkun/occamy/lib.(*User).HandleConnection.func2(0xc000527980)
occamy    |     /occamy/lib/user.go:239 +0x5d
occamy    | github.com/changkun/occamy/lib.(*User).HandleConnection(0xc000527980, 0xc000310780)
occamy    |     /occamy/lib/user.go:239 +0x3d
occamy    | created by github.com/changkun/occamy/server.(*Session).Join
occamy    |     /occamy/server/session.go:93 +0x51a
occamy    | 
occamy    | goroutine 135 [syscall]:
occamy    | syscall.Syscall(0x0, 0x24, 0xc000534000, 0x2000, 0xc000416218, 0xc00009da80, 0xc00032d5a0)
occamy    |     /golang/go/src/syscall/asm_linux_amd64.s:18 +0x5
occamy    | syscall.read(0x24, 0xc000534000, 0x2000, 0x2000, 0x9e170b, 0xc0004161c0, 0xc591f4)
occamy    |     /golang/go/src/syscall/zsyscall_linux_amd64.go:686 +0x5a
occamy    | syscall.Read(...)
occamy    |     /golang/go/src/syscall/syscall_unix.go:189
occamy    | github.com/changkun/occamy/protocol.IO.Read(0x24, 0xc000534000, 0x2000, 0x2000, 0x2a, 0x0, 0x0)
occamy    |     /occamy/protocol/io.go:21 +0x49
occamy    | bufio.(*Reader).fill(0xc0003373e0)
occamy    |     /golang/go/src/bufio/bufio.go:100 +0x103
occamy    | bufio.(*Reader).ReadSlice(0xc0003373e0, 0x3b, 0x28, 0xc0001d0090, 0xc00040b4a0, 0xc00032d748, 0x9d8b67)
occamy    |     /golang/go/src/bufio/bufio.go:359 +0x3d
occamy    | bufio.(*Reader).ReadBytes(0xc0003373e0, 0x3b, 0xc0001d0090, 0x28, 0x28, 0x0, 0x0)
occamy    |     /golang/go/src/bufio/bufio.go:438 +0x7a
occamy    | github.com/changkun/occamy/protocol.(*InstructionIO).ReadRaw(...)
occamy    |     /occamy/protocol/instruction.go:156
occamy    | github.com/changkun/occamy/server.(*Session).serveIO.func1(0xc000337440, 0xc000308930, 0xc00030cde0, 0xc00040b4a0)
occamy    |     /occamy/server/session.go:119 +0x41
occamy    | created by github.com/changkun/occamy/server.(*Session).serveIO
occamy    |     /occamy/server/session.go:116 +0xbb
occamy    | 
occamy    | goroutine 136 [IO wait]:
occamy    | internal/poll.runtime_pollWait(0x7fc0ad8c0308, 0x72, 0xffffffffffffffff)
occamy    |     /golang/go/src/runtime/netpoll.go:203 +0x55
occamy    | internal/poll.(*pollDesc).wait(0xc00009da98, 0x72, 0x2000, 0x2000, 0xffffffffffffffff)
occamy    |     /golang/go/src/internal/poll/fd_poll_runtime.go:87 +0x45
occamy    | internal/poll.(*pollDesc).waitRead(...)
occamy    |     /golang/go/src/internal/poll/fd_poll_runtime.go:92
occamy    | internal/poll.(*FD).Read(0xc00009da80, 0xc00044a000, 0x2000, 0x2000, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/internal/poll/fd_unix.go:169 +0x19b
occamy    | net.(*netFD).Read(0xc00009da80, 0xc00044a000, 0x2000, 0x2000, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/net/fd_unix.go:202 +0x4f
occamy    | net.(*conn).Read(0xc000098570, 0xc00044a000, 0x2000, 0x2000, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/net/net.go:184 +0x8e
occamy    | bufio.(*Reader).fill(0xc000426720)
occamy    |     /golang/go/src/bufio/bufio.go:100 +0x103
occamy    | bufio.(*Reader).Peek(0xc000426720, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/bufio/bufio.go:138 +0x4f
occamy    | github.com/gorilla/websocket.(*Conn).read(0xc00040b4a0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0)
occamy    |     /occamy/vendor/github.com/gorilla/websocket/conn.go:357 +0x40
occamy    | github.com/gorilla/websocket.(*Conn).advanceFrame(0xc00040b4a0, 0x0, 0x0, 0x0)
occamy    |     /occamy/vendor/github.com/gorilla/websocket/conn.go:787 +0x5c
occamy    | github.com/gorilla/websocket.(*Conn).NextReader(0xc00040b4a0, 0x0, 0x0, 0x0, 0x0, 0x0)
occamy    |     /occamy/vendor/github.com/gorilla/websocket/conn.go:947 +0x8f
occamy    | github.com/gorilla/websocket.(*Conn).ReadMessage(0xc00040b4a0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0)
occamy    |     /occamy/vendor/github.com/gorilla/websocket/conn.go:1028 +0x2f
occamy    | github.com/changkun/occamy/server.(*Session).serveIO.func2(0xc000337440, 0xc000308930, 0xc00030cde0, 0xc00040b4a0)
occamy    |     /occamy/server/session.go:135 +0x3a
occamy    | created by github.com/changkun/occamy/server.(*Session).serveIO
occamy    |     /occamy/server/session.go:132 +0x101
occamy    | 
occamy    | goroutine 147 [syscall]:
occamy    | github.com/changkun/occamy/lib._Cfunc_guac_user_input_thread(0x7fc06c002a00, 0x7fc000e4e1c0)
occamy    |     _cgo_gotypes.go:497 +0x41
occamy    | github.com/changkun/occamy/lib.(*User).HandleConnection.func2(0xc0003c5980)
occamy    |     /occamy/lib/user.go:239 +0x5d
occamy    | github.com/changkun/occamy/lib.(*User).HandleConnection(0xc0003c5980, 0xc0002368a0)
occamy    |     /occamy/lib/user.go:239 +0x3d
occamy    | created by github.com/changkun/occamy/server.(*Session).Join
occamy    |     /occamy/server/session.go:93 +0x51a
occamy    | 
occamy    | goroutine 148 [runnable]:
occamy    | syscall.Syscall(0x1, 0x10, 0xc00001450a, 0xf0, 0xf0, 0xf0, 0x0)
occamy    |     /golang/go/src/syscall/asm_linux_amd64.s:18 +0x5
occamy    | syscall.write(0x10, 0xc00001450a, 0xf0, 0x2004, 0x0, 0x400, 0x203000)
occamy    |     /golang/go/src/syscall/zsyscall_linux_amd64.go:914 +0x5a
occamy    | syscall.Write(...)
occamy    |     /golang/go/src/syscall/syscall_unix.go:214
occamy    | internal/poll.(*FD).Write(0xc00016a900, 0xc00001450a, 0xf0, 0x2004, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/internal/poll/fd_unix.go:268 +0x179
occamy    | net.(*netFD).Write(0xc00016a900, 0xc00001450a, 0xf0, 0x2004, 0x0, 0x77, 0x0)
occamy    |     /golang/go/src/net/fd_unix.go:220 +0x4f
occamy    | net.(*conn).Write(0xc000010208, 0xc00001450a, 0xf0, 0x2004, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/net/net.go:196 +0x8e
occamy    | github.com/gorilla/websocket.(*Conn).write(0xc000135340, 0x1, 0x0, 0x0, 0x0, 0xc00001450a, 0xf0, 0x2004, 0xc000478000, 0x0, ...)
occamy    |     /occamy/vendor/github.com/gorilla/websocket/conn.go:378 +0x151
occamy    | github.com/gorilla/websocket.(*messageWriter).flushFrame(0xc000044f18, 0xc000478001, 0xc000478000, 0x0, 0x0, 0x0, 0x0)
occamy    |     /occamy/vendor/github.com/gorilla/websocket/conn.go:595 +0x25f
occamy    | github.com/gorilla/websocket.(*Conn).WriteMessage(0xc000135340, 0x1, 0xc000478000, 0xec, 0xec, 0x0, 0x0)
occamy    |     /occamy/vendor/github.com/gorilla/websocket/conn.go:752 +0x247
occamy    | github.com/changkun/occamy/server.(*Session).serveIO.func1(0xc00008f860, 0xc00024ad40, 0xc0003a03e0, 0xc000135340)
occamy    |     /occamy/server/session.go:123 +0x92
occamy    | created by github.com/changkun/occamy/server.(*Session).serveIO
occamy    |     /occamy/server/session.go:116 +0xbb
occamy    | 
occamy    | goroutine 149 [IO wait]:
occamy    | internal/poll.runtime_pollWait(0x7fc0ac03de08, 0x72, 0xffffffffffffffff)
occamy    |     /golang/go/src/runtime/netpoll.go:203 +0x55
occamy    | internal/poll.(*pollDesc).wait(0xc00016a918, 0x72, 0x2000, 0x2000, 0xffffffffffffffff)
occamy    |     /golang/go/src/internal/poll/fd_poll_runtime.go:87 +0x45
occamy    | internal/poll.(*pollDesc).waitRead(...)
occamy    |     /golang/go/src/internal/poll/fd_poll_runtime.go:92
occamy    | internal/poll.(*FD).Read(0xc00016a900, 0xc0002bc000, 0x2000, 0x2000, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/internal/poll/fd_unix.go:169 +0x19b
occamy    | net.(*netFD).Read(0xc00016a900, 0xc0002bc000, 0x2000, 0x2000, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/net/fd_unix.go:202 +0x4f
occamy    | net.(*conn).Read(0xc000010208, 0xc0002bc000, 0x2000, 0x2000, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/net/net.go:184 +0x8e
occamy    | bufio.(*Reader).fill(0xc000073560)
occamy    |     /golang/go/src/bufio/bufio.go:100 +0x103
occamy    | bufio.(*Reader).Peek(0xc000073560, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/bufio/bufio.go:138 +0x4f
occamy    | github.com/gorilla/websocket.(*Conn).read(0xc000135340, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0)
occamy    |     /occamy/vendor/github.com/gorilla/websocket/conn.go:357 +0x40
occamy    | github.com/gorilla/websocket.(*Conn).advanceFrame(0xc000135340, 0x0, 0x0, 0x0)
occamy    |     /occamy/vendor/github.com/gorilla/websocket/conn.go:787 +0x5c
occamy    | github.com/gorilla/websocket.(*Conn).NextReader(0xc000135340, 0x0, 0x0, 0x0, 0x0, 0x0)
occamy    |     /occamy/vendor/github.com/gorilla/websocket/conn.go:947 +0x8f
occamy    | github.com/gorilla/websocket.(*Conn).ReadMessage(0xc000135340, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0)
occamy    |     /occamy/vendor/github.com/gorilla/websocket/conn.go:1028 +0x2f
occamy    | github.com/changkun/occamy/server.(*Session).serveIO.func2(0xc00008f860, 0xc00024ad40, 0xc0003a03e0, 0xc000135340)
occamy    |     /occamy/server/session.go:135 +0x3a
occamy    | created by github.com/changkun/occamy/server.(*Session).serveIO
occamy    |     /occamy/server/session.go:132 +0x101
occamy    | 
occamy    | goroutine 49 [IO wait]:
occamy    | internal/poll.runtime_pollWait(0x7fc0ad8c0768, 0x72, 0xffffffffffffffff)
occamy    |     /golang/go/src/runtime/netpoll.go:203 +0x55
occamy    | internal/poll.(*pollDesc).wait(0xc00009dc18, 0x72, 0x2000, 0x2000, 0xffffffffffffffff)
occamy    |     /golang/go/src/internal/poll/fd_poll_runtime.go:87 +0x45
occamy    | internal/poll.(*pollDesc).waitRead(...)
occamy    |     /golang/go/src/internal/poll/fd_poll_runtime.go:92
occamy    | internal/poll.(*FD).Read(0xc00009dc00, 0xc0001fa000, 0x2000, 0x2000, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/internal/poll/fd_unix.go:169 +0x19b
occamy    | net.(*netFD).Read(0xc00009dc00, 0xc0001fa000, 0x2000, 0x2000, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/net/fd_unix.go:202 +0x4f
occamy    | net.(*conn).Read(0xc000098588, 0xc0001fa000, 0x2000, 0x2000, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/net/net.go:184 +0x8e
occamy    | bufio.(*Reader).fill(0xc000188ea0)
occamy    |     /golang/go/src/bufio/bufio.go:100 +0x103
occamy    | bufio.(*Reader).Peek(0xc000188ea0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/bufio/bufio.go:138 +0x4f
occamy    | github.com/gorilla/websocket.(*Conn).read(0xc0001f6580, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0)
occamy    |     /occamy/vendor/github.com/gorilla/websocket/conn.go:357 +0x40
occamy    | github.com/gorilla/websocket.(*Conn).advanceFrame(0xc0001f6580, 0x0, 0x0, 0x0)
occamy    |     /occamy/vendor/github.com/gorilla/websocket/conn.go:787 +0x5c
occamy    | github.com/gorilla/websocket.(*Conn).NextReader(0xc0001f6580, 0x0, 0x0, 0x0, 0x0, 0x0)
occamy    |     /occamy/vendor/github.com/gorilla/websocket/conn.go:947 +0x8f
occamy    | github.com/gorilla/websocket.(*Conn).ReadMessage(0xc0001f6580, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0)
occamy    |     /occamy/vendor/github.com/gorilla/websocket/conn.go:1028 +0x2f
occamy    | github.com/changkun/occamy/server.(*Session).serveIO.func2(0xc000189320, 0xc0001968b0, 0xc000190e60, 0xc0001f6580)
occamy    |     /occamy/server/session.go:135 +0x3a
occamy    | created by github.com/changkun/occamy/server.(*Session).serveIO
occamy    |     /occamy/server/session.go:132 +0x101
occamy    | 
occamy    | goroutine 150 [syscall]:
occamy    | github.com/changkun/occamy/lib._Cfunc_guac_user_input_thread(0x7fc05c000b90, 0x7fc000e4e1c0)
occamy    |     _cgo_gotypes.go:497 +0x41
occamy    | github.com/changkun/occamy/lib.(*User).HandleConnection.func2(0xc00059f980)
occamy    |     /occamy/lib/user.go:239 +0x5d
occamy    | github.com/changkun/occamy/lib.(*User).HandleConnection(0xc00059f980, 0xc0004b4000)
occamy    |     /occamy/lib/user.go:239 +0x3d
occamy    | created by github.com/changkun/occamy/server.(*Session).Join
occamy    |     /occamy/server/session.go:93 +0x51a
occamy    | 
occamy    | goroutine 151 [runnable]:
occamy    | syscall.Syscall(0x0, 0x2e, 0xc0003f0000, 0x2000, 0x2dd, 0x2000, 0x0)
occamy    |     /golang/go/src/syscall/asm_linux_amd64.s:18 +0x5
occamy    | syscall.read(0x2e, 0xc0003f0000, 0x2000, 0x2000, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/syscall/zsyscall_linux_amd64.go:686 +0x5a
occamy    | syscall.Read(...)
occamy    |     /golang/go/src/syscall/syscall_unix.go:189
occamy    | github.com/changkun/occamy/protocol.IO.Read(0x2e, 0xc0003f0000, 0x2000, 0x2000, 0x0, 0x0, 0x0)
occamy    |     /occamy/protocol/io.go:21 +0x49
occamy    | bufio.(*Reader).fill(0xc0004a60c0)
occamy    |     /golang/go/src/bufio/bufio.go:100 +0x103
occamy    | bufio.(*Reader).ReadSlice(0xc0004a60c0, 0x3b, 0x0, 0x0, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/bufio/bufio.go:359 +0x3d
occamy    | bufio.(*Reader).ReadBytes(0xc0004a60c0, 0x3b, 0x0, 0x0, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/bufio/bufio.go:438 +0x7a
occamy    | github.com/changkun/occamy/protocol.(*InstructionIO).ReadRaw(...)
occamy    |     /occamy/protocol/instruction.go:156
occamy    | github.com/changkun/occamy/server.(*Session).serveIO.func1(0xc0004a6120, 0xc00002a090, 0xc00000e040, 0xc00036ab00)
occamy    |     /occamy/server/session.go:119 +0x41
occamy    | created by github.com/changkun/occamy/server.(*Session).serveIO
occamy    |     /occamy/server/session.go:116 +0xbb
occamy    | 
occamy    | goroutine 152 [IO wait]:
occamy    | internal/poll.runtime_pollWait(0x7fc0ad8c0148, 0x72, 0xffffffffffffffff)
occamy    |     /golang/go/src/runtime/netpoll.go:203 +0x55
occamy    | internal/poll.(*pollDesc).wait(0xc00009db98, 0x72, 0x2000, 0x2000, 0xffffffffffffffff)
occamy    |     /golang/go/src/internal/poll/fd_poll_runtime.go:87 +0x45
occamy    | internal/poll.(*pollDesc).waitRead(...)
occamy    |     /golang/go/src/internal/poll/fd_poll_runtime.go:92
occamy    | internal/poll.(*FD).Read(0xc00009db80, 0xc00050c000, 0x2000, 0x2000, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/internal/poll/fd_unix.go:169 +0x19b
occamy    | net.(*netFD).Read(0xc00009db80, 0xc00050c000, 0x2000, 0x2000, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/net/fd_unix.go:202 +0x4f
occamy    | net.(*conn).Read(0xc000098580, 0xc00050c000, 0x2000, 0x2000, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/net/net.go:184 +0x8e
occamy    | bufio.(*Reader).fill(0xc000336f00)
occamy    |     /golang/go/src/bufio/bufio.go:100 +0x103
occamy    | bufio.(*Reader).Peek(0xc000336f00, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0)
occamy    |     /golang/go/src/bufio/bufio.go:138 +0x4f
occamy    | github.com/gorilla/websocket.(*Conn).read(0xc00036ab00, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0)
occamy    |     /occamy/vendor/github.com/gorilla/websocket/conn.go:357 +0x40
occamy    | github.com/gorilla/websocket.(*Conn).advanceFrame(0xc00036ab00, 0x40b94b, 0xc000012000, 0x43947c)
occamy    |     /occamy/vendor/github.com/gorilla/websocket/conn.go:787 +0x5c
occamy    | github.com/gorilla/websocket.(*Conn).NextReader(0xc00036ab00, 0xc00032ef40, 0x44b2cf, 0xc000336360, 0x4, 0xc000336360)
occamy    |     /occamy/vendor/github.com/gorilla/websocket/conn.go:947 +0x8f
occamy    | github.com/gorilla/websocket.(*Conn).ReadMessage(0xc00036ab00, 0x7fc0ac079101, 0xc00032efc8, 0x6cb413, 0xc000192280, 0xc69e01, 0xc000304280)
occamy    |     /occamy/vendor/github.com/gorilla/websocket/conn.go:1028 +0x2f
occamy    | github.com/changkun/occamy/server.(*Session).serveIO.func2(0xc0004a6120, 0xc00002a090, 0xc00000e040, 0xc00036ab00)
occamy    |     /occamy/server/session.go:135 +0x3a
occamy    | created by github.com/changkun/occamy/server.(*Session).serveIO
occamy    |     /occamy/server/session.go:132 +0x101
occamy    | 
occamy    | rax    0x0
occamy    | rbx    0x7fc0dabb9000
occamy    | rcx    0x7fc0da1d8337
occamy    | rdx    0x6
occamy    | rdi    0x1
occamy    | rsi    0x1d
occamy    | rbp    0x7fc0da32cbe0
occamy    | rsp    0x7fc089ff7898
occamy    | r8     0x0
occamy    | r9     0x7fc05c006e30
occamy    | r10    0x8
occamy    | r11    0x202
occamy    | r12    0x7fc0d9f61fb1
occamy    | r13    0x7fc0d9f62340
occamy    | r14    0xc
occamy    | r15    0x7fc08c058800
occamy    | rip    0x7fc0da1d8337
occamy    | rflags 0x202
occamy    | cs     0x33
occamy    | fs     0x0
occamy    | gs     0x0