[mod] create own module for config

git-svn-id: file:///srv/svn/repo/yukari/trunk@127 f3bd38d9-da89-464d-a02a-eb04e43141b5
This commit is contained in:
asciimoo 2020-07-14 21:23:59 +00:00
parent 3d80d17398
commit 756d8c977a
2 changed files with 56 additions and 25 deletions

30
config/config.go Normal file
View File

@ -0,0 +1,30 @@
package config
import (
"os"
)
type Config struct {
Debug bool
ListenAddress string
Key string
IPV6 bool
RequestTimeout uint
}
var DefaultConfig *Config
func init() {
default_listen_addr := os.Getenv("MORTY_ADDRESS")
if default_listen_addr == "" {
default_listen_addr = "127.0.0.1:3000"
}
default_key := os.Getenv("MORTY_KEY")
DefaultConfig = &Config{
Debug: os.Getenv("DEBUG") != "false",
ListenAddress: default_listen_addr,
Key: default_key,
IPV6: true,
RequestTimeout: 5,
}
}

View File

@ -27,6 +27,7 @@ import (
"golang.org/x/net/html/charset"
"golang.org/x/text/encoding"
"github.com/asciimoo/morty/config"
"github.com/asciimoo/morty/contenttype"
)
@ -38,14 +39,12 @@ const (
const VERSION = "v0.2.0"
var DEBUG = os.Getenv("DEBUG") != "false"
var CLIENT *fasthttp.Client = &fasthttp.Client{
MaxResponseBodySize: 10 * 1024 * 1024, // 10M
ReadBufferSize: 16 * 1024, // 16K
}
var CSS_URL_REGEXP *regexp.Regexp = regexp.MustCompile("url\\((['\"]?)[ \\t\\f]*([\u0009\u0021\u0023-\u0026\u0028\u002a-\u007E]+)(['\"]?)\\)?")
var cfg *config.Config = config.DefaultConfig
var ALLOWED_CONTENTTYPE_FILTER contenttype.Filter = contenttype.NewFilterOr([]contenttype.Filter{
// html
@ -177,6 +176,8 @@ var LINK_HTTP_EQUIV_SAFE_VALUES [][]byte = [][]byte{
[]byte("content-language"),
}
var CSS_URL_REGEXP *regexp.Regexp = regexp.MustCompile("url\\((['\"]?)[ \\t\\f]*([\u0009\u0021\u0023-\u0026\u0028\u002a-\u007E]+)(['\"]?)\\)?")
type Proxy struct {
Key []byte
RequestTimeout time.Duration
@ -336,7 +337,7 @@ func (p *Proxy) RequestHandler(ctx *fasthttp.RequestCtx) {
requestURIStr := string(requestURI)
if DEBUG {
if cfg.Debug {
log.Println("getting", requestURIStr)
}
@ -374,7 +375,7 @@ func (p *Proxy) RequestHandler(ctx *fasthttp.RequestCtx) {
if err == nil {
ctx.SetStatusCode(resp.StatusCode())
ctx.Response.Header.Add("Location", url)
if DEBUG {
if cfg.Debug {
log.Println("redirect to", string(loc))
}
return
@ -469,7 +470,7 @@ func (p *Proxy) RequestHandler(ctx *fasthttp.RequestCtx) {
}
err := HTML_BODY_EXTENSION.Execute(ctx, p)
if err != nil {
if DEBUG {
if cfg.Debug {
fmt.Println("failed to inject body extension", err)
}
}
@ -555,7 +556,7 @@ func sanitizeCSS(rc *RequestConfig, out io.Writer, css []byte) {
out.Write(css[startIndex:urlStart])
out.Write([]byte(uri))
startIndex = urlEnd
} else if DEBUG {
} else if cfg.Debug {
log.Println("cannot proxify css uri:", string(css[urlStart:urlEnd]))
}
}
@ -676,7 +677,7 @@ func sanitizeHTML(rc *RequestConfig, out io.Writer, htmlDoc []byte) {
}
err := HTML_FORM_EXTENSION.Execute(out, HTMLFormExtParam{urlStr, key})
if err != nil {
if DEBUG {
if cfg.Debug {
fmt.Println("failed to inject body extension", err)
}
}
@ -693,7 +694,7 @@ func sanitizeHTML(rc *RequestConfig, out io.Writer, htmlDoc []byte) {
}
err := HTML_BODY_EXTENSION.Execute(out, p)
if err != nil {
if DEBUG {
if cfg.Debug {
fmt.Println("failed to inject body extension", err)
}
}
@ -832,7 +833,7 @@ func sanitizeAttr(rc *RequestConfig, out io.Writer, attrName, attrValue, escaped
case "src", "href", "action":
if uri, err := rc.ProxifyURI(attrValue); err == nil {
fmt.Fprintf(out, " %s=\"%s\"", attrName, uri)
} else if DEBUG {
} else if cfg.Debug {
log.Println("cannot proxify uri:", string(attrValue))
}
case "style":
@ -982,7 +983,7 @@ func verifyRequestURI(uri, hashMsg, key []byte) bool {
h := make([]byte, hex.DecodedLen(len(hashMsg)))
_, err := hex.Decode(h, hashMsg)
if err != nil {
if DEBUG {
if cfg.Debug {
log.Println("hmac error:", err)
}
return false
@ -1010,7 +1011,7 @@ func (p *Proxy) serveMainPage(ctx *fasthttp.RequestCtx, statusCode int, err erro
ctx.SetStatusCode(statusCode)
ctx.Write([]byte(MORTY_HTML_PAGE_START))
if err != nil {
if DEBUG {
if cfg.Debug {
log.Println("error:", err)
}
ctx.Write([]byte("<h2>Error: "))
@ -1030,14 +1031,11 @@ func (p *Proxy) serveMainPage(ctx *fasthttp.RequestCtx, statusCode int, err erro
}
func main() {
default_listen_addr := os.Getenv("MORTY_ADDRESS")
if default_listen_addr == "" {
default_listen_addr = "127.0.0.1:3000"
}
default_key := os.Getenv("MORTY_KEY")
listen := flag.String("listen", default_listen_addr, "Listen address")
key := flag.String("key", default_key, "HMAC url validation key (base64 encoded) - leave blank to disable validation")
ipv6 := flag.Bool("ipv6", false, "Allow IPv6 HTTP requests")
cfg.ListenAddress = *flag.String("listen", cfg.ListenAddress, "Listen address")
cfg.Key = *flag.String("key", cfg.Key, "HMAC url validation key (base64 encoded) - leave blank to disable validation")
cfg.IPV6 = *flag.Bool("ipv6", cfg.IPV6, "Allow IPv6 HTTP requests")
cfg.Debug = *flag.Bool("debug", cfg.Debug, "Debug mode")
cfg.RequestTimeout = *flag.Uint("timeout", cfg.RequestTimeout, "Request timeout")
version := flag.Bool("version", false, "Show version")
requestTimeout := flag.Uint("timeout", 2, "Request timeout")
socks5 := flag.String("socks5", "", "SOCKS5 proxy")
@ -1056,21 +1054,24 @@ func main() {
// this disables CLIENT.DialDualStack
CLIENT.Dial = fasthttpproxy.FasthttpSocksDialer(*socks5)
}
if cfg.IPV6 {
CLIENT.Dial = fasthttp.DialDualStack
}
p := &Proxy{RequestTimeout: time.Duration(*requestTimeout) * time.Second}
p := &Proxy{RequestTimeout: time.Duration(cfg.RequestTimeout) * time.Second}
if *key != "" {
if cfg.Key != "" {
var err error
p.Key, err = base64.StdEncoding.DecodeString(*key)
p.Key, err = base64.StdEncoding.DecodeString(cfg.Key)
if err != nil {
log.Fatal("Error parsing -key", err.Error())
os.Exit(1)
}
}
log.Println("listening on", *listen)
log.Println("listening on", cfg.ListenAddress)
if err := fasthttp.ListenAndServe(*listen, p.RequestHandler); err != nil {
if err := fasthttp.ListenAndServe(cfg.ListenAddress, p.RequestHandler); err != nil {
log.Fatal("Error in ListenAndServe:", err)
}
}