GithubHelp home page GithubHelp logo

xuqingfeng / caddy-rate-limit Goto Github PK

View Code? Open in Web Editor NEW
67.0 67.0 15.0 3.67 MB

A rate limit plugin for caddy

Home Page: https://caddyserver.com/docs/http.ratelimit

License: MIT License

Makefile 3.13% Go 94.27% HTML 0.81% Dockerfile 1.80%
caddy rate-limit

caddy-rate-limit's People

Contributors

htfy96 avatar xuqingfeng 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

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

caddy-rate-limit's Issues

Ratelimit all paths except

I have a lot of paths directly under /. Just about every resource should be ratelimited, except for static resources like Javascripts and CSS, which don't strain the server much and also need to be accessed frequently. It would be great to be able to apply a ratelimit to all paths except for some, like:

ratelimit 30 1 minute {
    [^resources]
}

Request - Rate limiting for failed basic auth

There has been some interest in implementing rate limiting within the basicauth middleware to block repeated failed logins (caddyserver/caddy#1318 (comment)), but interest has shifted over to other authentication plugins such as multipass and loginsrv.

However, there is still use for basicauth (e.g. protecting WebDAV, which is my use case), and protecting it from brute force attacks. The problem with a simple

ratelimit * /dav 2 3 second
webdav /dav {
    ...
}

is that rate limiting will be triggered not only by incorrect credentials (403 responses) but also by legitimate requests (2xx). This is a problem as one might not want to rate limit legitimate requests (or have a much higher rate limit, since certain use cases such as a client doing a sync may generate a lot of requests).

As far as I can think of, this could be done if ratelimit could be configured with a count_if, which determines which requests count to the request quota of an IP address, and a block_if, which requests will be denied for an IP address which has already exceeded its request quota and been blocked. Using , for instance, the syntax of if statements from the rewrite middleware:

ratelimit * /dav 2 3 second {
    count_if {status} is 403
webdav /dav {
    ...
}

Is it possible to look into this feature for caddy-rate-limit?

Caddy's import path has changed

Caddy's import path (and Go module name) has changed from

github.com/mholt/caddy

to

github.com/caddyserver/caddy

Unfortunately, Go modules are not yet mature enough to handle a change like this (see https://golang.org/issue/26904 - "haven't implemented that part yet" but high on priority list for Go 1.14) which caught me off-guard. Using Go module's replace feature didn't act the way I expected, either. Caddy now fails to build with plugins until they update their import paths.

I've hacked a fix into the build server, so downloading Caddy with your plugin from our website should continue working without any changes on your part, for now. However, please take a moment and update your import paths, and do a new deploy on the website, because the workaround involves ignoring module checksums and performing a delicate recursive search-and-replace.

I'm terribly sorry about this. I did a number of tests and dry-runs to ensure the change would be smooth, but apparently some unknown combination of GOPATH, Go modules' lack of maturity, and other hidden variables in the system or environment must have covered up something I missed.

This bash script should make it easy (run it from your project's top-level directory):

find . -name '*.go' | while read -r f; do
	sed -i.bak 's/\/mholt\/caddy/\/caddyserver\/caddy/g' $f && rm $f.bak
done

We use this script in the build server as part of the temporary workaround.

Let me know if you have any questions! Sorry again for the inconvenience.

Sudden death of Caddy due to ratelimit

Hi,

we face several sudden death of Caddy during a day and found that deactivating ratelimit solves this.

Our setup:

  • Caddy 0.10.10
  • AWS EC2 instance (Ubuntu 14.04) with AWS EIP directly connecting to the internet
  • Caddy redirects 1700+ domains to other domains
  • ratelimit configuration:
ratelimit / 300 400 minute {
  # 175 whitelisted IP addresses like this:
  whitelist x.x.x.x/32
  (...)
}

Request statistics:

  • 120000- 300000 requests per day
  • 4000 - 15000 requests per hour
  • 15000 - 17000 unique IP addresses per day
  • 900 - 1600 unique IP addresses per hour

Increasing available memory of the system does not help and Caddy is not killed by the OOM-killer thus Caddy stops itself for an unknown reason.
My assumption is that the internal structure of the ratelimit plugin does not handle the volume of unique IP addresses well which forces Caddy to stop without any log message.

Are these information enough to analyze the issue?

Best regards,
Andreas

Thanks for making this plugin

Not an issue - just wanted to write and say thank you for making and maintaining this plugin. It has received probably more praise than you know, and makes quite a few people happy to use Caddy. This plugin is one of the top 10 downloaded. Keep up the great work ๐Ÿ‘ and thanks again!

[Feature] allow import directive within ratelimit

Hi,

we several services with changing IP addresses connecting to our Caddy instance.
These should be whitelisted for the ratelimits.
To allow dynamically adding IPs to the whitelist it would be nice to write those IPs into a file and import that one within a ratelimit block using the Caddy import directive.

Currently the validation fails with the following error:
$ caddy -conf /etc/caddy/Caddyfile -validate 2017/12/18 12:15:22 /etc/caddy/load.d/ratelimit:7 - Error during parsing: expecting whitelist, got import

Would this be possible to implement?

Cheers,
Andreas

Units

Hi, thanks for the extension!

I have a feature request: I'd love to be able to specify units for the rate limit. For example, one request per minute, 10 requests per 5 minutes, 30 per hour, 10 per 20 hours, 100 per week, 2 per year, ... Anything one could imagine

tag v1.6.0 concurrent map read and map wirte panic <ratelimit.go:90>

if _, found := caddyLimiter.Keys[keysJoined]; found {

{"log":"fatal error: concurrent map read and map write\n","stream":"stderr","time":"2019-06-10T04:09:30.643733096Z"}
{"log":"\n","stream":"stderr","time":"2019-06-10T04:09:30.647184373Z"}
{"log":"goroutine 300764 [running]:\n","stream":"stderr","time":"2019-06-10T04:09:30.647197951Z"}
{"log":"runtime.throw(0xf7f318, 0x21)\n","stream":"stderr","time":"2019-06-10T04:09:30.649689091Z"}
{"log":"\u0009/usr/local/go/src/runtime/panic.go:617 +0x72 fp=0xc000416d98 sp=0xc000416d68 pc=0x42d7c2\n","stream":"stderr","time":"2019-06-10T04:09:30.650086122Z"}
{"log":"runtime.mapaccess2_faststr(0xe10c40, 0xc000101590, 0xc000638ea0, 0xe, 0x1, 0xc000638ea0)\n","stream":"stderr","time":"2019-06-10T04:09:30.650091018Z"}
{"log":"\u0009/usr/local/go/src/runtime/map_faststr.go:116 +0x4a9 fp=0xc000416e08 sp=0xc000416d98 pc=0x412cd9\n","stream":"stderr","time":"2019-06-10T04:09:30.650094601Z"}
{"log":"ih5.cn/vendor/github.com/xuqingfeng/caddy-rate-limit.RateLimit.ServeHTTP(0x10c1480, 0xc000211080, 0xc000228600, 0x1, 0x1, 0x10d2660, 0xc0006c1620, 0xc002307b00, 0x100000000000008, 0x0, ...)\n","stream":"stderr","time":"2019-06-10T04:09:30.650101534Z"}
{"log":"\u0009/Users/vxplo/go/src/ih5.cn/vendor/github.com/xuqingfeng/caddy-rate-limit/ratelimit.go:90 +0x107b fp=0xc0004173d8 sp=0xc000416e08 pc=0xae6e9b\n","stream":"stderr","time":"2019-06-10T04:09:30.650105385Z"}
{"log":"ih5.cn/vendor/github.com/xuqingfeng/caddy-rate-limit.(*RateLimit).ServeHTTP(0xc0002110b0, 0x10d2660, 0xc0006c1620, 0xc002307b00, 0x0, 0x0, 0xc000210c00)\n","stream":"stderr","time":"2019-06-10T04:09:30.650108818Z"}

Burst never used.

Seems Burst is never used.I used it with burst, but no effect.

So I went into the code, and I can't find the implementation. Is there something I am missing?

Update for Quic-Go v0.13.1

Currently, there is no go.mod file specified in the project. As a result, Go pulls in the latest Quic-Go (v0.13.1)

This release has a folder rename, from github.com/lucas-clemente/quic-go/h2quic to github.com/lucas-clemente/quic-go/http3.

Currently, Caddy v1.0.4 is not able to build with this plugin added.

rate limit based on jwt

After reading through the README I'm guessing this is based on per IP address it'd be great to be able to base this on per jwt, this wouldn't even need to decode the token just simply use the Authorization header's value instead of an ip.

fatal error: concurrent map read and map write

A runtime error throw while I am using caddy with ratelimit plugin in docker. I have no idea about these errors, and seems that it was ratelimit error destroyed the running caddy.

2017-02-18T03:14:23.709030693Z fatal error: concurrent map read and map write
2017-02-18T03:14:23.712128369Z 
2017-02-18T03:14:23.712160518Z goroutine 697997 [running]:
2017-02-18T03:14:23.712168803Z runtime.throw(0xa7e28b, 0x21)
2017-02-18T03:14:23.712175464Z  /usr/local/go/src/runtime/panic.go:566 +0x95 fp=0xc4203a71f0 sp=0xc4203a71d0
2017-02-18T03:14:23.712184232Z runtime.mapaccess2_faststr(0x9c7220, 0xc42000dc50, 0xc4203d21b0, 0xf, 0x1, 0xc4203d21b0)
2017-02-18T03:14:23.712196490Z  /usr/local/go/src/runtime/hashmap_fast.go:306 +0x52b fp=0xc4203a7250 sp=0xc4203a71f0
2017-02-18T03:14:23.712209585Z github.com/xuqingfeng/caddy-rate-limit.(*CaddyLimiter).AllowN(0xc420026068, 0xc4202e4300, 0x2, 0x2, 0x64, 0x96, 0xc42023e0d0, 0x1, 0x1, 0xc4201a02b0, ...)
2017-02-18T03:14:23.712221605Z  /home/caddy/go/src/github.com/xuqingfeng/caddy-rate-limit/caddylimiter.go:30 +0xb3 fp=0xc4203a7378 sp=0xc4203a7250
2017-02-18T03:14:23.712231405Z github.com/xuqingfeng/caddy-rate-limit.(*CaddyLimiter).Allow(0xc420026068, 0xc4202e4300, 0x2, 0x2, 0x64, 0x96, 0xc42023e0d0, 0x1, 0x1, 0xc4201a02b0, ...)
2017-02-18T03:14:23.712239102Z  /home/caddy/go/src/github.com/xuqingfeng/caddy-rate-limit/caddylimiter.go:24 +0x8c fp=0xc4203a73f0 sp=0xc4203a7378
2017-02-18T03:14:23.712251834Z github.com/xuqingfeng/caddy-rate-limit.RateLimit.ServeHTTP(0xd20e20, 0xc420229290, 0xc420222880, 0x1, 0x1, 0xd255a0, 0xc42059e7e0, 0xc42047e870, 0x750390, 0xc4203a75c0, ...)
2017-02-18T03:14:23.712608489Z  /home/caddy/go/src/github.com/xuqingfeng/caddy-rate-limit/ratelimit.go:65 +0x35a fp=0xc4203a7558 sp=0xc4203a73f0
2017-02-18T03:14:23.712646338Z github.com/xuqingfeng/caddy-rate-limit.(*RateLimit).ServeHTTP(0xc4202292c0, 0xd255a0, 0xc42059e7e0, 0xc42047e870, 0x0, 0x0, 0xc420228c90)
2017-02-18T03:14:23.712655732Z  <autogenerated>:1 +0x8f fp=0xc4203a75c0 sp=0xc4203a7558
2017-02-18T03:14:23.712665281Z github.com/mholt/caddy/caddyhttp/errors.ErrorHandler.ServeHTTP(0xd20fe0, 0xc4202292c0, 0x0, 0x0, 0xc420228c90, 0x0, 0x0, 0xc420237270, 0x0, 0x0, ...)
2017-02-18T03:14:23.712672907Z  /tmp/custombuild_8338_503942783/src/github.com/mholt/caddy/caddyhttp/errors/errors.go:40 +0x129 fp=0xc4203a7710 sp=0xc4203a75c0
2017-02-18T03:14:23.712680058Z github.com/mholt/caddy/caddyhttp/errors.(*ErrorHandler).ServeHTTP(0xc4201a70e0, 0xd255a0, 0xc42059e7e0, 0xc42047e870, 0x0, 0x40efee, 0xc4201b0840)
2017-02-18T03:14:23.712686997Z  <autogenerated>:1 +0xb0 fp=0xc4203a77a8 sp=0xc4203a7710
2017-02-18T03:14:23.712697108Z github.com/mholt/caddy/caddyhttp/header.Headers.ServeHTTP(0xd1e3a0, 0xc4201a70e0, 0xc420228bd0, 0x2, 0x2, 0xd25520, 0xc42059e750, 0xc42047e870, 0xa30280, 0xc4203a7901, ...)

Whitelist by CIDR

e.g. You may want to whitelist your own office NAT's IP address/CIDR from the rate limit as presumably your office will hit your own domain far more often than any other legitimate IP.

I actually started to write a PR for this, but it seemed likely that it would likely require a pretty decent refactor to implement.

Try the new build server

Hey @xuqingfeng - sorry to open an issue for this, but how can I contact you privately? I want to send you instructions for trying the new build server so we can get it loaded up with your plugin before launching it.

RetryAfter is called even if the request is not getting a 429

First, thanks for this nice piece of code, I'm adapting it now for one of my use cases but I'm hitting an issue.

It seems that requests are being consumed twice as fast because of this line here:
https://github.com/xuqingfeng/caddy-rate-limit/blob/master/ratelimit.go#L81

From what the docs of "golang.org/x/time/rate" say, calling Reserve() will consume a token, so RetryAfter() should only be called if the request isn't allowed from what I can tell.

Let me know if you want a PR or you'll fix that on your side.

Cheers!

Ratelimits not working

I tried to use the ratelimit in Caddy 0.9.5. caddy -plugins says "http.ratelimit" is included.

My conf is the following:

my.webserver.dev:80 {
    ratelimit /assets/uikit/vendor/jquery.js 1 1 minute
    root /var/www/my.webserver.dev/
    fastcgi / /run/php/php7.0-fpm.sock php {
        env CI_ENV development
    }
    log /var/log/caddy/access.log
    errors /var/log/caddy/error.log
    rewrite / {
      ext !.png !.css !.js !.otf !.ttf !.woff !.woff2 !.svg !.ico
      to /index.php
    }
}  

Using ab -n 30 -c 5 http://my.webserver.dev/assets/uikit/vendor/jquery.js or using curl with a simple bash while loop always returns HTTP 200. The ratelimit is not working.
Logfile says HTTP 200 to every request too.
I tried with curly braces too, but it's not working either.

ratelimit 1 1 minute {
  /
  /assets
}

What am I doing wrong?
Many thanks for every hint.

Concurrent Map Writes

We're seeing this error in production with Caddy unexpectedly crashing (domain replaced):

Apr 05 00:16:33 example.com caddy[20135]: fatal error: concurrent map writes
Apr 05 00:16:33 example.com caddy[20135]: goroutine 43708 [running]:
Apr 05 00:16:33 example.com caddy[20135]: runtime.throw(0xb45fe7, 0x15)
Apr 05 00:16:33 example.com caddy[20135]: /usr/local/go/src/runtime/panic.go:566 +0x95 fp=0xc4208cb208 sp=0xc4208cb1e8
Apr 05 00:16:33 example.com caddy[20135]: runtime.mapassign1(0xa825a0, 0xc42012a0c0, 0xc4208cb3d8, 0xc4208cb398)
Apr 05 00:16:33 example.com caddy[20135]: /usr/local/go/src/runtime/hashmap.go:458 +0x8ef fp=0xc4208cb2f0 sp=0xc4208cb208
Apr 05 00:16:33 example.com caddy[20135]: github.com/xuqingfeng/caddy-rate-limit.(*CaddyLimiter).AllowN(0xc420024088, 0xc4202143a0, 0x2, 0x2, 0x5, 0xa, 0xc42025cd40, 0x1, 0x1, 0xc420135020, ...)
Apr 05 00:16:33 example.com caddy[20135]: /home/caddy/go/src/github.com/xuqingfeng/caddy-rate-limit/caddylimiter.go:33 +0x3ad fp=0xc4208cb418 sp=0xc4208cb2f0
Apr 05 00:16:33 example.com caddy[20135]: github.com/xuqingfeng/caddy-rate-limit.(*CaddyLimiter).Allow(0xc420024088, 0xc4202143a0, 0x2, 0x2, 0x5, 0xa, 0xc42025cd40, 0x1, 0x1, 0xc420135020, ...)
Apr 05 00:16:33 example.com caddy[20135]: /home/caddy/go/src/github.com/xuqingfeng/caddy-rate-limit/caddylimiter.go:24 +0x8c fp=0xc4208cb490 sp=0xc4208cb418
Apr 05 00:16:33 example.com caddy[20135]: github.com/xuqingfeng/caddy-rate-limit.RateLimit.ServeHTTP(0xe49480, 0xc420268810, 0xc42022ee00, 0x1, 0x1, 0xe4e100, 0xc4201b8090, 0xc420254000, 0x775310, 0xc4208cb660,
Apr 05 00:16:33 example.com caddy[20135]: /home/caddy/go/src/github.com/xuqingfeng/caddy-rate-limit/ratelimit.go:65 +0x35a fp=0xc4208cb5f8 sp=0xc4208cb490
Apr 05 00:16:33 example.com caddy[20135]: github.com/xuqingfeng/caddy-rate-limit.(*RateLimit).ServeHTTP(0xc420268840, 0xe4e100, 0xc4201b8090, 0xc420254000, 0x0, 0x0, 0xc420227ce0)
Apr 05 00:16:33 example.com caddy[20135]: <autogenerated>:1 +0x8f fp=0xc4208cb660 sp=0xc4208cb5f8
Apr 05 00:16:33 example.com caddy[20135]: github.com/mholt/caddy/caddyhttp/errors.ErrorHandler.ServeHTTP(0xe49780, 0xc420268840, 0x0, 0x0, 0xc420227ce0, 0x0, 0x0, 0xc4202590e0, 0x0, 0x0, ...)
Apr 05 00:16:33 example.com caddy[20135]: /tmp/custombuild_7217_875636448/src/github.com/mholt/caddy/caddyhttp/errors/errors.go:40 +0x129 fp=0xc4208cb7b0 sp=0xc4208cb660
Apr 05 00:16:33 example.com caddy[20135]: github.com/mholt/caddy/caddyhttp/errors.(*ErrorHandler).ServeHTTP(0xc4201eb500, 0xe4e100, 0xc4201b8090, 0xc420254000, 0x1, 0x1, 0x0)
Apr 05 00:16:33 example.com caddy[20135]: <autogenerated>:1 +0xb0 fp=0xc4208cb848 sp=0xc4208cb7b0
Apr 05 00:16:33 example.com caddy[20135]: github.com/mholt/caddy/caddyhttp/gzip.Gzip.ServeHTTP(0xe46700, 0xc4201eb500, 0xc42022ec40, 0x1, 0x1, 0xe4e700, 0xc4200521a0, 0xc420254000, 0x0, 0x0, ...)
Apr 05 00:16:33 example.com caddy[20135]: /tmp/custombuild_7217_875636448/src/github.com/mholt/caddy/caddyhttp/gzip/gzip.go:79 +0x3d3 fp=0xc4208cb988 sp=0xc4208cb848
Apr 05 00:16:33 example.com caddy[20135]: github.com/mholt/caddy/caddyhttp/gzip.(*Gzip).ServeHTTP(0xc420268870, 0xe4e700, 0xc4200521a0, 0xc420254000, 0xc420214360, 0x11, 0x1)
Apr 05 00:16:33 example.com caddy[20135]: <autogenerated>:13 +0x8f fp=0xc4208cb9f0 sp=0xc4208cb988

fatal error: concurrent map read and map write at caddylimiter.go:58

Looks like an unprotected cl.Keys[keysJoined] caused this issue

fatal error: concurrent map read and map write

goroutine 274817254 [running]:
runtime.throw(0xe649aa, 0x21)
        /usr/local/go/src/runtime/panic.go:608 +0x72 fp=0xc001792fd8 sp=0xc001792fa8 pc=0x42c382
runtime.mapaccess1_faststr(0xd264a0, 0xc0001767e0, 0xc001759d40, 0x12, 0xc001e9d360)
        /usr/local/go/src/runtime/map_faststr.go:21 +0x418 fp=0xc001793048 sp=0xc001792fd8 pc=0x4120c8
github.com/xuqingfeng/caddy-rate-limit.(*CaddyLimiter).AllowN(0xc00018a2a0, 0xc0008bc8d0, 0x3, 0x3, 0xc00031fcd8, 0x1, 0x258, 0x4b0, 0xc00031fd90, 0x6, ...)
        /tmp/gopath_11-15-0309.940769310/src/github.com/xuqingfeng/caddy-rate-limit/caddylimiter.go:58 +0x15a fp=0xc001793130 sp=0xc001793048 pc=0x975aba
github.com/xuqingfeng/caddy-rate-limit.(*CaddyLimiter).Allow(0xc00018a2a0, 0xc0008bc8d0, 0x3, 0x3, 0xc00031fcd8, 0x1, 0x258, 0x4b0, 0xc00031fd90, 0x6, ...)
        /tmp/gopath_11-15-0309.940769310/src/github.com/xuqingfeng/caddy-rate-limit/caddylimiter.go:27 +0x93 fp=0xc0017931d0 sp=0xc001793130 pc=0x975933
github.com/xuqingfeng/caddy-rate-limit.RateLimit.ServeHTTP(0xf4ae40, 0xc001bed230, 0xc0015a50e0, 0x1, 0x1, 0xf518c0, 0xc001d97a40, 0xc000f50600, 0x5000104, 0x0, ...)
        /tmp/gopath_11-15-0309.940769310/src/github.com/xuqingfeng/caddy-rate-limit/ratelimit.go:72 +0x40a fp=0xc0017933f0 sp=0xc0017931d0 pc=0x9766ba
github.com/xuqingfeng/caddy-rate-limit.(*RateLimit).ServeHTTP(0xc001bed260, 0xf518c0, 0xc001d97a40, 0xc000f50600, 0x0, 0xf44a70, 0xf44980)
        <autogenerated>:1 +0x77 fp=0xc001793458 sp=0xc0017933f0 pc=0x978077
github.com/echocat/caddy-filter.filterHandler.ServeHTTP(0xf4b3a0, 0xc001bed260, 0xc00031dc50, 0x1, 0x1, 0xa00000, 0xf51a80, 0xc001ae54c0, 0xc000f50600, 0xbf03e0118ed40776, ...)
        /tmp/gopath_11-15-0309.940769310/src/github.com/echocat/caddy-filter/filter.go:35 +0x122 fp=0xc001793550 sp=0xc001793458 pc=0xa985e2
github.com/echocat/caddy-filter.(*filterHandler).ServeHTTP(0xc000a484e0, 0xf51a80, 0xc001ae54c0, 0xc000f50600, 0xf4de80, 0xc0008bc870, 0x20)
        <autogenerated>:1 +0x7a fp=0xc0017935c0 sp=0xc001793550 pc=0xa9d3fa
github.com/mholt/caddy/caddyhttp/log.Logger.ServeHTTP(0xf48ac0, 0xc000a484e0, 0xc00031daf8, 0x1, 0x1, 0xe8bfe8, 0xf52fc0, 0xc001ad7260, 0xc000f50600, 0xe05020, ...)
        /tmp/gopath_11-15-0309.940769310/src/github.com/mholt/caddy/caddyhttp/log/log.go:53 +0x191 fp=0xc0017937b8 sp=0xc0017935c0 pc=0xbdcd91
github.com/mholt/caddy/caddyhttp/log.(*Logger).ServeHTTP(0xc001bed290, 0xf52fc0, 0xc001ad7260, 0xc000f50600, 0x0, 0xc000ae0500, 0xf53f00)
        <autogenerated>:1 +0x7a fp=0xc001793828 sp=0xc0017937b8 pc=0xbde8fa
github.com/mholt/caddy/caddyhttp/httpserver.(*Server).serveHTTP(0xc000b13380, 0xf52fc0, 0xc001ad7260, 0xc000f50500, 0x5, 0xc0008bc720, 0xf53f00)
        /tmp/gopath_11-15-0309.940769310/src/github.com/mholt/caddy/caddyhttp/httpserver/server.go:445 +0x34f fp=0xc0017939b8 sp=0xc001793828 pc=0x969d4f
github.com/mholt/caddy/caddyhttp/httpserver.(*Server).ServeHTTP(0xc000b13380, 0xf52fc0, 0xc001ad7260, 0xc000f50500)
        /tmp/gopath_11-15-0309.940769310/src/github.com/mholt/caddy/caddyhttp/httpserver/server.go:381 +0x5be fp=0xc001793bb0 sp=0xc0017939b8 pc=0x9696de
github.com/mholt/caddy/caddyhttp/httpserver.(*tlsHandler).ServeHTTP(0xc0006fd8a0, 0xf52fc0, 0xc001ad7260, 0xc000f50100)
        /tmp/gopath_11-15-0309.940769310/src/github.com/mholt/caddy/caddyhttp/httpserver/mitm.go:128 +0x482 fp=0xc001793d48 sp=0xc001793bb0 pc=0x95b292
net/http.serverHandler.ServeHTTP(0xc00056cb60, 0xf52fc0, 0xc001ad7260, 0xc000f50100)
        /usr/local/go/src/net/http/server.go:2741 +0xab fp=0xc001793d78 sp=0xc001793d48 pc=0x6af66b
net/http.(*conn).serve(0xc001fd8960, 0xf53e40, 0xc001ae5380)
        /usr/local/go/src/net/http/server.go:1847 +0x646 fp=0xc001793fc8 sp=0xc001793d78 pc=0x6aba16

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.