Giter Club home page Giter Club logo

buger / goreplay Goto Github PK

View Code? Open in Web Editor NEW
18.3K 468.0 1.8K 17.69 MB

GoReplay is an open-source tool for capturing and replaying live HTTP traffic into a test environment in order to continuously test your system with real data. It can be used to increase confidence in code deployments, configuration changes and infrastructure changes.

Home Page: https://goreplay.org

License: Other

Makefile 1.58% Go 86.58% Ruby 0.62% CSS 2.26% JavaScript 6.19% Dockerfile 0.10% HTML 2.59% Procfile 0.07%
go testing testing-tools devops qa

goreplay's Introduction

GitHub release codebeat Go Report Card Join the chat at https://gitter.im/buger/gor Reviewed by Hound

Go Replay

GoReplay is an open-source network monitoring tool which can record your live traffic and use it for shadowing, load testing, monitoring and detailed analysis.

About

As your application grows, the effort required to test it also grows exponentially. GoReplay offers you the simple idea of reusing your existing traffic for testing, which makes it incredibly powerful. Our state of art technique allows you to analyze and record your application traffic without affecting it. This eliminates the risks that come with putting a third party component in the critical path.

GoReplay increases your confidence in code deployments, configuration and infrastructure changes.

GoReplay offers a unique approach for shadowing. Instead of being a proxy, GoReplay listens in the background for traffic on your network interfaces, requiring no changes in your production infrastructure, other than running GoReplay daemon on the same machine as your service.

Diagram

Check latest documentation.

Installation

Download the latest binary from https://github.com/buger/goreplay/releases or compile by yourself.

Getting started

The most basic setup will be sudo ./gor --input-raw :8000 --output-stdout which acts like tcpdump. If you already have a test environment, you can start replaying by running: sudo ./gor --input-raw :8000 --output-http http://staging.env.

See our documentation and the Getting Started page for more info.

Newsletter

Subscribe to our newsletter to stay informed about the latest features and changes to the Gor project.

Want to Upgrade?

We have created a GoReplay PRO extension which provides additional features such as support for binary protocols like Thrift or ProtocolBuffers, saving and replaying from cloud storage, TCP session replication, etc. The PRO version also includes a commercial-friendly license, dedicated support, and it also allows you to support high-quality open source development.

Problems?

If you have a problem, please review the FAQ and Troubleshooting wiki pages. Searching the issues for your problem is also a good idea.

All bug-reports and suggestions should go through Github Issues or our Google Group (you can just send email to [email protected]). If you have a private question feel free to send email to [email protected].

Contributing

  1. Fork it
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Commit your changes (git commit -am 'Added some feature')
  4. Push to the branch (git push origin my-new-feature)
  5. Create new Pull Request

Companies using Gor

  • GOV.UK - UK Government Digital Service
  • theguardian.com - Most popular online newspaper in the UK
  • TomTom - Global leader in navigation, traffic and map products, GPS Sport Watches and fleet management solutions.
  • 3SCALE - API infrastructure to manage your APIs for internal or external users
  • Optionlab - Optimize customer experience and drive engagement across multiple channels
  • TubeMogul - Software for Brand Advertising
  • Videology - Video advertising platform
  • ForeksMobile - One of the leading financial application development company in Turkey
  • Granify - AI backed SaaS solution that enables online retailers to maximise their sales
  • And many more!

If you are using Gor, we are happy to add you to the list and share your story, just write to: [email protected]

Author

Leonid Bugaev, @buger, https://leonsbox.com

goreplay's People

Contributors

arijitad avatar bruce34 avatar buger avatar davidfr avatar dcarley avatar dependabot[bot] avatar dimagolomozy avatar gottwald avatar ivan-stankov-salt-security avatar janwillies avatar jauderho avatar joekiller avatar lins05 avatar mlallaouret avatar monrax avatar nrwiersma avatar ohadbasan avatar oivoodoo avatar ortz avatar othererik avatar salimane avatar slawosz avatar slimus avatar smostovoy avatar swills avatar thinkerou avatar tomerf avatar two avatar wangfeng22 avatar zvory avatar

Stargazers

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

Watchers

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

goreplay's Issues

Problem in understanding the verbose log of Gor, giving it a shot!

Started the server in the production instance. Its a rails app with Nginx at front and served using Unicorn.

$ sudo ./gor-linux-amd64 listen -p=80 -r="localhost:28020" -verbose=true

Then started the replayer on the same box with:

$ ./gor-linux-amd64 replay -f="http://dev.app.sparkon.com" -p=28020 -verbose=true

The staging app is on the dev domain.

When accessing the prod app, it does try to forward the request but the log output shows errors that I cannot figure out.

Here is the gist where I've added the both the server and replayer log?

Why is that Parse Error???

Can't rewrite Host header

This is on 0.7.5

~#  ./gor --input-raw :80  --output-http "http://my-staging-host"  --output-http-header "Host: my-staging-host"

But.. sniffing the traffic

~# tcpdump -c 20 -s 1023 -A host my-staging-host and tcp port http
...
Host: news-business.vlex.com
User-Agent: Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
...
Host: borme.vlex.es
Connection: Keep-alive
Accept: */*

so it seems that Hostname is not being rewritten

Gor performance issues

Don't know which would be the best way to debug GOR for performance testing. We've been working with it for almost a month now, and I've seen an increase on the load avg on a canary 300+ req/s aprox. It reach to a point where not only gor as a listener but the replay begin to grow instance loads.

I am talking about m1.large instances on AWS 8GB ram, 2 cores Instance Store, yesterday someone mentioned that maybe it could be related to encoding characters on our requests (because we have japanese characters) but I think it doesn't make any sense.

What you think @buger? any test that I can run on my systems to detect the bottleneck? and we are running 0.7.5.

Index out of Range error on replay server

I cannot figure out how to reproduce this other than just running the program. -verbose=true didn't yield anything that the normal output would. The error seems to indicate that the code is overflowing the array size here: https://github.com/buger/gor/blob/0.7.5/input_tcp.go#L65

I can get the error with just running 1 listener and 1 replay node but it takes a much longer time to hit it. I can easily create the error by throwing multiple listeners to one replay node but the exception is the same. This is all from version 0.7.5. When the panic does occur, I cannot recreate the error by saving the request to a file and then replaying that file.

Listener: /usr/local/bin/gor --input-raw :80 --output-tcp replay-node.compute-1.amazonaws.com:28020

Replay: /usr/local/bin/gor --input-tcp :28020 --output-file /tmp/requests.gor --output-http http://testblah.com --output-http-elasticsearch es.testblah.com:9200/gor

I've tried replay without elasticsearch results and it still happened.

Exception Example 1

panic: runtime error: index out of range

goroutine 15055 [running]:
runtime.panic(0x68c240, 0x9c72d7)
        /usr/local/go/src/pkg/runtime/panic.c:266 +0xb6
github.com/buger/gor.scanBytes(0xc212beb203, 0xdfd, 0xdfd, 0xd00, 0xdfd, ...)
        /tmp/go/src/github.com/buger/gor/input_tcp.go:65 +0x1e4
bufio.(*Scanner).Scan(0xc212be5230, 0xc210052060)
        /usr/local/go/src/pkg/bufio/scan.go:115 +0xa5
github.com/buger/gor.(*TCPInput).handleConnection(0xc2100620f0, 0x7f7c9f4b1958, 0xc2124ed760)
        /tmp/go/src/github.com/buger/gor/input_tcp.go:85 +0x134
created by github.com/buger/gor.func·001
        /tmp/go/src/github.com/buger/gor/input_tcp.go:53 +0x169

Exception Example 2

panic: runtime error: index out of range

goroutine 22857 [running]:
runtime.panic(0x68c240, 0x9c72d7)
        /usr/local/go/src/pkg/runtime/panic.c:266 +0xb6
github.com/buger/gor.scanBytes(0xc21031dd52, 0x2ae, 0x2ae, 0x1a00, 0xd8d, ...)
        /tmp/go/src/github.com/buger/gor/input_tcp.go:65 +0x1e4
bufio.(*Scanner).Scan(0xc2102b7f50, 0xc210052060)
        /usr/local/go/src/pkg/bufio/scan.go:115 +0xa5
github.com/buger/gor.(*TCPInput).handleConnection(0xc2100630f0, 0x7f22930d1828, 0xc21031ff28)
        /tmp/go/src/github.com/buger/gor/input_tcp.go:85 +0x134
created by github.com/buger/gor.func·001
        /tmp/go/src/github.com/buger/gor/input_tcp.go:53 +0x169

Full Dump with Verbose = True

This was with one listener and one replay:

panic: runtime error: index out of range

goroutine 107 [running]:
runtime.panic(0x68c240, 0x9c72d7)
        /usr/local/go/src/pkg/runtime/panic.c:266 +0xb6
github.com/buger/gor.scanBytes(0xc2101e562c, 0x9d4, 0x9d4, 0x1200, 0x3ef, ...)
        /tmp/go/src/github.com/buger/gor/input_tcp.go:65 +0x1e4
bufio.(*Scanner).Scan(0xc21015fe00, 0xc210052060)
        /usr/local/go/src/pkg/bufio/scan.go:115 +0xa5
github.com/buger/gor.(*TCPInput).handleConnection(0xc2100630f0, 0x7f733a9dc9b8, 0xc210000ac8)
        /tmp/go/src/github.com/buger/gor/input_tcp.go:85 +0x134
created by github.com/buger/gor.func·001
        /tmp/go/src/github.com/buger/gor/input_tcp.go:53 +0x169

goroutine 1 [select (no cases)]:
github.com/buger/gor.Start(0x0)
        /tmp/go/src/github.com/buger/gor/emitter.go:13 +0xb6
main.main()
        /tmp/go/src/github.com/buger/gor/bin/gor.go:50 +0x1a4

goroutine 3 [IO wait]:
net.runtime_pollWait(0x7f733a9dc7a0, 0x72, 0x0)
        /usr/local/go/src/pkg/runtime/netpoll.goc:116 +0x6a
net.(*pollDesc).Wait(0xc210042b50, 0x72, 0x7f733a9db0e8, 0xb)
        /usr/local/go/src/pkg/net/fd_poll_runtime.go:81 +0x34
net.(*pollDesc).WaitRead(0xc210042b50, 0xb, 0x7f733a9db0e8)
        /usr/local/go/src/pkg/net/fd_poll_runtime.go:86 +0x30
net.(*netFD).accept(0xc210042af0, 0x76d7f8, 0x0, 0x7f733a9db0e8, 0xb)
        /usr/local/go/src/pkg/net/fd_unix.go:382 +0x2c2
net.(*TCPListener).AcceptTCP(0xc210000340, 0x465449, 0x7f733a857f10, 0x465449)
        /usr/local/go/src/pkg/net/tcpsock_posix.go:233 +0x47
net.(*TCPListener).Accept(0xc210000340, 0x7f733a9dc9b8, 0xc210000b50, 0x0, 0x0)
        /usr/local/go/src/pkg/net/tcpsock_posix.go:243 +0x27
github.com/buger/gor.func·001()
        /tmp/go/src/github.com/buger/gor/input_tcp.go:46 +0x49
created by github.com/buger/gor.(*TCPInput).listen
        /tmp/go/src/github.com/buger/gor/input_tcp.go:55 +0x1da

goroutine 4 [chan receive]:
github.com/mattbaird/elastigo/core.func·001()
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:160 +0xad
created by github.com/mattbaird/elastigo/core.(*BulkIndexer).Run
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:163 +0x8b

goroutine 5 [select]:
net/http.(*Transport).getConn(0xc21005a200, 0xc211940cc0, 0xc211940cc0, 0x0, 0x0)
        /usr/local/go/src/pkg/net/http/transport.go:424 +0x24d
net/http.(*Transport).RoundTrip(0xc21005a200, 0xc211976ea0, 0x1, 0x0, 0x0)
        /usr/local/go/src/pkg/net/http/transport.go:182 +0x340
net/http.send(0xc211976ea0, 0x7f733a9db2b8, 0xc21005a200, 0x0, 0x0, ...)
        /usr/local/go/src/pkg/net/http/client.go:168 +0x37f
net/http.(*Client).send(0xc2100632d0, 0xc211976ea0, 0x99, 0x4fbac3, 0x60e0e0)
        /usr/local/go/src/pkg/net/http/client.go:100 +0xd9
net/http.(*Client).doFollowingRedirects(0xc2100632d0, 0xc211976ea0, 0x76e690, 0x0, 0x0, ...)
        /usr/local/go/src/pkg/net/http/client.go:294 +0x671
net/http.(*Client).Do(0xc2100632d0, 0xc211976ea0, 0x9cc360, 0x0, 0x0)
        /usr/local/go/src/pkg/net/http/client.go:129 +0x8f
github.com/buger/gor.(*HTTPOutput).sendRequest(0xc210052360, 0xc2100632d0, 0xc210b71400, 0x9e1, 0x9e1)
        /tmp/go/src/github.com/buger/gor/output_http.go:130 +0x42d
github.com/buger/gor.(*HTTPOutput).worker(0xc210052360, 0x0)
        /tmp/go/src/github.com/buger/gor/output_http.go:94 +0xa0
created by github.com/buger/gor.NewHTTPOutput
        /tmp/go/src/github.com/buger/gor/output_http.go:77 +0x2a2

goroutine 6 [select]:
net/http.(*persistConn).roundTrip(0xc2107f4d00, 0xc21029bac0, 0xc2107f4d00, 0x0, 0x0)
        /usr/local/go/src/pkg/net/http/transport.go:879 +0x6d6
net/http.(*Transport).RoundTrip(0xc21005a200, 0xc21128d1a0, 0x1, 0x0, 0x0)
        /usr/local/go/src/pkg/net/http/transport.go:187 +0x391
net/http.send(0xc21128d1a0, 0x7f733a9db2b8, 0xc21005a200, 0x0, 0x0, ...)
        /usr/local/go/src/pkg/net/http/client.go:168 +0x37f
net/http.(*Client).send(0xc210063300, 0xc21128d1a0, 0x257, 0x100000000, 0x100000006)
        /usr/local/go/src/pkg/net/http/client.go:100 +0xd9
net/http.(*Client).doFollowingRedirects(0xc210063300, 0xc21128d1a0, 0x76e690, 0x0, 0x0, ...)
        /usr/local/go/src/pkg/net/http/client.go:294 +0x671
net/http.(*Client).Do(0xc210063300, 0xc21128d1a0, 0x9cc360, 0x0, 0x0)
        /usr/local/go/src/pkg/net/http/client.go:129 +0x8f
github.com/buger/gor.(*HTTPOutput).sendRequest(0xc210052360, 0xc210063300, 0xc2103d5000, 0xe23, 0xe23)
        /tmp/go/src/github.com/buger/gor/output_http.go:130 +0x42d
github.com/buger/gor.(*HTTPOutput).worker(0xc210052360, 0x1)
        /tmp/go/src/github.com/buger/gor/output_http.go:94 +0xa0
created by github.com/buger/gor.NewHTTPOutput
        /tmp/go/src/github.com/buger/gor/output_http.go:77 +0x2a2

goroutine 7 [select]:
net/http.(*persistConn).roundTrip(0xc2107f4800, 0xc21029b360, 0xc2107f4800, 0x0, 0x0)
        /usr/local/go/src/pkg/net/http/transport.go:879 +0x6d6
net/http.(*Transport).RoundTrip(0xc21005a200, 0xc210ba71a0, 0x1, 0x0, 0x0)
        /usr/local/go/src/pkg/net/http/transport.go:187 +0x391
net/http.send(0xc210ba71a0, 0x7f733a9db2b8, 0xc21005a200, 0x0, 0x0, ...)
        /usr/local/go/src/pkg/net/http/client.go:168 +0x37f
net/http.(*Client).send(0xc210063330, 0xc210ba71a0, 0x257, 0x4fbac3, 0x60e0e0)
        /usr/local/go/src/pkg/net/http/client.go:100 +0xd9
net/http.(*Client).doFollowingRedirects(0xc210063330, 0xc210ba71a0, 0x76e690, 0x0, 0x0, ...)
        /usr/local/go/src/pkg/net/http/client.go:294 +0x671
net/http.(*Client).Do(0xc210063330, 0xc210ba71a0, 0x9cc360, 0x0, 0x0)
        /usr/local/go/src/pkg/net/http/client.go:129 +0x8f
github.com/buger/gor.(*HTTPOutput).sendRequest(0xc210052360, 0xc210063330, 0xc211000000, 0xe1b, 0xe1b)
        /tmp/go/src/github.com/buger/gor/output_http.go:130 +0x42d
github.com/buger/gor.(*HTTPOutput).worker(0xc210052360, 0x2)
        /tmp/go/src/github.com/buger/gor/output_http.go:94 +0xa0
created by github.com/buger/gor.NewHTTPOutput
        /tmp/go/src/github.com/buger/gor/output_http.go:77 +0x2a2

goroutine 8 [select]:
net/http.(*persistConn).roundTrip(0xc210239500, 0xc211014b20, 0xc210239500, 0x0, 0x0)
        /usr/local/go/src/pkg/net/http/transport.go:879 +0x6d6
net/http.(*Transport).RoundTrip(0xc21005a200, 0xc21133c9c0, 0x1, 0x0, 0x0)
        /usr/local/go/src/pkg/net/http/transport.go:187 +0x391
net/http.send(0xc21133c9c0, 0x7f733a9db2b8, 0xc21005a200, 0x0, 0x0, ...)
        /usr/local/go/src/pkg/net/http/client.go:168 +0x37f
net/http.(*Client).send(0xc210063360, 0xc21133c9c0, 0x257, 0x4fbac3, 0x60e0e0)
        /usr/local/go/src/pkg/net/http/client.go:100 +0xd9
net/http.(*Client).doFollowingRedirects(0xc210063360, 0xc21133c9c0, 0x76e690, 0x0, 0x0, ...)
        /usr/local/go/src/pkg/net/http/client.go:294 +0x671
net/http.(*Client).Do(0xc210063360, 0xc21133c9c0, 0x9cc360, 0x0, 0x0)
        /usr/local/go/src/pkg/net/http/client.go:129 +0x8f
github.com/buger/gor.(*HTTPOutput).sendRequest(0xc210052360, 0xc210063360, 0xc210cda000, 0xe1e, 0xe1e)
        /tmp/go/src/github.com/buger/gor/output_http.go:130 +0x42d
github.com/buger/gor.(*HTTPOutput).worker(0xc210052360, 0x3)
        /tmp/go/src/github.com/buger/gor/output_http.go:94 +0xa0
created by github.com/buger/gor.NewHTTPOutput
        /tmp/go/src/github.com/buger/gor/output_http.go:77 +0x2a2

goroutine 9 [select]:
net/http.(*persistConn).roundTrip(0xc21012f480, 0xc2118d85a0, 0xc21012f480, 0x0, 0x0)
        /usr/local/go/src/pkg/net/http/transport.go:879 +0x6d6
net/http.(*Transport).RoundTrip(0xc21005a200, 0xc2116870d0, 0x1, 0x0, 0x0)
        /usr/local/go/src/pkg/net/http/transport.go:187 +0x391
net/http.send(0xc2116870d0, 0x7f733a9db2b8, 0xc21005a200, 0x0, 0x0, ...)
        /usr/local/go/src/pkg/net/http/client.go:168 +0x37f
net/http.(*Client).send(0xc210063390, 0xc2116870d0, 0x257, 0x4fbac3, 0x60e0e0)
        /usr/local/go/src/pkg/net/http/client.go:100 +0xd9
net/http.(*Client).doFollowingRedirects(0xc210063390, 0xc2116870d0, 0x76e690, 0x0, 0x0, ...)
        /usr/local/go/src/pkg/net/http/client.go:294 +0x671
net/http.(*Client).Do(0xc210063390, 0xc2116870d0, 0x9cc360, 0x0, 0x0)
        /usr/local/go/src/pkg/net/http/client.go:129 +0x8f
github.com/buger/gor.(*HTTPOutput).sendRequest(0xc210052360, 0xc210063390, 0xc2102a9000, 0xbc1, 0xbc1)
        /tmp/go/src/github.com/buger/gor/output_http.go:130 +0x42d
github.com/buger/gor.(*HTTPOutput).worker(0xc210052360, 0x4)
        /tmp/go/src/github.com/buger/gor/output_http.go:94 +0xa0
created by github.com/buger/gor.NewHTTPOutput
        /tmp/go/src/github.com/buger/gor/output_http.go:77 +0x2a2

goroutine 10 [select]:
net/http.(*persistConn).roundTrip(0xc210239c00, 0xc21132c870, 0xc210239c00, 0x0, 0x0)
        /usr/local/go/src/pkg/net/http/transport.go:879 +0x6d6
net/http.(*Transport).RoundTrip(0xc21005a200, 0xc211453b60, 0x1, 0x0, 0x0)
        /usr/local/go/src/pkg/net/http/transport.go:187 +0x391
net/http.send(0xc211453b60, 0x7f733a9db2b8, 0xc21005a200, 0x0, 0x0, ...)
        /usr/local/go/src/pkg/net/http/client.go:168 +0x37f
net/http.(*Client).send(0xc2100633c0, 0xc211453b60, 0x257, 0x4fbac3, 0x60e0e0)
        /usr/local/go/src/pkg/net/http/client.go:100 +0xd9
net/http.(*Client).doFollowingRedirects(0xc2100633c0, 0xc211453b60, 0x76e690, 0x0, 0x0, ...)
        /usr/local/go/src/pkg/net/http/client.go:294 +0x671
net/http.(*Client).Do(0xc2100633c0, 0xc211453b60, 0x9cc360, 0x0, 0x0)
        /usr/local/go/src/pkg/net/http/client.go:129 +0x8f
github.com/buger/gor.(*HTTPOutput).sendRequest(0xc210052360, 0xc2100633c0, 0xc2103cb000, 0xe20, 0xe20)
        /tmp/go/src/github.com/buger/gor/output_http.go:130 +0x42d
github.com/buger/gor.(*HTTPOutput).worker(0xc210052360, 0x5)
        /tmp/go/src/github.com/buger/gor/output_http.go:94 +0xa0
created by github.com/buger/gor.NewHTTPOutput
        /tmp/go/src/github.com/buger/gor/output_http.go:77 +0x2a2

goroutine 11 [select]:
net/http.(*persistConn).roundTrip(0xc210239a80, 0xc21132c340, 0xc210239a80, 0x0, 0x0)
        /usr/local/go/src/pkg/net/http/transport.go:879 +0x6d6
net/http.(*Transport).RoundTrip(0xc21005a200, 0xc2112a2c30, 0x1, 0x0, 0x0)
        /usr/local/go/src/pkg/net/http/transport.go:187 +0x391
net/http.send(0xc2112a2c30, 0x7f733a9db2b8, 0xc21005a200, 0x0, 0x0, ...)
        /usr/local/go/src/pkg/net/http/client.go:168 +0x37f
net/http.(*Client).send(0xc2100633f0, 0xc2112a2c30, 0x257, 0x4fbac3, 0x60e0e0)
        /usr/local/go/src/pkg/net/http/client.go:100 +0xd9
net/http.(*Client).doFollowingRedirects(0xc2100633f0, 0xc2112a2c30, 0x76e690, 0x0, 0x0, ...)
        /usr/local/go/src/pkg/net/http/client.go:294 +0x671
net/http.(*Client).Do(0xc2100633f0, 0xc2112a2c30, 0x9cc360, 0x0, 0x0)
        /usr/local/go/src/pkg/net/http/client.go:129 +0x8f
github.com/buger/gor.(*HTTPOutput).sendRequest(0xc210052360, 0xc2100633f0, 0xc211235000, 0xdef, 0xdef)
        /tmp/go/src/github.com/buger/gor/output_http.go:130 +0x42d
github.com/buger/gor.(*HTTPOutput).worker(0xc210052360, 0x6)
        /tmp/go/src/github.com/buger/gor/output_http.go:94 +0xa0
created by github.com/buger/gor.NewHTTPOutput
        /tmp/go/src/github.com/buger/gor/output_http.go:77 +0x2a2

goroutine 12 [select]:
net/http.(*persistConn).roundTrip(0xc210239f80, 0xc21132cfa0, 0xc210239f80, 0x0, 0x0)
        /usr/local/go/src/pkg/net/http/transport.go:879 +0x6d6
net/http.(*Transport).RoundTrip(0xc21005a200, 0xc2118d51a0, 0x1, 0x0, 0x0)
        /usr/local/go/src/pkg/net/http/transport.go:187 +0x391
net/http.send(0xc2118d51a0, 0x7f733a9db2b8, 0xc21005a200, 0x0, 0x0, ...)
        /usr/local/go/src/pkg/net/http/client.go:168 +0x37f
net/http.(*Client).send(0xc210063420, 0xc2118d51a0, 0x257, 0x4fbac3, 0x60e0e0)
        /usr/local/go/src/pkg/net/http/client.go:100 +0xd9
net/http.(*Client).doFollowingRedirects(0xc210063420, 0xc2118d51a0, 0x76e690, 0x0, 0x0, ...)
        /usr/local/go/src/pkg/net/http/client.go:294 +0x671
net/http.(*Client).Do(0xc210063420, 0xc2118d51a0, 0x9cc360, 0x0, 0x0)
        /usr/local/go/src/pkg/net/http/client.go:129 +0x8f
github.com/buger/gor.(*HTTPOutput).sendRequest(0xc210052360, 0xc210063420, 0xc2112e3000, 0xdef, 0xdef)
        /tmp/go/src/github.com/buger/gor/output_http.go:130 +0x42d
github.com/buger/gor.(*HTTPOutput).worker(0xc210052360, 0x7)
        /tmp/go/src/github.com/buger/gor/output_http.go:94 +0xa0
created by github.com/buger/gor.NewHTTPOutput
        /tmp/go/src/github.com/buger/gor/output_http.go:77 +0x2a2

goroutine 13 [select]:
net/http.(*persistConn).roundTrip(0xc2107f4300, 0xc2112edb40, 0xc2107f4300, 0x0, 0x0)
        /usr/local/go/src/pkg/net/http/transport.go:879 +0x6d6
net/http.(*Transport).RoundTrip(0xc21005a200, 0xc2106a5ea0, 0x1, 0x0, 0x0)
        /usr/local/go/src/pkg/net/http/transport.go:187 +0x391
net/http.send(0xc2106a5ea0, 0x7f733a9db2b8, 0xc21005a200, 0x0, 0x0, ...)
        /usr/local/go/src/pkg/net/http/client.go:168 +0x37f
net/http.(*Client).send(0xc210063450, 0xc2106a5ea0, 0x257, 0x4fbac3, 0x60e0e0)
        /usr/local/go/src/pkg/net/http/client.go:100 +0xd9
net/http.(*Client).doFollowingRedirects(0xc210063450, 0xc2106a5ea0, 0x76e690, 0x0, 0x0, ...)
        /usr/local/go/src/pkg/net/http/client.go:294 +0x671
net/http.(*Client).Do(0xc210063450, 0xc2106a5ea0, 0x9cc360, 0x0, 0x0)
        /usr/local/go/src/pkg/net/http/client.go:129 +0x8f
github.com/buger/gor.(*HTTPOutput).sendRequest(0xc210052360, 0xc210063450, 0xc210820000, 0xdee, 0xdee)
        /tmp/go/src/github.com/buger/gor/output_http.go:130 +0x42d
github.com/buger/gor.(*HTTPOutput).worker(0xc210052360, 0x8)
        /tmp/go/src/github.com/buger/gor/output_http.go:94 +0xa0
created by github.com/buger/gor.NewHTTPOutput
        /tmp/go/src/github.com/buger/gor/output_http.go:77 +0x2a2

goroutine 14 [select]:
net/http.(*persistConn).roundTrip(0xc21012fd00, 0xc2118d8de0, 0xc21012fd00, 0x0, 0x0)
        /usr/local/go/src/pkg/net/http/transport.go:879 +0x6d6
net/http.(*Transport).RoundTrip(0xc21005a200, 0xc2116b9680, 0x1, 0x0, 0x0)
        /usr/local/go/src/pkg/net/http/transport.go:187 +0x391
net/http.send(0xc2116b9680, 0x7f733a9db2b8, 0xc21005a200, 0x0, 0x0, ...)
        /usr/local/go/src/pkg/net/http/client.go:168 +0x37f
net/http.(*Client).send(0xc210063480, 0xc2116b9680, 0x257, 0x4fbac3, 0x60e0e0)
        /usr/local/go/src/pkg/net/http/client.go:100 +0xd9
net/http.(*Client).doFollowingRedirects(0xc210063480, 0xc2116b9680, 0x76e690, 0x0, 0x0, ...)
        /usr/local/go/src/pkg/net/http/client.go:294 +0x671
net/http.(*Client).Do(0xc210063480, 0xc2116b9680, 0x9cc360, 0x0, 0x0)
        /usr/local/go/src/pkg/net/http/client.go:129 +0x8f
github.com/buger/gor.(*HTTPOutput).sendRequest(0xc210052360, 0xc210063480, 0xc210bd9000, 0xdef, 0xdef)
        /tmp/go/src/github.com/buger/gor/output_http.go:130 +0x42d
github.com/buger/gor.(*HTTPOutput).worker(0xc210052360, 0x9)
        /tmp/go/src/github.com/buger/gor/output_http.go:94 +0xa0
created by github.com/buger/gor.NewHTTPOutput
        /tmp/go/src/github.com/buger/gor/output_http.go:77 +0x2a2

goroutine 15 [chan send]:
github.com/buger/gor.(*HTTPOutput).Write(0xc210052360, 0xc210075000, 0x3ed, 0x8000, 0x3ed, ...)
        /tmp/go/src/github.com/buger/gor/output_http.go:102 +0xf6
github.com/buger/gor.CopyMulty(0x7f733a9dc848, 0xc2100630f0, 0xc21006c120, 0x2, 0x2, ...)
        /tmp/go/src/github.com/buger/gor/emitter.go:39 +0x48a
created by github.com/buger/gor.Start
        /tmp/go/src/github.com/buger/gor/emitter.go:9 +0x8b

goroutine 16 [select]:
github.com/mattbaird/elastigo/core.func·003()
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:206 +0x282
created by github.com/mattbaird/elastigo/core.(*BulkIndexer).startHttpSender
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:237 +0x82

goroutine 17 [select]:
github.com/mattbaird/elastigo/core.func·003()
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:206 +0x282
created by github.com/mattbaird/elastigo/core.(*BulkIndexer).startHttpSender
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:237 +0x82

goroutine 18 [select]:
github.com/mattbaird/elastigo/core.func·003()
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:206 +0x282
created by github.com/mattbaird/elastigo/core.(*BulkIndexer).startHttpSender
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:237 +0x82

goroutine 19 [select]:
github.com/mattbaird/elastigo/core.func·003()
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:206 +0x282
created by github.com/mattbaird/elastigo/core.(*BulkIndexer).startHttpSender
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:237 +0x82

goroutine 20 [select]:
github.com/mattbaird/elastigo/core.func·003()
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:206 +0x282
created by github.com/mattbaird/elastigo/core.(*BulkIndexer).startHttpSender
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:237 +0x82

goroutine 21 [select]:
github.com/mattbaird/elastigo/core.func·003()
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:206 +0x282
created by github.com/mattbaird/elastigo/core.(*BulkIndexer).startHttpSender
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:237 +0x82

goroutine 22 [select]:
github.com/mattbaird/elastigo/core.func·003()
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:206 +0x282
created by github.com/mattbaird/elastigo/core.(*BulkIndexer).startHttpSender
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:237 +0x82

goroutine 23 [select]:
github.com/mattbaird/elastigo/core.func·003()
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:206 +0x282
created by github.com/mattbaird/elastigo/core.(*BulkIndexer).startHttpSender
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:237 +0x82

goroutine 24 [select]:
github.com/mattbaird/elastigo/core.func·003()
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:206 +0x282
created by github.com/mattbaird/elastigo/core.(*BulkIndexer).startHttpSender
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:237 +0x82

goroutine 25 [select]:
github.com/mattbaird/elastigo/core.func·003()
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:206 +0x282
created by github.com/mattbaird/elastigo/core.(*BulkIndexer).startHttpSender
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:237 +0x82

goroutine 26 [select]:
github.com/mattbaird/elastigo/core.func·003()
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:206 +0x282
created by github.com/mattbaird/elastigo/core.(*BulkIndexer).startHttpSender
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:237 +0x82

goroutine 27 [select]:
github.com/mattbaird/elastigo/core.func·003()
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:206 +0x282
created by github.com/mattbaird/elastigo/core.(*BulkIndexer).startHttpSender
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:237 +0x82

goroutine 28 [select]:
github.com/mattbaird/elastigo/core.func·003()
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:206 +0x282
created by github.com/mattbaird/elastigo/core.(*BulkIndexer).startHttpSender
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:237 +0x82

goroutine 29 [select]:
github.com/mattbaird/elastigo/core.func·003()
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:206 +0x282
created by github.com/mattbaird/elastigo/core.(*BulkIndexer).startHttpSender
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:237 +0x82

goroutine 30 [select]:
github.com/mattbaird/elastigo/core.func·003()
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:206 +0x282
created by github.com/mattbaird/elastigo/core.(*BulkIndexer).startHttpSender
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:237 +0x82

goroutine 31 [select]:
github.com/mattbaird/elastigo/core.func·003()
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:206 +0x282
created by github.com/mattbaird/elastigo/core.(*BulkIndexer).startHttpSender
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:237 +0x82

goroutine 32 [select]:
github.com/mattbaird/elastigo/core.func·003()
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:206 +0x282
created by github.com/mattbaird/elastigo/core.(*BulkIndexer).startHttpSender
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:237 +0x82

goroutine 33 [select]:
github.com/mattbaird/elastigo/core.func·003()
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:206 +0x282
created by github.com/mattbaird/elastigo/core.(*BulkIndexer).startHttpSender
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:237 +0x82

goroutine 34 [select]:
github.com/mattbaird/elastigo/core.func·003()
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:206 +0x282
created by github.com/mattbaird/elastigo/core.(*BulkIndexer).startHttpSender
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:237 +0x82

goroutine 35 [select]:
github.com/mattbaird/elastigo/core.func·003()
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:206 +0x282
created by github.com/mattbaird/elastigo/core.(*BulkIndexer).startHttpSender
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:237 +0x82

goroutine 36 [select]:
github.com/mattbaird/elastigo/core.func·003()
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:206 +0x282
created by github.com/mattbaird/elastigo/core.(*BulkIndexer).startHttpSender
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:237 +0x82

goroutine 37 [select]:
github.com/mattbaird/elastigo/core.func·003()
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:206 +0x282
created by github.com/mattbaird/elastigo/core.(*BulkIndexer).startHttpSender
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:237 +0x82

goroutine 38 [select]:
github.com/mattbaird/elastigo/core.func·003()
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:206 +0x282
created by github.com/mattbaird/elastigo/core.(*BulkIndexer).startHttpSender
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:237 +0x82

goroutine 39 [select]:
github.com/mattbaird/elastigo/core.func·003()
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:206 +0x282
created by github.com/mattbaird/elastigo/core.(*BulkIndexer).startHttpSender
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:237 +0x82

goroutine 40 [select]:
github.com/mattbaird/elastigo/core.func·003()
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:206 +0x282
created by github.com/mattbaird/elastigo/core.(*BulkIndexer).startHttpSender
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:237 +0x82

goroutine 41 [select]:
github.com/mattbaird/elastigo/core.func·003()
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:206 +0x282
created by github.com/mattbaird/elastigo/core.(*BulkIndexer).startHttpSender
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:237 +0x82

goroutine 42 [select]:
github.com/mattbaird/elastigo/core.func·003()
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:206 +0x282
created by github.com/mattbaird/elastigo/core.(*BulkIndexer).startHttpSender
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:237 +0x82

goroutine 43 [select]:
github.com/mattbaird/elastigo/core.func·003()
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:206 +0x282
created by github.com/mattbaird/elastigo/core.(*BulkIndexer).startHttpSender
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:237 +0x82

goroutine 44 [select]:
github.com/mattbaird/elastigo/core.func·003()
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:206 +0x282
created by github.com/mattbaird/elastigo/core.(*BulkIndexer).startHttpSender
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:237 +0x82

goroutine 45 [select]:
github.com/mattbaird/elastigo/core.func·003()
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:206 +0x282
created by github.com/mattbaird/elastigo/core.(*BulkIndexer).startHttpSender
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:237 +0x82

goroutine 46 [select]:
github.com/mattbaird/elastigo/core.func·003()
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:206 +0x282
created by github.com/mattbaird/elastigo/core.(*BulkIndexer).startHttpSender
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:237 +0x82

goroutine 47 [select]:
github.com/mattbaird/elastigo/core.func·003()
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:206 +0x282
created by github.com/mattbaird/elastigo/core.(*BulkIndexer).startHttpSender
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:237 +0x82

goroutine 48 [select]:
github.com/mattbaird/elastigo/core.func·003()
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:206 +0x282
created by github.com/mattbaird/elastigo/core.(*BulkIndexer).startHttpSender
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:237 +0x82

goroutine 49 [select]:
github.com/mattbaird/elastigo/core.func·003()
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:206 +0x282
created by github.com/mattbaird/elastigo/core.(*BulkIndexer).startHttpSender
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:237 +0x82

goroutine 50 [select]:
github.com/mattbaird/elastigo/core.func·003()
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:206 +0x282
created by github.com/mattbaird/elastigo/core.(*BulkIndexer).startHttpSender
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:237 +0x82

goroutine 51 [select]:
github.com/mattbaird/elastigo/core.func·003()
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:206 +0x282
created by github.com/mattbaird/elastigo/core.(*BulkIndexer).startHttpSender
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:237 +0x82

goroutine 52 [select]:
github.com/mattbaird/elastigo/core.func·003()
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:206 +0x282
created by github.com/mattbaird/elastigo/core.(*BulkIndexer).startHttpSender
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:237 +0x82

goroutine 53 [select]:
github.com/mattbaird/elastigo/core.func·003()
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:206 +0x282
created by github.com/mattbaird/elastigo/core.(*BulkIndexer).startHttpSender
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:237 +0x82

goroutine 54 [select]:
github.com/mattbaird/elastigo/core.func·003()
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:206 +0x282
created by github.com/mattbaird/elastigo/core.(*BulkIndexer).startHttpSender
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:237 +0x82

goroutine 55 [select]:
github.com/mattbaird/elastigo/core.func·003()
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:206 +0x282
created by github.com/mattbaird/elastigo/core.(*BulkIndexer).startHttpSender
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:237 +0x82

goroutine 56 [select]:
github.com/mattbaird/elastigo/core.func·003()
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:206 +0x282
created by github.com/mattbaird/elastigo/core.(*BulkIndexer).startHttpSender
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:237 +0x82

goroutine 57 [select]:
github.com/mattbaird/elastigo/core.func·003()
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:206 +0x282
created by github.com/mattbaird/elastigo/core.(*BulkIndexer).startHttpSender
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:237 +0x82

goroutine 58 [select]:
github.com/mattbaird/elastigo/core.func·003()
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:206 +0x282
created by github.com/mattbaird/elastigo/core.(*BulkIndexer).startHttpSender
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:237 +0x82

goroutine 59 [select]:
github.com/mattbaird/elastigo/core.func·003()
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:206 +0x282
created by github.com/mattbaird/elastigo/core.(*BulkIndexer).startHttpSender
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:237 +0x82

goroutine 60 [select]:
github.com/mattbaird/elastigo/core.func·003()
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:206 +0x282
created by github.com/mattbaird/elastigo/core.(*BulkIndexer).startHttpSender
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:237 +0x82

goroutine 61 [select]:
github.com/mattbaird/elastigo/core.func·003()
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:206 +0x282
created by github.com/mattbaird/elastigo/core.(*BulkIndexer).startHttpSender
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:237 +0x82

goroutine 62 [select]:
github.com/mattbaird/elastigo/core.func·003()
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:206 +0x282
created by github.com/mattbaird/elastigo/core.(*BulkIndexer).startHttpSender
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:237 +0x82

goroutine 63 [select]:
github.com/mattbaird/elastigo/core.func·003()
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:206 +0x282
created by github.com/mattbaird/elastigo/core.(*BulkIndexer).startHttpSender
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:237 +0x82

goroutine 64 [select]:
github.com/mattbaird/elastigo/core.func·003()
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:206 +0x282
created by github.com/mattbaird/elastigo/core.(*BulkIndexer).startHttpSender
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:237 +0x82

goroutine 65 [select]:
github.com/mattbaird/elastigo/core.func·003()
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:206 +0x282
created by github.com/mattbaird/elastigo/core.(*BulkIndexer).startHttpSender
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:237 +0x82

goroutine 66 [select]:
github.com/mattbaird/elastigo/core.func·005()
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:275 +0x1da
created by github.com/mattbaird/elastigo/core.(*BulkIndexer).startDocChannel
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:291 +0x63

goroutine 68 [select]:
github.com/mattbaird/elastigo/core.func·004()
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:248 +0x1d1
created by github.com/mattbaird/elastigo/core.(*BulkIndexer).startTimer
        /tmp/go/src/github.com/mattbaird/elastigo/core/bulk.go:267 +0x161

goroutine 70 [chan send]:
github.com/buger/gor.(*TCPInput).handleConnection(0xc2100630f0, 0x7f733a9dc9b8, 0xc2100003e0)
        /tmp/go/src/github.com/buger/gor/input_tcp.go:86 +0x179
created by github.com/buger/gor.func·001
        /tmp/go/src/github.com/buger/gor/input_tcp.go:53 +0x169

goroutine 105 [chan send]:
github.com/buger/gor.(*TCPInput).handleConnection(0xc2100630f0, 0x7f733a9dc9b8, 0xc210000a88)
        /tmp/go/src/github.com/buger/gor/input_tcp.go:86 +0x179
created by github.com/buger/gor.func·001
        /tmp/go/src/github.com/buger/gor/input_tcp.go:53 +0x169

goroutine 72 [syscall]:
runtime.goexit()
        /usr/local/go/src/pkg/runtime/proc.c:1394

goroutine 5740 [IO wait]:
net.runtime_pollWait(0x7f733a9dc650, 0x72, 0x0)
        /usr/local/go/src/pkg/runtime/netpoll.goc:116 +0x6a
net.(*pollDesc).Wait(0xc2107efe60, 0x72, 0x7f733a9db0e8, 0xb)
        /usr/local/go/src/pkg/net/fd_poll_runtime.go:81 +0x34
net.(*pollDesc).WaitRead(0xc2107efe60, 0xb, 0x7f733a9db0e8)
        /usr/local/go/src/pkg/net/fd_poll_runtime.go:86 +0x30
net.(*netFD).Read(0xc2107efe00, 0xc21116c000, 0x1000, 0x1000, 0x0, ...)
        /usr/local/go/src/pkg/net/fd_unix.go:204 +0x2a0
net.(*conn).Read(0xc210557b20, 0xc21116c000, 0x1000, 0x1000, 0x0, ...)
        /usr/local/go/src/pkg/net/net.go:122 +0xc5
bufio.(*Reader).fill(0xc21115f3c0)
        /usr/local/go/src/pkg/bufio/bufio.go:91 +0x110
bufio.(*Reader).Peek(0xc21115f3c0, 0x1, 0x9c6f67, 0xc2107ef9f8, 0x238089f28, ...)
        /usr/local/go/src/pkg/bufio/bufio.go:119 +0xcb
net/http.(*persistConn).readLoop(0xc210239a80)
        /usr/local/go/src/pkg/net/http/transport.go:687 +0xb7
created by net/http.(*Transport).dialConn
        /usr/local/go/src/pkg/net/http/transport.go:528 +0x607

goroutine 5773 [select]:
net/http.(*persistConn).writeLoop(0xc21012fd00)
        /usr/local/go/src/pkg/net/http/transport.go:791 +0x271
created by net/http.(*Transport).dialConn
        /usr/local/go/src/pkg/net/http/transport.go:529 +0x61e

goroutine 106 [chan send]:
github.com/buger/gor.(*TCPInput).handleConnection(0xc2100630f0, 0x7f733a9dc9b8, 0xc210000aa8)
        /tmp/go/src/github.com/buger/gor/input_tcp.go:86 +0x179
created by github.com/buger/gor.func·001
        /tmp/go/src/github.com/buger/gor/input_tcp.go:53 +0x169

goroutine 103 [chan send]:
github.com/buger/gor.(*TCPInput).handleConnection(0xc2100630f0, 0x7f733a9dc9b8, 0xc210000a48)
        /tmp/go/src/github.com/buger/gor/input_tcp.go:86 +0x179
created by github.com/buger/gor.func·001
        /tmp/go/src/github.com/buger/gor/input_tcp.go:53 +0x169

goroutine 104 [chan send]:
github.com/buger/gor.(*TCPInput).handleConnection(0xc2100630f0, 0x7f733a9dc9b8, 0xc210000a68)
        /tmp/go/src/github.com/buger/gor/input_tcp.go:86 +0x179
created by github.com/buger/gor.func·001
        /tmp/go/src/github.com/buger/gor/input_tcp.go:53 +0x169

goroutine 102 [chan send]:
github.com/buger/gor.(*TCPInput).handleConnection(0xc2100630f0, 0x7f733a9dc9b8, 0xc210000a10)
        /tmp/go/src/github.com/buger/gor/input_tcp.go:86 +0x179
created by github.com/buger/gor.func·001
        /tmp/go/src/github.com/buger/gor/input_tcp.go:53 +0x169

goroutine 108 [chan send]:
github.com/buger/gor.(*TCPInput).handleConnection(0xc2100630f0, 0x7f733a9dc9b8, 0xc210000ae8)
        /tmp/go/src/github.com/buger/gor/input_tcp.go:86 +0x179
created by github.com/buger/gor.func·001
        /tmp/go/src/github.com/buger/gor/input_tcp.go:53 +0x169

goroutine 109 [chan send]:
github.com/buger/gor.(*TCPInput).handleConnection(0xc2100630f0, 0x7f733a9dc9b8, 0xc210000b30)
        /tmp/go/src/github.com/buger/gor/input_tcp.go:86 +0x179
created by github.com/buger/gor.func·001
        /tmp/go/src/github.com/buger/gor/input_tcp.go:53 +0x169

goroutine 110 [chan send]:
github.com/buger/gor.(*TCPInput).handleConnection(0xc2100630f0, 0x7f733a9dc9b8, 0xc210000b50)
        /tmp/go/src/github.com/buger/gor/input_tcp.go:86 +0x179
created by github.com/buger/gor.func·001
        /tmp/go/src/github.com/buger/gor/input_tcp.go:53 +0x169

goroutine 155 [select]:
net/http.(*persistConn).writeLoop(0xc21012f080)
        /usr/local/go/src/pkg/net/http/transport.go:791 +0x271
created by net/http.(*Transport).dialConn
        /usr/local/go/src/pkg/net/http/transport.go:529 +0x61e

goroutine 5763 [IO wait]:
net.runtime_pollWait(0x7f733a9dbe70, 0x72, 0x0)
        /usr/local/go/src/pkg/runtime/netpoll.goc:116 +0x6a
net.(*pollDesc).Wait(0xc211652680, 0x72, 0x7f733a9db0e8, 0xb)
        /usr/local/go/src/pkg/net/fd_poll_runtime.go:81 +0x34
net.(*pollDesc).WaitRead(0xc211652680, 0xb, 0x7f733a9db0e8)
        /usr/local/go/src/pkg/net/fd_poll_runtime.go:86 +0x30
net.(*netFD).Read(0xc211652620, 0xc211697000, 0x1000, 0x1000, 0x0, ...)
        /usr/local/go/src/pkg/net/fd_unix.go:204 +0x2a0
net.(*conn).Read(0xc2101cf3c0, 0xc211697000, 0x1000, 0x1000, 0x0, ...)
        /usr/local/go/src/pkg/net/net.go:122 +0xc5
bufio.(*Reader).fill(0xc2116861e0)
        /usr/local/go/src/pkg/bufio/bufio.go:91 +0x110
bufio.(*Reader).Peek(0xc2116861e0, 0x1, 0x9c6f67, 0xc210133f38, 0x2380a5f28, ...)
        /usr/local/go/src/pkg/bufio/bufio.go:119 +0xcb
net/http.(*persistConn).readLoop(0xc21012f480)
        /usr/local/go/src/pkg/net/http/transport.go:687 +0xb7
created by net/http.(*Transport).dialConn
        /usr/local/go/src/pkg/net/http/transport.go:528 +0x607

goroutine 154 [IO wait]:
net.runtime_pollWait(0x7f733a9dbf18, 0x72, 0x0)
        /usr/local/go/src/pkg/runtime/netpoll.goc:116 +0x6a
net.(*pollDesc).Wait(0xc2101226f0, 0x72, 0x7f733a9db0e8, 0xb)
        /usr/local/go/src/pkg/net/fd_poll_runtime.go:81 +0x34
net.(*pollDesc).WaitRead(0xc2101226f0, 0xb, 0x7f733a9db0e8)
        /usr/local/go/src/pkg/net/fd_poll_runtime.go:86 +0x30
net.(*netFD).Read(0xc210122690, 0xc2101ab000, 0x1000, 0x1000, 0x0, ...)
        /usr/local/go/src/pkg/net/fd_unix.go:204 +0x2a0
net.(*conn).Read(0xc210000bd0, 0xc2101ab000, 0x1000, 0x1000, 0x30, ...)
        /usr/local/go/src/pkg/net/net.go:122 +0xc5
bufio.(*Reader).fill(0xc21019c1e0)
        /usr/local/go/src/pkg/bufio/bufio.go:91 +0x110
bufio.(*Reader).Peek(0xc21019c1e0, 0x1, 0x0, 0x0, 0x0, ...)
        /usr/local/go/src/pkg/bufio/bufio.go:119 +0xcb
net/http.(*persistConn).readLoop(0xc21012f080)
        /usr/local/go/src/pkg/net/http/transport.go:687 +0xb7
created by net/http.(*Transport).dialConn
        /usr/local/go/src/pkg/net/http/transport.go:528 +0x607

goroutine 5683 [IO wait]:
net.runtime_pollWait(0x7f733a9dbb28, 0x72, 0x0)
        /usr/local/go/src/pkg/runtime/netpoll.goc:116 +0x6a
net.(*pollDesc).Wait(0xc210208990, 0x72, 0x7f733a9db0e8, 0xb)
        /usr/local/go/src/pkg/net/fd_poll_runtime.go:81 +0x34
net.(*pollDesc).WaitRead(0xc210208990, 0xb, 0x7f733a9db0e8)
        /usr/local/go/src/pkg/net/fd_poll_runtime.go:86 +0x30
net.(*netFD).Read(0xc210208930, 0xc210bf0000, 0x1000, 0x1000, 0x0, ...)
        /usr/local/go/src/pkg/net/fd_unix.go:204 +0x2a0
net.(*conn).Read(0xc2103d1928, 0xc210bf0000, 0x1000, 0x1000, 0x0, ...)
        /usr/local/go/src/pkg/net/net.go:122 +0xc5
bufio.(*Reader).fill(0xc2100f7720)
        /usr/local/go/src/pkg/bufio/bufio.go:91 +0x110
bufio.(*Reader).Peek(0xc2100f7720, 0x1, 0x9c6f67, 0xc2102083d8, 0x2380a1f28, ...)
        /usr/local/go/src/pkg/bufio/bufio.go:119 +0xcb
net/http.(*persistConn).readLoop(0xc2107f4300)
        /usr/local/go/src/pkg/net/http/transport.go:687 +0xb7
created by net/http.(*Transport).dialConn
        /usr/local/go/src/pkg/net/http/transport.go:528 +0x607

goroutine 5743 [IO wait]:
net.runtime_pollWait(0x7f733a9db930, 0x72, 0x0)
        /usr/local/go/src/pkg/runtime/netpoll.goc:116 +0x6a
net.(*pollDesc).Wait(0xc21015f920, 0x72, 0x7f733a9db0e8, 0xb)
        /usr/local/go/src/pkg/net/fd_poll_runtime.go:81 +0x34
net.(*pollDesc).WaitRead(0xc21015f920, 0xb, 0x7f733a9db0e8)
        /usr/local/go/src/pkg/net/fd_poll_runtime.go:86 +0x30
net.(*netFD).Read(0xc21015f8c0, 0xc211460000, 0x1000, 0x1000, 0x0, ...)
        /usr/local/go/src/pkg/net/fd_unix.go:204 +0x2a0
net.(*conn).Read(0xc210557cb0, 0xc211460000, 0x1000, 0x1000, 0x30, ...)
        /usr/local/go/src/pkg/net/net.go:122 +0xc5
bufio.(*Reader).fill(0xc21115fcc0)
        /usr/local/go/src/pkg/bufio/bufio.go:91 +0x110
bufio.(*Reader).Peek(0xc21115fcc0, 0x1, 0x0, 0x0, 0x0, ...)
        /usr/local/go/src/pkg/bufio/bufio.go:119 +0xcb
net/http.(*persistConn).readLoop(0xc210239c00)
        /usr/local/go/src/pkg/net/http/transport.go:687 +0xb7
created by net/http.(*Transport).dialConn
        /usr/local/go/src/pkg/net/http/transport.go:528 +0x607

goroutine 5729 [select]:
net/http.(*persistConn).writeLoop(0xc210239500)
        /usr/local/go/src/pkg/net/http/transport.go:791 +0x271
created by net/http.(*Transport).dialConn
        /usr/local/go/src/pkg/net/http/transport.go:529 +0x61e

goroutine 5755 [select]:
net/http.(*persistConn).writeLoop(0xc210239f80)
        /usr/local/go/src/pkg/net/http/transport.go:791 +0x271
created by net/http.(*Transport).dialConn
        /usr/local/go/src/pkg/net/http/transport.go:529 +0x61e

goroutine 5728 [IO wait]:
net.runtime_pollWait(0x7f733a9dbdc8, 0x72, 0x0)
        /usr/local/go/src/pkg/runtime/netpoll.goc:116 +0x6a
net.(*pollDesc).Wait(0xc210122290, 0x72, 0x7f733a9db0e8, 0xb)
        /usr/local/go/src/pkg/net/fd_poll_runtime.go:81 +0x34
net.(*pollDesc).WaitRead(0xc210122290, 0xb, 0x7f733a9db0e8)
        /usr/local/go/src/pkg/net/fd_poll_runtime.go:86 +0x30
net.(*netFD).Read(0xc210122230, 0xc21129e000, 0x1000, 0x1000, 0x0, ...)
        /usr/local/go/src/pkg/net/fd_unix.go:204 +0x2a0
net.(*conn).Read(0xc210557760, 0xc21129e000, 0x1000, 0x1000, 0x0, ...)
        /usr/local/go/src/pkg/net/net.go:122 +0xc5
bufio.(*Reader).fill(0xc21166c480)
        /usr/local/go/src/pkg/bufio/bufio.go:91 +0x110
bufio.(*Reader).Peek(0xc21166c480, 0x1, 0x9c6f67, 0xc2101e6ad8, 0x2380b5f28, ...)
        /usr/local/go/src/pkg/bufio/bufio.go:119 +0xcb
net/http.(*persistConn).readLoop(0xc210239500)
        /usr/local/go/src/pkg/net/http/transport.go:687 +0xb7
created by net/http.(*Transport).dialConn
        /usr/local/go/src/pkg/net/http/transport.go:528 +0x607

goroutine 5764 [select]:
net/http.(*persistConn).writeLoop(0xc21012f480)
        /usr/local/go/src/pkg/net/http/transport.go:791 +0x271
created by net/http.(*Transport).dialConn
        /usr/local/go/src/pkg/net/http/transport.go:529 +0x61e

goroutine 5707 [IO wait]:
net.runtime_pollWait(0x7f733a9dba80, 0x72, 0x0)
        /usr/local/go/src/pkg/runtime/netpoll.goc:116 +0x6a
net.(*pollDesc).Wait(0xc2104753e0, 0x72, 0x7f733a9db0e8, 0xb)
        /usr/local/go/src/pkg/net/fd_poll_runtime.go:81 +0x34
net.(*pollDesc).WaitRead(0xc2104753e0, 0xb, 0x7f733a9db0e8)
        /usr/local/go/src/pkg/net/fd_poll_runtime.go:86 +0x30
net.(*netFD).Read(0xc210475380, 0xc210572000, 0x1000, 0x1000, 0x0, ...)
        /usr/local/go/src/pkg/net/fd_unix.go:204 +0x2a0
net.(*conn).Read(0xc210557060, 0xc210572000, 0x1000, 0x1000, 0x0, ...)
        /usr/local/go/src/pkg/net/net.go:122 +0xc5
bufio.(*Reader).fill(0xc21128a900)
        /usr/local/go/src/pkg/bufio/bufio.go:91 +0x110
bufio.(*Reader).Peek(0xc21128a900, 0x1, 0x9c6f67, 0xc210fedde8, 0x238097f28, ...)
        /usr/local/go/src/pkg/bufio/bufio.go:119 +0xcb
net/http.(*persistConn).readLoop(0xc2107f4d00)
        /usr/local/go/src/pkg/net/http/transport.go:687 +0xb7
created by net/http.(*Transport).dialConn
        /usr/local/go/src/pkg/net/http/transport.go:528 +0x607

goroutine 5708 [select]:
net/http.(*persistConn).writeLoop(0xc2107f4d00)
        /usr/local/go/src/pkg/net/http/transport.go:791 +0x271
created by net/http.(*Transport).dialConn
        /usr/local/go/src/pkg/net/http/transport.go:529 +0x61e

goroutine 5744 [select]:
net/http.(*persistConn).writeLoop(0xc210239c00)
        /usr/local/go/src/pkg/net/http/transport.go:791 +0x271
created by net/http.(*Transport).dialConn
        /usr/local/go/src/pkg/net/http/transport.go:529 +0x61e

goroutine 5684 [select]:
net/http.(*persistConn).writeLoop(0xc2107f4300)
        /usr/local/go/src/pkg/net/http/transport.go:791 +0x271
created by net/http.(*Transport).dialConn
        /usr/local/go/src/pkg/net/http/transport.go:529 +0x61e

goroutine 5789 [runnable]:
net._C2func_getaddrinfo(0x7f73240008c0, 0x0, 0xc211940cf0, 0xc210000a98, 0x0, ...)
        net/_obj/_cgo_defun.c:50 +0x36
net.cgoLookupIPCNAME(0xc2119b5230, 0x45, 0x0, 0x0, 0x0, ...)
        /usr/local/go/src/pkg/net/cgo_unix.go:96 +0x174
net.cgoLookupIP(0xc2119b5230, 0x45, 0x0, 0x0, 0x0, ...)
        /usr/local/go/src/pkg/net/cgo_unix.go:148 +0x69
net.lookupIP(0xc2119b5230, 0x45, 0x0, 0x0, 0x0, ...)
        /usr/local/go/src/pkg/net/lookup_unix.go:64 +0x63
net.func·022(0x9cbcd0, 0xc2100637e0, 0xc2119b5230, 0x45)
        /usr/local/go/src/pkg/net/lookup.go:41 +0x2d
net.(*singleflight).Do(0x9cbcd0, 0xc2119b5230, 0x45, 0x7f73380b39e0, 0x0, ...)
        /usr/local/go/src/pkg/net/singleflight.go:45 +0x1de
net.lookupIPMerge(0xc2119b5230, 0x45, 0x0, 0x0, 0x0, ...)
        /usr/local/go/src/pkg/net/lookup.go:42 +0xc0
net.lookupIPDeadline(0xc2119b5230, 0x45, 0x0, 0x0, 0x0, ...)
        /usr/local/go/src/pkg/net/lookup.go:57 +0xd0
net.resolveInternetAddr(0x6e7bc0, 0x3, 0xc2119b5230, 0x48, 0x0, ...)
        /usr/local/go/src/pkg/net/ipsock.go:285 +0x395
net.resolveAddr(0x6e31e0, 0x4, 0x6e7bc0, 0x3, 0xc2119b5230, ...)
        /usr/local/go/src/pkg/net/dial.go:104 +0x32a
net.(*Dialer).Dial(0x7f73380b3d78, 0x6e7bc0, 0x3, 0xc2119b5230, 0x48, ...)
        /usr/local/go/src/pkg/net/dial.go:153 +0xa7
net.Dial(0x6e7bc0, 0x3, 0xc2119b5230, 0x48, 0x50d83e, ...)
        /usr/local/go/src/pkg/net/dial.go:138 +0x75
net/http.(*Transport).dial(0xc21005a200, 0x6e7bc0, 0x3, 0xc2119b5230, 0x48, ...)
        /usr/local/go/src/pkg/net/http/transport.go:401 +0xd4
net/http.(*Transport).dialConn(0xc21005a200, 0xc211940cc0, 0xc21005ae00, 0x0, 0x0)
        /usr/local/go/src/pkg/net/http/transport.go:444 +0x6e
net/http.func·014()
        /usr/local/go/src/pkg/net/http/transport.go:419 +0x3e
created by net/http.(*Transport).getConn
        /usr/local/go/src/pkg/net/http/transport.go:421 +0x11a

goroutine 5695 [IO wait]:
net.runtime_pollWait(0x7f733a9dbfc0, 0x72, 0x0)
        /usr/local/go/src/pkg/runtime/netpoll.goc:116 +0x6a
net.(*pollDesc).Wait(0xc2100c85a0, 0x72, 0x7f733a9db0e8, 0xb)
        /usr/local/go/src/pkg/net/fd_poll_runtime.go:81 +0x34
net.(*pollDesc).WaitRead(0xc2100c85a0, 0xb, 0x7f733a9db0e8)
        /usr/local/go/src/pkg/net/fd_poll_runtime.go:86 +0x30
net.(*netFD).Read(0xc2100c8540, 0xc210399000, 0x1000, 0x1000, 0x0, ...)
        /usr/local/go/src/pkg/net/fd_unix.go:204 +0x2a0
net.(*conn).Read(0xc2103d1cd0, 0xc210399000, 0x1000, 0x1000, 0x0, ...)
        /usr/local/go/src/pkg/net/net.go:122 +0xc5
bufio.(*Reader).fill(0xc210bab5a0)
        /usr/local/go/src/pkg/bufio/bufio.go:91 +0x110
bufio.(*Reader).Peek(0xc210bab5a0, 0x1, 0x9c6f67, 0xc210810f38, 0x2380b1f28, ...)
        /usr/local/go/src/pkg/bufio/bufio.go:119 +0xcb
net/http.(*persistConn).readLoop(0xc2107f4800)
        /usr/local/go/src/pkg/net/http/transport.go:687 +0xb7
created by net/http.(*Transport).dialConn
        /usr/local/go/src/pkg/net/http/transport.go:528 +0x607

goroutine 5741 [select]:
net/http.(*persistConn).writeLoop(0xc210239a80)
        /usr/local/go/src/pkg/net/http/transport.go:791 +0x271
created by net/http.(*Transport).dialConn
        /usr/local/go/src/pkg/net/http/transport.go:529 +0x61e

goroutine 5754 [IO wait]:
net.runtime_pollWait(0x7f733a9dbd20, 0x72, 0x0)
        /usr/local/go/src/pkg/runtime/netpoll.goc:116 +0x6a
net.(*pollDesc).Wait(0xc210456d10, 0x72, 0x7f733a9db0e8, 0xb)
        /usr/local/go/src/pkg/net/fd_poll_runtime.go:81 +0x34
net.(*pollDesc).WaitRead(0xc210456d10, 0xb, 0x7f733a9db0e8)
        /usr/local/go/src/pkg/net/fd_poll_runtime.go:86 +0x30
net.(*netFD).Read(0xc210456cb0, 0xc2118dd000, 0x1000, 0x1000, 0x0, ...)
        /usr/local/go/src/pkg/net/fd_unix.go:204 +0x2a0
net.(*conn).Read(0xc2101cf0f8, 0xc2118dd000, 0x1000, 0x1000, 0x0, ...)
        /usr/local/go/src/pkg/net/net.go:122 +0xc5
bufio.(*Reader).fill(0xc211468e40)
        /usr/local/go/src/pkg/bufio/bufio.go:91 +0x110
bufio.(*Reader).Peek(0xc211468e40, 0x1, 0x9c6f67, 0xc2104568a8, 0x23808df28, ...)
        /usr/local/go/src/pkg/bufio/bufio.go:119 +0xcb
net/http.(*persistConn).readLoop(0xc210239f80)
        /usr/local/go/src/pkg/net/http/transport.go:687 +0xb7
created by net/http.(*Transport).dialConn
        /usr/local/go/src/pkg/net/http/transport.go:528 +0x607

goroutine 5696 [select]:
net/http.(*persistConn).writeLoop(0xc2107f4800)
        /usr/local/go/src/pkg/net/http/transport.go:791 +0x271
created by net/http.(*Transport).dialConn
        /usr/local/go/src/pkg/net/http/transport.go:529 +0x61e

goroutine 5772 [IO wait]:
net.runtime_pollWait(0x7f733a9dbc78, 0x72, 0x0)
        /usr/local/go/src/pkg/runtime/netpoll.goc:116 +0x6a
net.(*pollDesc).Wait(0xc2100b51b0, 0x72, 0x7f733a9db0e8, 0xb)
        /usr/local/go/src/pkg/net/fd_poll_runtime.go:81 +0x34
net.(*pollDesc).WaitRead(0xc2100b51b0, 0xb, 0x7f733a9db0e8)
        /usr/local/go/src/pkg/net/fd_poll_runtime.go:86 +0x30
net.(*netFD).Read(0xc2100b5150, 0xc21192a000, 0x1000, 0x1000, 0x0, ...)
        /usr/local/go/src/pkg/net/fd_unix.go:204 +0x2a0
net.(*conn).Read(0xc2101cf810, 0xc21192a000, 0x1000, 0x1000, 0x0, ...)
        /usr/local/go/src/pkg/net/net.go:122 +0xc5
bufio.(*Reader).fill(0xc2116cd720)
        /usr/local/go/src/pkg/bufio/bufio.go:91 +0x110
bufio.(*Reader).Peek(0xc2116cd720, 0x1, 0x9c6f67, 0xc210dfac98, 0x238085f28, ...)
        /usr/local/go/src/pkg/bufio/bufio.go:119 +0xcb
net/http.(*persistConn).readLoop(0xc21012fd00)
        /usr/local/go/src/pkg/net/http/transport.go:687 +0xb7
created by net/http.(*Transport).dialConn
        /usr/local/go/src/pkg/net/http/transport.go:528 +0x607

Introduce config file

I think it would be nice to have:

gor --config gor.json

and in gor.json:

{
  'output-raw': 8000,
  'output-http': 'staging:3000'
}

Add section in README for building gor from source

Just a minor proposal here, but you could give a "hint" how to build gor from source (only possible of course if the person has a working go installation).
So, something like "go get ...gor" and maybe note which dependencies are used/required (if any).

Imho it's useful, especially for new Go programmers or to-be Go programmers.

Add traffic percent splitting

Hi,

Actually, only rate limiting is possible. Could you add a fonctionnality which allows to limit a percent of traffic as gor --input-tcp :28020 --output-http "http://staging.com|10%" or gor --input-raw :80 --output-tcp "replay.local:28020|10%" ?

Regards,

Versions 0.7.X unstable to the point of uselessness.

Issues #61 and #82 both occur with a great frequency that makes version 0.7.5 unreliable to the point that running multiple listeners streaming to a reply is unsustainable. The errors both occur with just 1 listener and 1 remote replay. Version 0.7.0 also exhibited the issues. We have rolled back to version 0.3.5 with success but do miss the latest features such as the elasticsearch statistics.

I'm not a go programmer so I'm not as much help but any direction as to how to mitigate or pinpoint the cause of these bugs would be appreciated. I will still try to figure out the problem but another go programmer might have a better time fixing these issues.

We hit the problems running on Amazon Linux.

Replay process can not tee some request with error "Can not parse request"

In my case, I use gor(0.7.0) like:
sudo gor --input-raw :80 --output-http xxxx:80

However, about 20% request can not be transferred. The error is "Can not parse request". I want to figure out why this happens. One of the error log is:

2014/01/16 10:15:29 Can not parse request jUyMEhlYXRlcnMlMjUyMEdlbmVyYWwtXy1ob3Qrd2F0ZXIrdGFuayUyNnVybCU1YiU1ZCUzZGh0dHAlMjUzQSUyNTJGJTI1MkZ3d3cubG93ZXMuY29tJTI1MkZIZWF0aW5nLUNvb2xpbmclMjUyRldhdGVyLUhlYXRlcnMlMjUyRl8lMjUyRk4tMXoxMW9uZyUyNTJGcGwlMjUzRnJwcCUyNTNEMjQqCTE5MjQwODE3NTILMTEwNzUyNTEyNjA4ggJAAkhSUIYXWANhDonW5e+50D9oAHBSeFKBAYXrUbgehfc/iQE9CtejcD3qP5ABAJgBBAqQBQoZQS5PLiBTbWl0aCBIeWJyaWQgSGVhdGVycxJGSGlnaCBFZmZpZWNpZW5jeSBBLk8uIFNtaXRoIEh5YnJpZCBXYXRlciBIZWF0ZXJzLiBGaW5kIGEgRGVhbGVyIE9ubGluZRoTaHR0cDovL2hvdHdhdGVyLmNvbSLHA2h0dHA6Ly8yMDgxOTY4LnIubXNuLmNvbS8/bGQ9OHZkeFFBRW43WTZXSUhuY2t4UUgtWWd6VlVDVXdjUG12dnpSQVJaaXV5Z0xDa0lFQ1pJNExNaEVDbU1Yalh5UHBKckxtenN3RmFOeG9 malformed HTTP request "jUyMEhlYXRlcnMlMjUyMEdlbmVyYWwtXy1ob3Qrd2F0ZXIrdGFuayUyNnVybCU1YiU1ZCUzZGh0dHAlMjUzQSUyNTJGJTI1MkZ3d3cubG93ZXMuY29tJTI1MkZIZWF0aW5nLUNvb2xpbmclMjUyRldhdGVyLUhlYXRlcnMlMjUyRl8lMjUyRk4tMXoxMW9uZyUyNTJGcGwlMjUzRnJwcCUyNTNEMjQqCTE5MjQwODE3NTILMTEwNzUyNTEyNjA4ggJAAkhSUIYXWANhDonW5e+50D9oAHBSeFKBAYXrUbgehfc/iQE9CtejcD3qP5ABAJgBBAqQBQoZQS5PLiBTbWl0aCBIeWJyaWQgSGVhdGVycxJGSGlnaCBFZmZpZWNpZW5jeSBBLk8uIFNtaXRoIEh5YnJpZCBXYXRlciBIZWF0ZXJzLiBGaW5kIGEgRGVhbGVyIE9ubGluZRoTaHR0cDovL2hvdHdhdGVyLmNvbSLHA2h0dHA6Ly8yMDgxOTY4LnIubXNuLmNvbS8/bGQ9OHZkeFFBRW43WTZXSUhuY2t4UUgtWWd6VlVDVXdjUG12dnpSQVJaaXV5Z0xDa0lFQ1pJNExNaEVDbU1Yalh5UHBKckxtenN3RmFOeG9"

Misbehaving tests

I don't think the output_http test, and possibly others that use test_input, are behaving correctly. It seems that most of the time only a single POST request is received. But the number of GET requests pads out to match the WaitGroup.

This can be easily observed with the following diff:

diff --git a/output_http_test.go b/output_http_test.go
index 7c9d977..d7581d3 100644
--- a/output_http_test.go
+++ b/output_http_test.go
@@ -24,11 +24,13 @@ func TestHTTPOutput(t *testing.T) {
        headers := HTTPHeaders{HTTPHeader{"User-Agent", "Gor"}}
        output := NewHTTPOutput("127.0.0.1:50003", headers, "")

+       Settings.verbose = true
        startHTTP("127.0.0.1:50003", func(req *http.Request) {
                if req.Header.Get("User-Agent") != "Gor" {
                        t.Error("Wrong header")
                }

+               t.Log(req)
                wg.Done()
        })

@@ -37,7 +39,7 @@ func TestHTTPOutput(t *testing.T) {

        go Start(quit)

-       for i := 0; i < 100; i++ {
+       for i := 0; i < 3; i++ {
                wg.Add(2)
                input.EmitGET()
                input.EmitPOST()

Which shows 3x POST requests going in, but only one coming out:

➜  gor git:(master) ✗ go test -run TestHTTPOutput -v
warning: building out-of-date packages:
        github.com/mattbaird/elastigo/api
        github.com/araddon/gou
        github.com/mattbaird/elastigo/core
        github.com/buger/gor/elasticsearch
        github.com/buger/gor/raw_socket_listener
installing these packages with 'go test -i' will speed future tests.

=== RUN TestHTTPOutput
2013/11/26 13:19:54 Sending Test Input :  GET / HTTP/1.1


2013/11/26 13:19:54 Sending Test Input :  POST /pub/WWW/ HTTP/1.1
Host: www.w3.org

a=1&b=2


2013/11/26 13:19:54 Sending Test Input :  GET / HTTP/1.1


2013/11/26 13:19:54 Sending Test Input :  POST /pub/WWW/ HTTP/1.1
Host: www.w3.org

a=1&b=2


2013/11/26 13:19:54 Sending Test Input :  GET / HTTP/1.1


2013/11/26 13:19:54 Sending Test Input :  POST /pub/WWW/ HTTP/1.1
Host: www.w3.org

a=1&b=2


--- PASS: TestHTTPOutput (0.00 seconds)
        output_http_test.go:34: &{GET / HTTP/1.1 1 1 map[User-Agent:[Gor] Accept-Encoding:[gzip]] 0xc200120240 0 [] false 127.0.0.1:50003 map[] map[] <nil> map[] 127.0.0.1:55277 / <nil>}
        output_http_test.go:34: &{GET / HTTP/1.1 1 1 map[User-Agent:[Gor] Accept-Encoding:[gzip]] 0xc200120380 0 [] false 127.0.0.1:50003 map[] map[] <nil> map[] 127.0.0.1:55278 / <nil>}
        output_http_test.go:34: &{GET / HTTP/1.1 1 1 map[User-Agent:[Gor] Accept-Encoding:[gzip]] 0xc200120600 0 [] false 127.0.0.1:50003 map[] map[] <nil> map[] 127.0.0.1:55279 / <nil>}
        output_http_test.go:34: &{GET / HTTP/1.1 1 1 map[User-Agent:[Gor] Accept-Encoding:[gzip]] 0xc2001206c0 0 [] false 127.0.0.1:50003 map[] map[] <nil> map[] 127.0.0.1:55280 / <nil>}
        output_http_test.go:34: &{GET / HTTP/1.1 1 1 map[User-Agent:[Gor] Accept-Encoding:[gzip]] 0xc200120780 0 [] false 127.0.0.1:50003 map[] map[] <nil> map[] 127.0.0.1:55281 / <nil>}
        output_http_test.go:34: &{POST /pub/WWW/ HTTP/1.1 1 1 map[User-Agent:[Gor] Content-Length:[0] Accept-Encoding:[gzip]] 0xc200120840 0 [] false www.w3.org map[] map[] <nil> map[] 127.0.0.1:55282 /pub/WWW/ <nil>}
PASS
ok      _/Users/dcarley/projects/govuk/gor      0.036s

Occasionally it also appears to truncate the POST request. Which can be easily observed by switching the order:

diff --git a/output_http_test.go b/output_http_test.go
index 7c9d977..0169321 100644
--- a/output_http_test.go
+++ b/output_http_test.go
@@ -37,10 +37,10 @@ func TestHTTPOutput(t *testing.T) {

        go Start(quit)

-       for i := 0; i < 100; i++ {
+       for i := 0; i < 3; i++ {
                wg.Add(2)
-               input.EmitGET()
                input.EmitPOST()
+               input.EmitGET()
        }

        wg.Wait()

Causing a parse error and the WaitGroup hangs:

➜  gor git:(master) ✗ go test -run TestHTTPOutput -v
warning: building out-of-date packages:
        github.com/mattbaird/elastigo/api
        github.com/araddon/gou
        github.com/mattbaird/elastigo/core
        github.com/buger/gor/elasticsearch
        github.com/buger/gor/raw_socket_listener
installing these packages with 'go test -i' will speed future tests.

=== RUN TestHTTPOutput
2013/11/26 13:27:45 Can not parse request POST /pub/WWW/ HTT malformed HTTP version "HTT"
2013/11/26 13:27:45 Can not parse request POST /pub/WWW/ HTT malformed HTTP version "HTT"

HTTP input for listener

Right now we capture traffic only by sniffing it. Sometimes it not working, for example in case of Heroku #3 . By giving simple HTTP input we can solve this issue.

Running the package

Hi Leonid

Would love to use your tool . There are a few things. I have no idea in GO.
I downloaded the realease , but i dont really know what to do with the gor-amd64 file. (is that an archive ? is that an executable of GO ? )

Then i tried to build it from the cloned github repository after installing go on my machine and i am getting these errors

image

Sorry about these questions , but i just dont find enough about Go in google.

Thanks
Roman

Gor can't correctly forward POST request including "Expect: 100-continue"

$ curl 'http://xxxx/'  -d @some-file -v

cURL sends normal HTTP headers including "Content-Length: nnnnn" and extra HTTP header "Expect: 100-continue" but empty request body, the http server responses
"100 Continue" then cURL sends the request body.

This is valid HTTP request and I verified the http server feature in Go 1.2 net/http package can handle it correctly, but Gor fails, its input-http plugin wrongly thinks the empty http body is invalid.

Support load stages

This should be next step in transforming Gor to full features load testing software.
Basic idea that you could specify stages of load, specifying time and load amount for each stage. Proposed syntax:

gor replay -f "http://staging.server|10-1h|20-30m|100-1h"

Which means 3 stages:

  1. 10 RPS for 1 hour
  2. 20 RPS for 20 minutes
  3. 100 RPS for 1h

Flag parsing bug: Replay server flag in listen mode

I think the commit a1f9cc5 introduced a bug in the flag parsing of the listen mode.

No matter what replay server you choose, it always takes the default one:

sudo ./gor listen -r="192.168.1.10:28030"
Version: 0.3.5
Listening for HTTP traffic on 0.0.0.0:80
Forwarding requests to replay server: localhost:28020 Limit: 0

The method Settings.ReplayServer(*replayAddress) gets called inside of func init().
But I think the flag.Parse() hasn't been run at this time and therefore we end up with the default value.

Replay Process ends with: "Can not parse request"

The last merges on master introduced a new bug.

After a few requests the replay process ends with Can not parse request (and a missing newline after that)

I don't know if some requests weren't parseable before those merges (is this normal?) but the thing that ends the process is a little misusage of log.Fatal.

log.Fatal prints the error message and immediately calls os.Exit(1).

An unparseable request is clearly no reason to kill the whole process.

Raw socket code is hard to read.

After v0.3 big rewrite 3cf7be8 , use raw socket to instead of tcpdump. The code is hardlly read, espically the listen section. May be you can consider add some necessary comment?

Failing unit tests

I don't know if it is an issue or if I'm missing something.

I can't get the unit tests to work.
I do a "go get github.com/buger/gor"
And a "go test" on a linux machine with root permissions (for the listener sniffing)

All tests fail (rate limit tests)

Is there something special when you're testing with travis?

I'm using the current stable go 1.1.2 btw.

Data transmission issues

Hi..

Im using gor 0.7.0 with

sudo ./gor-amd64 --input-dummy :80 --output-tcp hostname:28020 'Server'
./gor-amd64 --input-tcp :28020 --output-http http://hostname 'Client'

But Im not getting any log at the apache from the client.

If i go like this on the server side.
./gor-amd64 --input-dummy :80 --output-http "http://hostname"
I am able to reproduce some dummy data.

Any hint I may be failing.

Cheers!.

build fails

I don't know Go, so I'm not sure if these are warnings or errors, but when I try to build I get these messages:

> go build gor.go                                                                                         
# github.com/buger/gor/listener
listener/tcp_message.go:35: method msg.Timeout is not an expression, must be   called
listener/tcp_message.go:100: t.timer.Reset undefined (type *time.Timer has no field or method Reset)
# github.com/mattbaird/elastigo/core
../../mattbaird/elastigo/core/get.go:60: function ends without a return statement

This is at commit 8c41c01

Larger dataset for TestSavingRequestToFileAndReplayThem

The TestSavingRequestToFileAndReplayThem test only captures three requests and choses to replay the first two.

It should handle a fixed amount, for some value larger than 20, so that it gives greater confidence about large requests files with a mixture of different GET and POST methods.

Can't get traffic to replay server

I am trying to setup Gor on AWS and for some reason traces don't arrive to the replay server.

listener: gor --input-raw :80 --output-tcp "xxx.xxx.xxx.xxx:28020|1 --verbose"

replay: gor --input-tcp "xxx.xxx.xxx.xxx:28020" --output-file /tmp/replay.log --verbose

I am running Gor 0.7.0

On the listener I see the traces correctly and on the replay when I do a tcpdump I can see traffic arriving but Gor doesn't send it to the file.

Any ideas?

HTTPS Traffic

Am I able somehow to replicate https traffic?, just did a simple test and could not replicate it.

Regards.

StatsD/Graphite integration

Instead of writing own stats solution #12 it make sense to integrate Gor with well known stats aggregation products like StatsD and Graphite.

Offline Replay

Is it possible to save the data and replay it offline?

integration_test failures, listener test okay.

Hi,

I'm am having trouble running the integration tests. I tried both go 1.1.2 and go1.1 Here is the output for the latter.

bash-3.2# go version
go version go1.1 darwin/386
bash-3.2# gor
Version: 0.3.3
Usage:
gor listen -h
gor replay -h
bash-3.2# go test
Listening for HTTP traffic on 127.0.0.1:50000
Forwarding requests to replay server: 127.0.0.1:50001 Limit: 0
2013/08/16 00:30:50 Starting replay server at: 127.0.0.1:50001
2013/08/16 00:30:50 Forwarding requests to: http://127.0.0.1:50002 limit: 0
--- FAIL: TestReplay (1.50 seconds)
integration_test.go:132: Timeout error
Listening for HTTP traffic on 127.0.0.1:50010
Forwarding requests to replay server: 127.0.0.1:50011 Limit: 0
2013/08/16 00:30:51 Starting replay server at: 127.0.0.1:50011
2013/08/16 00:30:51 Forwarding requests to: http://127.0.0.1:50012 limit: 0
--- FAIL: TestWithoutReplayRateLimit (0.60 seconds)
integration_test.go:173: It should forward all requests without rate-limiting 0
Listening for HTTP traffic on 127.0.0.1:50020
Forwarding requests to replay server: 127.0.0.1:50021 Limit: 0
2013/08/16 00:30:52 Starting replay server at: 127.0.0.1:50021
2013/08/16 00:30:52 Forwarding requests to: http://127.0.0.1:50022 limit: 5
--- FAIL: TestReplayRateLimit (0.60 seconds)
integration_test.go:181: It should forward only 5 requests with rate-limiting 0
Listening for HTTP traffic on 127.0.0.1:50030
Forwarding requests to replay server: 127.0.0.1:50031 Limit: 3
2013/08/16 00:30:52 Starting replay server at: 127.0.0.1:50031
2013/08/16 00:30:52 Forwarding requests to: http://127.0.0.1:50032 limit: 0
--- FAIL: TestListenerRateLimit (0.60 seconds)
integration_test.go:189: It should forward only 3 requests with rate-limiting 0
FAIL
exit status 1
FAIL github.com/buger/gor 3.339s
bash-3.2# uname -a
Darwin laptop.local 12.4.0 Darwin Kernel Version 12.4.0: Wed May 1 17:57:12 PDT 2013; root:xnu-2050.24.15~1/RELEASE_X86_64 x86_64
bash-3.2#

I am able to run the listener test,

bash-3.2# go test
127.0.0.1:49165
2013/08/16 00:35:57 Forwarding request: &{GET /pub/WWW/ HTTP/1.1 1 1 map[] 0x1149d0c0 0 [] false www.w3.org map[] map[] map[] /pub/WWW/ }
PASS
ok github.com/buger/gor/listener 0.022s
bash-3.2#

WebSocket Support

I see you currently support HTTP, are there any plans in the future to support WebSockets? We currently use them for our backend service supporting an iOS application and we would love to replay traffic from our users for testing

Limit listening side

Hi,

I have a volume problem where we get up to 20k qps on the server I need to sniff traffic from but i only need to forward a very small subset of them onto our test servers, ideally around 5-10 qps. I have tried limiting on the replay side but each time I start up I currently see the following error: "Error while Accept() accept tcp [::]:28020: too many open files"

I believe if there is a way to limit as well on the sending side then this would not be an issue.

Thanks

Mark

Don't load entire request file into memory

When reading a dump of requests the entire file shouldn't be loaded into memory and parsed in one go. Instead it should iterate over chunks, presumably starting the replay process as soon as possible.

Raised in #48 (although no change to existing behaviour).

Gor can't handle big POST request body

The "nr" returned from src.Read(buf) can be longer than buf's length, this issue can be easily reproduced by posting a 100KB text file with cURL to the listened HTTP server.

$ git diff
diff --git a/emitter.go b/emitter.go
index 1adafa7..7ae0227 100644
--- a/emitter.go
+++ b/emitter.go
@@ -22,6 +22,7 @@ func CopyMulty(src io.Reader, writers ...io.Writer) (err error) {

        for {
                nr, er := src.Read(buf)
+               Debug("Sending", src, ": ", nr, " buflen=", len(buf))
                if nr > 0 {
                        Debug("Sending", src, ": ", string(buf[0:nr]))

$ sudo -E go run ./bin/gor.go --input-raw :8888 --output-file requests.dat --verbose
Version: 0.7.5
2014/02/11 16:38:22 Sending RAW Socket input: :8888 :  62089  buflen= 32768
panic: runtime error: slice bounds out of range

goroutine 4 [running]:
runtime.panic(0x68b3a0, 0x9c62ea)
        /usr/local/go/src/pkg/runtime/panic.c:266 +0xb6
github.com/buger/gor.CopyMulty(0x7f56b667c840, 0xc210051ee0, 0xc210037940, 0x1, 0x1, ...)
        /home/liuyb/go-workspace/src/github.com/buger/gor/emitter.go:27 +0x663
created by github.com/buger/gor.Start
        /home/liuyb/go-workspace/src/github.com/buger/gor/emitter.go:9 +0x8b
......

unexpected EOF happening ~66%

I've been running the latest 0.8 release and it is much more stable so thank you. When analyzing my incoming traffic versus what is replayed I am getting about 33% of the traffic replayed. When I look at the listener verbose output and then compare it to the replay output I can see that the replay isn't getting the full message from the listener. This usually results in a message on the replay saying Can not parse request GET ... unexpected EOF.

Looking at the listener verbose logs, it says that the full message is being sent but only part of the message is being received according to the replay logs. I've looked at the code and thought that perhaps the TCPMessage timeout of 200 ms might have something to do with the multitude of unexpected EOFs as you mention in the notes if nothing comes through after 200 ms, then the message is complete. (https://github.com/buger/gor/blob/master/raw_socket_listener/tcp_message.go#L16) I tried to make a branch and increase the TCPMessage timeout to something silly like 10 seconds but still have about the same rate of success and failure so I'm guessing there is a logic flaw somewhere.

Interestingly enough, I observed the same 30 - 33% success of replay rate in version 0.3.5 as I have in 0.8.0.

Again, this software is so close to be very extremely excellent. Any help in figuring out what is happening here would be appreciated. I've seen the EOF error on requests that are 600 bytes and on ones that are up to 4000 bytes so I'm not thinking it is a size issue.

Allow URI Filtering

What if I only want to test a specific route from production?

Why send all the traffic just to test one Endpoint?

The ability to REGEX or otherwise filter URIs would be nice.

Example:
Only send "/api/v1/" OR "/api/v2"

Connection Refused on 127.0.0.1

It used to work before... but now when I run this:

$ sudo ./gor --input-raw :80 --output-tcp "127.0.0.1:28020"

It gives these errors. Any ideas?

2014/02/10 12:18:00 Connection error dial tcp 127.0.0.1:28020: connection refused 127.0.0.1:28020

panic: runtime error: invalid memory address or nil pointer dereference
panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xb code=0x1 addr=0x0 pc=0x4eed67]

goroutine 16 [runnable]:
net.runtime_pollWait(0x7f501b4c58c8, 0x72, 0x0)
/tmp/bindist821562699/go/src/pkg/runtime/netpoll.goc:116 +0x6a
net.(_pollDesc).Wait(0xc21006c1b0, 0x72, 0x7f501b4c4268, 0xb)
/home/vagrant/go/src/pkg/net/fd_poll_runtime.go:81 +0x34
net.(_pollDesc).WaitRead(0xc21006c1b0, 0xb, 0x7f501b4c4268)
/home/vagrant/go/src/pkg/net/fd_poll_runtime.go:86 +0x30
net.(_netFD).ReadFrom(0xc21006c150, 0xc210080000, 0x2000, 0x2000, 0x0, ...)
/home/vagrant/go/src/pkg/net/fd_unix.go:231 +0x320
net.(_IPConn).ReadFromIP(0xc210000508, 0xc210080000, 0x2000, 0x2000, 0x19, ...)
/home/vagrant/go/src/pkg/net/iprawsock_posix.go:82 +0x107
net.(_IPConn).ReadFrom(0xc210000508, 0xc210080000, 0x2000, 0x2000, 0x19, ...)
/home/vagrant/go/src/pkg/net/iprawsock_posix.go:102 +0xf0
github.com/buger/gor/raw_socket_listener.(_Listener).readRAWSocket(0xc210062980)
/vagrant/src/github.com/buger/gor/raw_socket_listener/listener.go:74 +0x1dd
created by github.com/buger/gor/raw_socket_listener.NewListener
/vagrant/src/github.com/buger/gor/raw_socket_listener/listener.go:42 +0x138

goroutine 20 [chan receive]:
github.com/buger/gor/raw_socket_listener.(*TCPMessage).listen(0xc21007f3c0)
/vagrant/src/github.com/buger/gor/raw_socket_listener/tcp_message.go:46 +0x4b
created by github.com/buger/gor/raw_socket_listener.NewTCPMessage
/vagrant/src/github.com/buger/gor/raw_socket_listener/tcp_message.go:38 +0xd0

netstat does not show anything running on 28020

MacOS support

Right now its not supported because *BSD system and not allow TCP/UDP traffic capture using RAW sockets. Need to use libpcap for *BSD systems.

Check #21 and #8 for more details.

Can't start gor, "address already in use"

This most probably is not a problem with gor itself but need your help on that. My knowledge of operating the server is unfortunately insufficient. On my server I run Apache's httpd v. 2.2. which listens on port 80 and has a bunch of named virtual hosts defined (all on 80 as well). When I try to run gor on port 80 I get the error

 Can't start:listen tcp <nil>:80: address already in use

I tried starting gor specifying the IP 127.0.0.1:80 but with same result.
I also tried starting gor first and then httpd but then httpd crashes saying that the port is in use.

Should any specific setting should be changed or maybe I just don't get some basics?

POST support

Hey,

very simplistic solution, I like it. Looking forward for the POST support, though.

input_tcp messages merged together occasionally

I'm going to submit this issue because I know it exists and have yet to fix it nor do I have an idea exactly how it is happening.

The issue is that the input_tcp connection handler reads from the connection for the delimiter (https://github.com/buger/gor/blob/master/input_tcp.go#L64) sometimes the buffer returned in a a mix of the end of a previous message and nearly all of the next message. Sometimes the buffer is just the middle of a message.

The gotchas are that the delimiter is appearing only at the end of the malformed message.

For example a normal flow of messages might be:

Sending TCP input: :28020 :  GET /m/session?_=533acb40-919d-43bf-ab42-0cfba38ce534 HTTP/1.1

host: www.blah.com

Accept: */*

Accept-Encoding: gzip, deflate

Accept-Language: en-us

Cookie: session=533acb40-919d-43bf-ab42-0cfba38ce534

Referer: http://www.blah.com

User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET4.0C; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; InfoPath.2; BOIE8;ENUSMSCOM)

X-Forwarded-Port: 80

X-Forwarded-Proto: http

Connection: keep-alive

A flawed message would look like:

MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET4.0C; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; InfoPath.2; BOIE8;ENUSMSCOM)

X-Forwarded-Port: 80

X-Forwarded-Proto: http

Connection: keep-aliveGET /k/get_stuff?key=aaaaaaaaaaaaaaaaaa HTTP/1.1

host: www.blah.com

Accept: */*

Accept-Encoding: gzip, deflate

Accept-Language: en-us

Cookie: session=asdfasddfasdfd

Referer: http://www.blah.com

User-Agent: Mozilla/4.0 (compatible;

It seems like the TCP connection is reading some info of X length, get preemted, the buffer under X changes and then returns with a munged string. I have no idea if this is a golang issue or what.

Regardless it is only of the few flaws left on the tcp communication portion of this project.

Binary file format

How about using gob to serialize requests to file, as a way to fix the POST body delimitation issue described in #36?

That would save us having to invent a plaintext delimiter and it might be marginally faster to read back in. Although it would come at the cost of not being able to view/edit the saved file by hand.

/cc @buger @slawosz

exits with "panic: runtime error: send on closed channel"

Hey,

thanks for this awesome tool!

We are running into the following issue very often (with the current binary). Gor runs for a while (1-n seconds) and exits.

The command we run:

./gor --input-raw :80 --output-http "ourdomain.net:8042|1000"

Trace:


panic: runtime error: send on closed channel

goroutine 7 [running]:
github.com/buger/gor/raw_socket_listener.(*Listener).processTCPPacket(0xc2000d4700, 0xc20021b390)
    /vagrant/src/github.com/buger/gor/raw_socket_listener/listener.go:132 +0xc8
github.com/buger/gor/raw_socket_listener.(*Listener).listen(0xc2000d4700)
    /vagrant/src/github.com/buger/gor/raw_socket_listener/listener.go:57 +0xec
created by github.com/buger/gor/raw_socket_listener.NewListener
    /vagrant/src/github.com/buger/gor/raw_socket_listener/listener.go:41 +0x118

goroutine 1 [select (no cases)]:
github.com/buger/gor.Start(0x0)
    /vagrant/src/github.com/buger/gor/emitter.go:13 +0xb4
main.main()
    /vagrant/src/github.com/buger/gor/bin/gor.go:50 +0x182

goroutine 2 [syscall]:

goroutine 4 [syscall]:
os/signal.loop()
    /home/vagrant/go/src/pkg/os/signal/signal_unix.go:21 +0x1c
created by os/signal.init·1
    /home/vagrant/go/src/pkg/os/signal/signal_unix.go:27 +0x2f

goroutine 5 [chan send]:
github.com/buger/gor.(*RAWInput).listen(0xc2000c3ea0, 0x7fffc21b00af, 0x3)
    /vagrant/src/github.com/buger/gor/input_raw.go:44 +0x1ee
created by github.com/buger/gor.NewRAWInput
    /vagrant/src/github.com/buger/gor/input_raw.go:19 +0x83

goroutine 6 [runnable]:
syscall.Syscall()
    /home/vagrant/go/src/pkg/syscall/asm_linux_amd64.s:36 +0x64
syscall.write(0x2, 0xc2003db000, 0x1054, 0x20c6, 0xc2003db000, ...)
    /home/vagrant/go/src/pkg/syscall/zerrors_linux_amd64.go:2717 +0x70
syscall.Write(0x2, 0xc2003db000, 0x1054, 0x20c6, 0x0, ...)
    /home/vagrant/go/src/pkg/syscall/syscall_unix.go:143 +0x5a
os.(*File).write(0xc200000010, 0xc2003db000, 0x1054, 0x20c6, 0x0, ...)
    /home/vagrant/go/src/pkg/os/file_unix.go:188 +0x79
os.(*File).Write(0xc200000010, 0xc2003db000, 0x1054, 0x20c6, 0xc200715100, ...)
    /home/vagrant/go/src/pkg/os/file.go:139 +0x96
log.(*Logger).Output(0xc2000ad1e0, 0x2, 0xc200715100, 0x1040, 0x0, ...)
    /home/vagrant/go/src/pkg/log/log.go:153 +0x330
log.Println(0x7fd0af5ecf20, 0x4, 0x4)
    /home/vagrant/go/src/pkg/log/log.go:282 +0x67
github.com/buger/gor.Debug(0x7fd0af5ecf20, 0x4, 0x4)
    /vagrant/src/github.com/buger/gor/settings.go:68 +0x47
github.com/buger/gor.CopyMulty(0xc2000d3e70, 0xc2000c3ea0, 0xc2000b09a0, 0x1, 0x1, ...)
    /vagrant/src/github.com/buger/gor/emitter.go:26 +0x28a
created by github.com/buger/gor.Start
    /vagrant/src/github.com/buger/gor/emitter.go:9 +0x89

... and so on (more goroutine traces)

The machine is running Gentoo (3.10.9).

Any ideas what is wrong here?

Capture response while replaying

Is there any way we can dump the response to a file while replaying? It would be good to verify the actual response also.

Thanks.

Recommend Projects

  • React photo React

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

  • Vue.js photo Vue.js

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

  • Typescript photo Typescript

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

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

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

Recommend Topics

  • javascript

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

  • web

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

  • server

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

  • Machine learning

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

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

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

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.