parent
d4d9394a1f
commit
e99d5309e7
@ -0,0 +1,5 @@
|
|||||||
|
# HTTP Cat
|
||||||
|
|
||||||
|
An HTTP server that returns the HTTP request as text in the response body.
|
||||||
|
Useful for debugging proxy configurations.
|
||||||
|
|
@ -0,0 +1,59 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"flag"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"log"
|
||||||
|
"net/http"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
ports = flag.String("ports", "", "comma-separated list of ports to listen on")
|
||||||
|
)
|
||||||
|
|
||||||
|
type CatHandler struct{}
|
||||||
|
|
||||||
|
var _ http.Handler = &CatHandler{}
|
||||||
|
|
||||||
|
func (cs *CatHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) {
|
||||||
|
log.Printf("[%s] %s %s", req.Host, req.Method, req.URL.Path)
|
||||||
|
|
||||||
|
w.Write([]byte(fmt.Sprintf("HTTP1.1 %s %s\n", req.Method, req.URL.Path)))
|
||||||
|
for k, v := range req.Header {
|
||||||
|
w.Write([]byte(fmt.Sprintf("%s: %s\n", k, strings.Join(v, ", "))))
|
||||||
|
}
|
||||||
|
w.Write([]byte{'\n'})
|
||||||
|
|
||||||
|
if req.Body != nil {
|
||||||
|
io.Copy(w, req.Body)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
flag.Parse()
|
||||||
|
|
||||||
|
errch := make(chan error)
|
||||||
|
done := make(chan struct{})
|
||||||
|
for _, p := range strings.Split(*ports, ",") {
|
||||||
|
port := strings.TrimSpace(p)
|
||||||
|
if port[0] != ':' {
|
||||||
|
port = ":" + port
|
||||||
|
}
|
||||||
|
go func() {
|
||||||
|
log.Printf("listening on %s\n", port)
|
||||||
|
if err := http.ListenAndServe(port, new(CatHandler)); err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
errch <- err
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
|
||||||
|
go func() {
|
||||||
|
<-errch
|
||||||
|
done <- struct{}{}
|
||||||
|
}()
|
||||||
|
|
||||||
|
<-done
|
||||||
|
}
|
Loading…
Reference in new issue