A very simple HTTP echo server written in Go, meant for use on k8s but useful anywhere. Also has support for websockets ;)
The goal of this project is to reliably provide useful information about the current session, the instance serving the session, and help test things like Load Balancers, Web Servers, and Browsers.
- Default GET shows plethora of useful information.
 - Any messages sent from a websocket client are echoed.
 - Visit 
/wsvia browser for an interactive UI to connect and send websocket messages. - The 
PORTandSSLPORTenvironment variable set the corresponding server ports. - Has SSL/TLS support already including some play-around self-signed certs.
 
docker run -d -p 8080:8080 inanimate/echo-server
Browsing to localhost:8080, you should then see something resembling the example below.
The default encrypted port is 8443 and serves a self-signed certificate
I've generated and builtin. The the CN is cakewalk.herpderp.com so you
can easily distinguish it when working with echo-server.
Obviously, this is for testing purposes only! Do not use this in production and definitely disallow it from being seen publicly!
If you'd like to use your own, you can clone this repo, gen your own cert, and rebuild the bin/image.
Additionally, you can provide a ADD_HEADERS variable with JSON formatted
values to include as response headers. By default, X-Real-Server: echo-server is
set to help you verify you're getting a response from the echo-server.
ADD_HEADERS={"X-Foo": "bar", "X-Server": "cats1.0"}
We also accept the following k8s variables which are explicitly displayed at the top of the page for quick observance.
POD_NAME- Can be provided viametadata.namePOD_NAMESPACE- Can be provided viametadata.namespacePOD_IP- Can be provided viastatus.podIP
See here for more on how to define these in your manifest.
You can specify any variables you want if you'd like to convey more info. In the example below, I use
HELM*variables to provide info about the deployed chart.
Welcome to echo-server!  Here's what I know.
  > Head to /ws for interactive websocket echo!
-> My hostname is: echo-server-4282639374-6bvzg
-> My Pod Name is: echo-server-4282639374-6bvzg
-> My Pod Namespace is: playground
-> My Pod IP is: 10.2.1.30
-> Requesting IP: 10.2.2.0:40974
-> TLS Connection Info | 
  &{Version:771 HandshakeComplete:true DidResume:false CipherSuite:52392 NegotiatedProtocol:h2 NegotiatedProtocolIsMutual:true ServerName:echo.arroyo.io PeerCertificates:[] VerifiedChains:[] SignedCertificateTimestamps:[] OCSPResponse:[] TLSUnique:[208 42 212 243 141 165 4 35 226 40 176 84]}
-> Request Headers | 
  HTTP/1.1 GET /
  Host: example.com
  Accept-Encoding: gzip, deflate, sdch
  Accept-Language: en-US,en;q=0.8
  Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
  Cache-Control: no-cache
  Connection: close
  Cookie: _ga=GA1.2.2092706772.1468371657
  Pragma: no-cache
  Upgrade-Insecure-Requests: 1
  User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36
  X-Forwarded-For: 192.168.1.149
  X-Forwarded-Host: example.com
  X-Forwarded-Port: 80
  X-Forwarded-Proto: http
  X-Real-Ip: 192.168.1.149
-> Response Headers |
  Content-Type: text/plain
  X-Real-Server: echo-server
 >> Note that you may also see "Transfer-Encoding" and "Date"!
-> My environment |
  ADD_HEADERS={"X-Real-Server": "echo-server"}
  APACHESUCKS_PORT=tcp://10.3.0.41:80
  APACHESUCKS_PORT_80_TCP=tcp://10.3.0.41:80
  APACHESUCKS_PORT_80_TCP_ADDR=10.3.0.41
  APACHESUCKS_PORT_80_TCP_PORT=80
  APACHESUCKS_PORT_80_TCP_PROTO=tcp
  APACHESUCKS_SERVICE_HOST=10.3.0.41
  APACHESUCKS_SERVICE_PORT=80
  APACHESUCKS_SERVICE_PORT_HTTP=80
  ECHO_SERVER_PORT=tcp://10.3.0.155:80
  ECHO_SERVER_PORT_80_TCP=tcp://10.3.0.155:80
  ECHO_SERVER_PORT_80_TCP_ADDR=10.3.0.155
  ECHO_SERVER_PORT_80_TCP_PORT=80
  ECHO_SERVER_PORT_80_TCP_PROTO=tcp
  ECHO_SERVER_SERVICE_HOST=10.3.0.155
  ECHO_SERVER_SERVICE_PORT=80
  ECHO_SERVER_SERVICE_PORT_HTTP=80
  HELM_CHART_NAME=echo-server
  HELM_IMAGE=inanimate/echo-server
  HELM_K8S_VERSION=1.5
  HELM_RELEASE_NAME=kindly-horse
  HELM_REPLICAS=3
  HELM_REVISION=1
  HELM_VERSION=v2.2.1
  HOME=/
  HOSTNAME=echo-server-4282639374-6bvzg
  KUBERNETES_PORT=tcp://10.3.0.1:443
  KUBERNETES_PORT_443_TCP=tcp://10.3.0.1:443
  KUBERNETES_PORT_443_TCP_ADDR=10.3.0.1
  KUBERNETES_PORT_443_TCP_PORT=443
  KUBERNETES_PORT_443_TCP_PROTO=tcp
  KUBERNETES_SERVICE_HOST=10.3.0.1
  KUBERNETES_SERVICE_PORT=443
  KUBERNETES_SERVICE_PORT_HTTPS=443
  NGINX_PORT=tcp://10.3.0.160:80
  NGINX_PORT_80_TCP=tcp://10.3.0.160:80
  NGINX_PORT_80_TCP_ADDR=10.3.0.160
  NGINX_PORT_80_TCP_PORT=80
  NGINX_PORT_80_TCP_PROTO=tcp
  NGINX_SERVICE_HOST=10.3.0.160
  NGINX_SERVICE_PORT=80
  NGINX_SERVICE_PORT_HTTP=80
  PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
  POD_IP=10.2.1.30
  POD_NAME=echo-server-4282639374-6bvzg
  POD_NAMESPACE=playground
  PORT=8080
-> Contents of /etc/resolv.conf |
search playground.svc.cluster.local svc.cluster.local cluster.local
nameserver 10.3.0.10
options ndots:5
-> Contents of /etc/hosts |
# Kubernetes-managed hosts file.
127.0.0.1	localhost
::1	localhost ip6-localhost ip6-loopback
fe00::0	ip6-localnet
fe00::0	ip6-mcastprefix
fe00::1	ip6-allnodes
fe00::2	ip6-allrouters
10.2.1.30	echo-server-4282639374-6bvzg
-> And that's the way it is 2017-03-20 18:41:33.273214345 +0000 UTC
// Thanks for using echo-server, a project by Mario Loria (InAnimaTe).
// https://github.com/inanimate/echo-server
// https://hub.docker.com/r/inanimate/echo-server