init
This commit is contained in:
commit
85908fe28c
7 changed files with 188 additions and 0 deletions
22
.woodpecker.yaml
Normal file
22
.woodpecker.yaml
Normal file
|
@ -0,0 +1,22 @@
|
|||
steps:
|
||||
- name: build
|
||||
image: golang:1.23
|
||||
commands:
|
||||
- go test ./...
|
||||
- go build ./
|
||||
- name: docker
|
||||
image: plugins/docker
|
||||
depends_on: [ build ]
|
||||
settings:
|
||||
username: kekskurse
|
||||
password:
|
||||
from_secret: docker
|
||||
repo: kekskurse/minimock
|
||||
dockerfile: Dockerfile
|
||||
tags:
|
||||
- latest
|
||||
- ${CI_COMMIT_SHA}
|
||||
when:
|
||||
event: push
|
||||
branch: [main]
|
||||
|
3
Dockerfile
Normal file
3
Dockerfile
Normal file
|
@ -0,0 +1,3 @@
|
|||
From scratch
|
||||
COPY ./minimock /minimock
|
||||
CMD ["/minimock"]
|
10
config.sample.yml
Normal file
10
config.sample.yml
Normal file
|
@ -0,0 +1,10 @@
|
|||
---
|
||||
routen:
|
||||
- path: /test
|
||||
response_body: "Juhu das geht ja"
|
||||
- path: /test2
|
||||
response_body: "Das geht auch"
|
||||
- path: /httpstatus
|
||||
response_body: "Here the http response code should be 234"
|
||||
response_http_status: 234
|
||||
|
18
go.mod
Normal file
18
go.mod
Normal file
|
@ -0,0 +1,18 @@
|
|||
module git.keks.cloud/kekskurse/minimock
|
||||
|
||||
go 1.23.1
|
||||
|
||||
require (
|
||||
github.com/rs/zerolog v1.33.0
|
||||
github.com/urfave/cli/v2 v2.27.4
|
||||
gopkg.in/yaml.v3 v3.0.1
|
||||
)
|
||||
|
||||
require (
|
||||
github.com/cpuguy83/go-md2man/v2 v2.0.4 // indirect
|
||||
github.com/mattn/go-colorable v0.1.13 // indirect
|
||||
github.com/mattn/go-isatty v0.0.19 // indirect
|
||||
github.com/russross/blackfriday/v2 v2.1.0 // indirect
|
||||
github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 // indirect
|
||||
golang.org/x/sys v0.12.0 // indirect
|
||||
)
|
27
go.sum
Normal file
27
go.sum
Normal file
|
@ -0,0 +1,27 @@
|
|||
github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
|
||||
github.com/cpuguy83/go-md2man/v2 v2.0.4 h1:wfIWP927BUkWJb2NmU/kNDYIBTh/ziUX91+lVfRxZq4=
|
||||
github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
|
||||
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
|
||||
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
|
||||
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
|
||||
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
|
||||
github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA=
|
||||
github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
|
||||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||
github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
|
||||
github.com/rs/zerolog v1.33.0 h1:1cU2KZkvPxNyfgEmhHAz/1A9Bz+llsdYzklWFzgp0r8=
|
||||
github.com/rs/zerolog v1.33.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss=
|
||||
github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
|
||||
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
||||
github.com/urfave/cli/v2 v2.27.4 h1:o1owoI+02Eb+K107p27wEX9Bb8eqIoZCfLXloLUSWJ8=
|
||||
github.com/urfave/cli/v2 v2.27.4/go.mod h1:m4QzxcD2qpra4z7WhzEGn74WZLViBnMpb1ToCAKdGRQ=
|
||||
github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 h1:gEOO8jv9F4OT7lGCjxCBTO/36wtF6j2nSip77qHd4x4=
|
||||
github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1/go.mod h1:Ohn+xnUBiLI6FVj/9LpzZWtj1/D6lUovWYBkxHVV3aM=
|
||||
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o=
|
||||
golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
106
main.go
Normal file
106
main.go
Normal file
|
@ -0,0 +1,106 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
"os"
|
||||
"time"
|
||||
|
||||
"github.com/rs/zerolog/log"
|
||||
"github.com/urfave/cli/v2"
|
||||
"gopkg.in/yaml.v3"
|
||||
)
|
||||
|
||||
type config struct {
|
||||
Routen []routeConfig `yaml:"routen"`
|
||||
}
|
||||
type routeConfig struct {
|
||||
Path string
|
||||
ResponseHTTPStatus int `yaml:"response_http_status"`
|
||||
ResponseBody string `yaml:"response_body"`
|
||||
ResponseHeaders map[string]string `yaml:"response_header"`
|
||||
}
|
||||
|
||||
type requestData struct {
|
||||
Path string `json:"path"`
|
||||
Time time.Time `json:"time"`
|
||||
}
|
||||
|
||||
var requestDataList []requestData
|
||||
|
||||
func (ro routeConfig) httpHandler(w http.ResponseWriter, r *http.Request) {
|
||||
if ro.ResponseHTTPStatus != 0 {
|
||||
w.WriteHeader(ro.ResponseHTTPStatus)
|
||||
}
|
||||
for v := range ro.ResponseHeaders {
|
||||
w.Header().Add(v, ro.ResponseHeaders[v])
|
||||
}
|
||||
_, err := w.Write([]byte(ro.ResponseBody))
|
||||
if err != nil {
|
||||
log.Error().Err(err).Msg("cant write body to response writer")
|
||||
}
|
||||
|
||||
rde := requestData{
|
||||
Path: r.URL.Path,
|
||||
Time: time.Now(),
|
||||
}
|
||||
|
||||
requestDataList = append(requestDataList, rde)
|
||||
}
|
||||
|
||||
func main() {
|
||||
app := &cli.App{
|
||||
Name: "run",
|
||||
Usage: "Run the minimock http server",
|
||||
Flags: []cli.Flag{
|
||||
&cli.StringFlag{
|
||||
Name: "config",
|
||||
Aliases: []string{"c"},
|
||||
Usage: "Load configuration from `FILE`",
|
||||
Value: "config.yml",
|
||||
},
|
||||
},
|
||||
Action: action,
|
||||
}
|
||||
|
||||
if err := app.Run(os.Args); err != nil {
|
||||
log.Fatal().Err(err).Msg("Finish App")
|
||||
}
|
||||
}
|
||||
|
||||
func action(c *cli.Context) error {
|
||||
log.Info().Msg("Start")
|
||||
fileContent, err := os.ReadFile(c.String("config"))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
co := config{}
|
||||
err = yaml.Unmarshal(fileContent, &co)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
initServer(co)
|
||||
|
||||
err = http.ListenAndServe(":3333", nil)
|
||||
return err
|
||||
}
|
||||
|
||||
func initServer(c config) {
|
||||
for _, ro := range c.Routen {
|
||||
log.Debug().Str("path", ro.Path).Msg("Register Route")
|
||||
http.HandleFunc(ro.Path, ro.httpHandler)
|
||||
}
|
||||
|
||||
http.HandleFunc("/requestlog", func(w http.ResponseWriter, r *http.Request) {
|
||||
data, err := json.Marshal(requestDataList)
|
||||
if err != nil {
|
||||
log.Error().Err(err).Msg("cant marshal request data list")
|
||||
return
|
||||
}
|
||||
_, err = w.Write(data)
|
||||
if err != nil {
|
||||
log.Error().Err(err).Msg("error writing responste data lsit via http")
|
||||
}
|
||||
})
|
||||
}
|
2
readme.md
Normal file
2
readme.md
Normal file
|
@ -0,0 +1,2 @@
|
|||
# MiniMock
|
||||
Small HTTP Server sending static response (body, header, httpstatuscode) based on a config file. Also all requests are stored and visible via api. This can be used to develop and tests software talking with external http servers.
|
Loading…
Reference in a new issue