Compare commits
4 Commits
Author | SHA1 | Date | |
---|---|---|---|
932937c4e8 | |||
eeea0e75c9 | |||
09b74d7912 | |||
5a6136c5e7 |
23
.github/workflows/ci.yml
vendored
23
.github/workflows/ci.yml
vendored
@ -12,32 +12,23 @@ jobs:
|
||||
name: Main Process
|
||||
runs-on: ubuntu-latest
|
||||
env:
|
||||
GO_VERSION: 1.19
|
||||
GOLANGCI_LINT_VERSION: v1.50.0
|
||||
GO_VERSION: '1.20'
|
||||
GOLANGCI_LINT_VERSION: v1.53.3
|
||||
CGO_ENABLED: 0
|
||||
|
||||
steps:
|
||||
|
||||
# https://github.com/marketplace/actions/setup-go-environment
|
||||
- name: Set up Go ${{ env.GO_VERSION }}
|
||||
uses: actions/setup-go@v2
|
||||
with:
|
||||
go-version: ${{ env.GO_VERSION }}
|
||||
|
||||
# https://github.com/marketplace/actions/checkout
|
||||
- name: Check out code
|
||||
uses: actions/checkout@v2
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
# https://github.com/marketplace/actions/cache
|
||||
- name: Cache Go modules
|
||||
uses: actions/cache@v3
|
||||
# https://github.com/marketplace/actions/setup-go-environment
|
||||
- name: Set up Go ${{ env.GO_VERSION }}
|
||||
uses: actions/setup-go@v4
|
||||
with:
|
||||
path: ~/go/pkg/mod
|
||||
key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-go-
|
||||
go-version: ${{ env.GO_VERSION }}
|
||||
|
||||
- name: Check and get dependencies
|
||||
run: |
|
||||
|
28
.github/workflows/go-cross.yml
vendored
28
.github/workflows/go-cross.yml
vendored
@ -19,33 +19,15 @@ jobs:
|
||||
os: [ubuntu-latest, macos-latest, windows-latest]
|
||||
|
||||
steps:
|
||||
# https://github.com/marketplace/actions/setup-go-environment
|
||||
- name: Set up Go ${{ matrix.go-version }}
|
||||
uses: actions/setup-go@v2
|
||||
with:
|
||||
go-version: ${{ matrix.go-version }}
|
||||
|
||||
# https://github.com/marketplace/actions/checkout
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v2
|
||||
uses: actions/checkout@v3
|
||||
|
||||
# https://github.com/marketplace/actions/cache
|
||||
- name: Cache Go modules
|
||||
uses: actions/cache@v3
|
||||
# https://github.com/marketplace/actions/setup-go-environment
|
||||
- name: Set up Go ${{ matrix.go-version }}
|
||||
uses: actions/setup-go@v4
|
||||
with:
|
||||
# In order:
|
||||
# * Module download cache
|
||||
# * Build cache (Linux)
|
||||
# * Build cache (Mac)
|
||||
# * Build cache (Windows)
|
||||
path: |
|
||||
~/go/pkg/mod
|
||||
~/.cache/go-build
|
||||
~/Library/Caches/go-build
|
||||
%LocalAppData%\go-build
|
||||
key: ${{ runner.os }}-${{ matrix.go-version }}-go-${{ hashFiles('**/go.sum') }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-${{ matrix.go-version }}-go-
|
||||
go-version: ${{ matrix.go-version }}
|
||||
|
||||
- name: Test
|
||||
run: go test -v -cover ./...
|
||||
|
16
.github/workflows/release.yml
vendored
16
.github/workflows/release.yml
vendored
@ -9,23 +9,23 @@ jobs:
|
||||
name: Release Process
|
||||
runs-on: ubuntu-latest
|
||||
env:
|
||||
GO_VERSION: 1.19
|
||||
GO_VERSION: '1.20'
|
||||
CGO_ENABLED: 0
|
||||
|
||||
steps:
|
||||
|
||||
# https://github.com/marketplace/actions/setup-go-environment
|
||||
- name: Set up Go ${{ env.GO_VERSION }}
|
||||
uses: actions/setup-go@v2
|
||||
with:
|
||||
go-version: ${{ env.GO_VERSION }}
|
||||
|
||||
# https://github.com/marketplace/actions/checkout
|
||||
- name: Check out code
|
||||
uses: actions/checkout@v2
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
# https://github.com/marketplace/actions/setup-go-environment
|
||||
- name: Set up Go ${{ env.GO_VERSION }}
|
||||
uses: actions/setup-go@v4
|
||||
with:
|
||||
go-version: ${{ env.GO_VERSION }}
|
||||
|
||||
- name: dockerhub-login
|
||||
uses: docker/login-action@v1
|
||||
with:
|
||||
|
@ -20,10 +20,13 @@ linters-settings:
|
||||
gofumpt:
|
||||
extra-rules: true
|
||||
depguard:
|
||||
list-type: blacklist
|
||||
include-go-root: false
|
||||
packages:
|
||||
- github.com/pkg/errors
|
||||
rules:
|
||||
main:
|
||||
deny:
|
||||
- pkg: "github.com/instana/testify"
|
||||
desc: not allowed
|
||||
- pkg: "github.com/pkg/errors"
|
||||
desc: Should be replaced by standard lib errors package
|
||||
godox:
|
||||
keywords:
|
||||
- FIXME
|
||||
|
@ -16,10 +16,14 @@ Returns the whoami information (request and network information).
|
||||
The optional `wait` query parameter can be provided to tell the server to wait before sending the response.
|
||||
The duration is expected in Go's [`time.Duration`](https://golang.org/pkg/time/#ParseDuration) format (e.g. `/?wait=100ms` to wait 100 milliseconds).
|
||||
|
||||
The optional `env` query parameter can be set to `true` to add the environment variables to the response.
|
||||
|
||||
#### `/api`
|
||||
|
||||
Returns the whoami information as JSON.
|
||||
|
||||
The optional `env` query parameter can be set to `true` to add the environment variables to the response.
|
||||
|
||||
#### `/bench`
|
||||
|
||||
Always return the same response (`1`).
|
||||
|
141
app.go
141
app.go
@ -10,7 +10,6 @@ import (
|
||||
"log"
|
||||
"net"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"os"
|
||||
"strconv"
|
||||
"strings"
|
||||
@ -29,6 +28,14 @@ const (
|
||||
TB
|
||||
)
|
||||
|
||||
var upgrader = websocket.Upgrader{
|
||||
ReadBufferSize: 1024,
|
||||
WriteBufferSize: 1024,
|
||||
CheckOrigin: func(r *http.Request) bool {
|
||||
return true
|
||||
},
|
||||
}
|
||||
|
||||
var (
|
||||
cert string
|
||||
key string
|
||||
@ -43,16 +50,21 @@ func init() {
|
||||
flag.StringVar(&cert, "cert", "", "give me a certificate")
|
||||
flag.StringVar(&key, "key", "", "give me a key")
|
||||
flag.StringVar(&ca, "cacert", "", "give me a CA chain, enforces mutual TLS")
|
||||
flag.StringVar(&port, "port", getEnv("WHOAMI_PORT_NUMBER", "80"), "give me a port number")
|
||||
flag.StringVar(&port, "port", getEnv("WHOAMI_PORT_NUMBER", "8080"), "give me a port number")
|
||||
flag.StringVar(&name, "name", os.Getenv("WHOAMI_NAME"), "give me a name")
|
||||
}
|
||||
|
||||
var upgrader = websocket.Upgrader{
|
||||
ReadBufferSize: 1024,
|
||||
WriteBufferSize: 1024,
|
||||
CheckOrigin: func(r *http.Request) bool {
|
||||
return true
|
||||
},
|
||||
// Data whoami information.
|
||||
type Data struct {
|
||||
Hostname string `json:"hostname,omitempty"`
|
||||
IP []string `json:"ip,omitempty"`
|
||||
Headers http.Header `json:"headers,omitempty"`
|
||||
URL string `json:"url,omitempty"`
|
||||
Host string `json:"host,omitempty"`
|
||||
Method string `json:"method,omitempty"`
|
||||
Name string `json:"name,omitempty"`
|
||||
RemoteAddr string `json:"remoteAddr,omitempty"`
|
||||
Environ map[string]string `json:"environ,omitempty"`
|
||||
}
|
||||
|
||||
func main() {
|
||||
@ -154,8 +166,7 @@ func printBinary(s []byte) {
|
||||
}
|
||||
|
||||
func dataHandler(w http.ResponseWriter, r *http.Request) {
|
||||
u, _ := url.Parse(r.URL.String())
|
||||
queryParams := u.Query()
|
||||
queryParams := r.URL.Query()
|
||||
|
||||
size, err := strconv.ParseInt(queryParams.Get("size"), 10, 64)
|
||||
if err != nil {
|
||||
@ -196,9 +207,10 @@ func dataHandler(w http.ResponseWriter, r *http.Request) {
|
||||
}
|
||||
}
|
||||
|
||||
func whoamiHandler(w http.ResponseWriter, req *http.Request) {
|
||||
u, _ := url.Parse(req.URL.String())
|
||||
wait := u.Query().Get("wait")
|
||||
func whoamiHandler(w http.ResponseWriter, r *http.Request) {
|
||||
queryParams := r.URL.Query()
|
||||
|
||||
wait := queryParams.Get("wait")
|
||||
if len(wait) > 0 {
|
||||
duration, err := time.ParseDuration(wait)
|
||||
if err == nil {
|
||||
@ -213,66 +225,47 @@ func whoamiHandler(w http.ResponseWriter, req *http.Request) {
|
||||
hostname, _ := os.Hostname()
|
||||
_, _ = fmt.Fprintln(w, "Hostname:", hostname)
|
||||
|
||||
ifaces, _ := net.Interfaces()
|
||||
for _, i := range ifaces {
|
||||
addrs, _ := i.Addrs()
|
||||
// handle err
|
||||
for _, addr := range addrs {
|
||||
var ip net.IP
|
||||
switch v := addr.(type) {
|
||||
case *net.IPNet:
|
||||
ip = v.IP
|
||||
case *net.IPAddr:
|
||||
ip = v.IP
|
||||
}
|
||||
_, _ = fmt.Fprintln(w, "IP:", ip)
|
||||
}
|
||||
for _, ip := range getIPs() {
|
||||
_, _ = fmt.Fprintln(w, "IP:", ip)
|
||||
}
|
||||
|
||||
_, _ = fmt.Fprintln(w, "RemoteAddr:", req.RemoteAddr)
|
||||
if err := req.Write(w); err != nil {
|
||||
_, _ = fmt.Fprintln(w, "RemoteAddr:", r.RemoteAddr)
|
||||
if err := r.Write(w); err != nil {
|
||||
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
|
||||
if ok, _ := strconv.ParseBool(queryParams.Get("env")); ok {
|
||||
for _, env := range os.Environ() {
|
||||
_, _ = fmt.Fprintln(w, env)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func apiHandler(w http.ResponseWriter, req *http.Request) {
|
||||
func apiHandler(w http.ResponseWriter, r *http.Request) {
|
||||
queryParams := r.URL.Query()
|
||||
|
||||
hostname, _ := os.Hostname()
|
||||
|
||||
data := struct {
|
||||
Hostname string `json:"hostname,omitempty"`
|
||||
IP []string `json:"ip,omitempty"`
|
||||
Headers http.Header `json:"headers,omitempty"`
|
||||
URL string `json:"url,omitempty"`
|
||||
Host string `json:"host,omitempty"`
|
||||
Method string `json:"method,omitempty"`
|
||||
Name string `json:"name,omitempty"`
|
||||
}{
|
||||
Hostname: hostname,
|
||||
IP: []string{},
|
||||
Headers: req.Header,
|
||||
URL: req.URL.RequestURI(),
|
||||
Host: req.Host,
|
||||
Method: req.Method,
|
||||
Name: name,
|
||||
environ := make(map[string]string)
|
||||
|
||||
if ok, _ := strconv.ParseBool(queryParams.Get("env")); ok {
|
||||
for _, env := range os.Environ() {
|
||||
before, after, _ := strings.Cut(env, "=")
|
||||
environ[before] = after
|
||||
}
|
||||
}
|
||||
|
||||
ifaces, _ := net.Interfaces()
|
||||
for _, i := range ifaces {
|
||||
addrs, _ := i.Addrs()
|
||||
// handle err
|
||||
for _, addr := range addrs {
|
||||
var ip net.IP
|
||||
switch v := addr.(type) {
|
||||
case *net.IPNet:
|
||||
ip = v.IP
|
||||
case *net.IPAddr:
|
||||
ip = v.IP
|
||||
}
|
||||
if ip != nil {
|
||||
data.IP = append(data.IP, ip.String())
|
||||
}
|
||||
}
|
||||
data := Data{
|
||||
Hostname: hostname,
|
||||
IP: getIPs(),
|
||||
Headers: r.Header,
|
||||
URL: r.URL.RequestURI(),
|
||||
Host: r.Host,
|
||||
Method: r.Method,
|
||||
Name: name,
|
||||
RemoteAddr: r.RemoteAddr,
|
||||
Environ: environ,
|
||||
}
|
||||
|
||||
w.Header().Set("Content-Type", "application/json")
|
||||
@ -319,3 +312,27 @@ func getEnv(key, fallback string) string {
|
||||
}
|
||||
return value
|
||||
}
|
||||
|
||||
func getIPs() []string {
|
||||
var ips []string
|
||||
|
||||
ifaces, _ := net.Interfaces()
|
||||
for _, i := range ifaces {
|
||||
addrs, _ := i.Addrs()
|
||||
// handle err
|
||||
for _, addr := range addrs {
|
||||
var ip net.IP
|
||||
switch v := addr.(type) {
|
||||
case *net.IPNet:
|
||||
ip = v.IP
|
||||
case *net.IPAddr:
|
||||
ip = v.IP
|
||||
}
|
||||
if ip != nil {
|
||||
ips = append(ips, ip.String())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return ips
|
||||
}
|
||||
|
Reference in New Issue
Block a user