Initial commit

This commit is contained in:
Marcus Noble 2021-08-08 16:13:11 +01:00
commit cea1ae23ac
5 changed files with 142 additions and 0 deletions

13
Dockerfile Normal file
View File

@ -0,0 +1,13 @@
FROM golang:1.16-alpine AS builder
RUN apk update && apk add --no-cache git && apk add -U --no-cache ca-certificates
WORKDIR /app/
ADD go.mod ./
RUN go mod download
ADD . .
RUN GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -ldflags="-w -s" -o echoserver .
FROM scratch
WORKDIR /app/
COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
COPY --from=builder /app/echoserver /app/echoserver
ENTRYPOINT ["/app/echoserver"]

61
Makefile Normal file
View File

@ -0,0 +1,61 @@
.DEFAULT_GOAL := default
IMAGE ?= docker.cluster.fun/averagemarcus/echoserver:latest
.PHONY: test # Run all tests, linting and format checks
test: lint check-format run-tests
.PHONY: lint # Perform lint checks against code
lint:
@go vet && golint -set_exit_status ./...
.PHONY: check-format # Checks code formatting and returns a non-zero exit code if formatting errors found
check-format:
@gofmt -e -l .
.PHONY: format # Performs automatic format fixes on all code
format:
@gofmt -s -w .
.PHONY: run-tests # Runs all tests
run-tests:
@echo "⚠️ 'run-tests' unimplemented"
.PHONY: fetch-deps # Fetch all project dependencies
fetch-deps:
@go mod tidy
.PHONY: build # Build the project
build: lint check-format fetch-deps
@go build -o echoserver main.go
.PHONY: docker-build # Build the docker image
docker-build:
@docker build -t $(IMAGE) .
.PHONY: docker-publish # Push the docker image to the remote registry
docker-publish:
@docker push $(IMAGE)
.PHONY: run # Run the application
run:
@go run .
.PHONY: ci # Perform CI specific tasks to perform on a pull request
ci:
@echo "⚠️ 'ci' unimplemented"
.PHONY: release # Release the latest version of the application
release:
@kubectl --namespace echoserver rollout restart deployment echoserver
.PHONY: help # Show this list of commands
help:
@echo "echoserver"
@echo "Usage: make [target]"
@echo ""
@echo "target description" | expand -t20
@echo "-----------------------------------"
@grep '^.PHONY: .* #' Makefile | sed 's/\.PHONY: \(.*\) # \(.*\)/\1 \2/' | expand -t20
default: test build

11
README.md Normal file
View File

@ -0,0 +1,11 @@
# echoserver
A basic HTTP server to echo back details of a request
## Contributing
If you find a bug or have an idea for a new feature please [raise an issue](issues/new) to discuss it.
Pull requests are welcomed but please try and follow similar code style as the rest of the project and ensure all tests and code checkers are passing.
Thank you 💛

3
go.mod Normal file
View File

@ -0,0 +1,3 @@
module github.com/averagemarcus/echoserver
go 1.16

54
main.go Normal file
View File

@ -0,0 +1,54 @@
package main
import (
"encoding/json"
"log"
"net"
"net/http"
"os"
"time"
)
type echoResponse struct {
RequestPath string `json:"requestPath"`
RequestHost string `json:"requestHost"`
Protocol string `json:"protocol"`
Method string `json:"method"`
Headers map[string][]string `json:"headers"`
RemoteAddr string `json:"remoteAddr"`
ServerHostname string `json:"serverHostname"`
ServerIP string `json:"serverIP"`
DateTime time.Time `json:"dateTime"`
}
func main() {
hostname, _ := os.Hostname()
conn, _ := net.Dial("udp", "8.8.8.8:80")
defer conn.Close()
ipAddress := conn.LocalAddr().String()
http.HandleFunc("/", func(rw http.ResponseWriter, r *http.Request) {
resp := echoResponse{
RequestPath: r.URL.String(),
RequestHost: r.Host,
Protocol: r.Proto,
Method: r.Method,
Headers: r.Header,
RemoteAddr: r.RemoteAddr,
ServerHostname: hostname,
ServerIP: ipAddress,
DateTime: time.Now(),
}
b, _ := json.Marshal(resp)
rw.Header().Add("Content-Type", "application/json")
rw.Write(b)
})
err := http.ListenAndServe(":8080", nil)
if err != nil {
log.Fatal(err)
}
}