Fix priority bug

master
Regela 3 months ago
parent 2494a21d4f
commit a05f82a9eb
  1. 5
      go.mod
  2. 52
      src/main.go

@ -0,0 +1,5 @@
module RegelaHttpsBalancer
go 1.22.5
require github.com/goccy/go-yaml v1.14.3

@ -4,7 +4,6 @@ import (
"flag" "flag"
"fmt" "fmt"
"github.com/goccy/go-yaml" "github.com/goccy/go-yaml"
"io/ioutil"
"log" "log"
"net" "net"
"os" "os"
@ -12,9 +11,9 @@ import (
"time" "time"
) )
type Rule struct{ type Rule struct {
Host string Host string
Ip string Ip string
} }
type Listener struct { type Listener struct {
@ -25,18 +24,18 @@ type Listener struct {
DefaultIp string DefaultIp string
} }
type Settings struct{ type Settings struct {
Listeners []Listener Listeners []Listener
} }
func printExample() { func printExample() {
settings := Settings{ settings := Settings{
Listeners:[]Listener{ Listeners: []Listener{
{ {
ListenAddress: "0.0.0.0:1443", ListenAddress: "0.0.0.0:1443",
Protocol: "tcp", Protocol: "tcp",
PacketType: "https", PacketType: "https",
Rules: []Rule{ Rules: []Rule{
{ {
Host: "host1.ru", Host: "host1.ru",
Ip: "10.10.0.50:443", Ip: "10.10.0.50:443",
@ -51,8 +50,8 @@ func printExample() {
{ {
ListenAddress: "0.0.0.0:1080", ListenAddress: "0.0.0.0:1080",
Protocol: "tcp", Protocol: "tcp",
PacketType: "http", PacketType: "http",
Rules: []Rule{ Rules: []Rule{
{ {
Host: "host1.ru", Host: "host1.ru",
Ip: "10.10.0.50:80", Ip: "10.10.0.50:80",
@ -67,11 +66,13 @@ func printExample() {
}, },
} }
out, _ := yaml.Marshal(settings) out, _ := yaml.Marshal(settings)
fmt.Printf("%s",out) fmt.Printf("%s", out)
} }
var settings Settings var settings Settings
func main(){
printExampleFlag := flag.Bool("example",false,"") func main() {
printExampleFlag := flag.Bool("example", false, "")
ConfigFile := flag.String("i", "none", "/path/to/config/file.yml") ConfigFile := flag.String("i", "none", "/path/to/config/file.yml")
flag.Parse() flag.Parse()
@ -80,13 +81,13 @@ func main(){
os.Exit(0) os.Exit(0)
} }
cf, err := ioutil.ReadFile(*ConfigFile) cf, err := os.ReadFile(*ConfigFile)
if err != nil { if err != nil {
log.Fatalf("Read configuration error: %s", err.Error()) log.Fatalf("Read configuration error: %s", err.Error())
} }
err = yaml.Unmarshal(cf,&settings) err = yaml.Unmarshal(cf, &settings)
for _, listener := range settings.Listeners{ for _, listener := range settings.Listeners {
go listen(listener) go listen(listener)
} }
for { for {
@ -94,7 +95,7 @@ func main(){
} }
} }
func listen(listener Listener){ func listen(listener Listener) {
log.Println(listener.Protocol, listener.ListenAddress) log.Println(listener.Protocol, listener.ListenAddress)
ln, err := net.Listen(listener.Protocol, listener.ListenAddress) ln, err := net.Listen(listener.Protocol, listener.ListenAddress)
if err != nil { if err != nil {
@ -114,30 +115,31 @@ func listen(listener Listener){
func handleConnection(conn net.Conn, listener Listener) { func handleConnection(conn net.Conn, listener Listener) {
var b = make([]byte, 1024*128) var b = make([]byte, 1024*128)
n, err := conn.Read(b) n, err := conn.Read(b)
if err != nil{ if err != nil {
log.Println(err) log.Println(err)
return return
} }
var conn2 net.Conn var conn2 net.Conn
finded := false finded := false
for _, rule := range listener.Rules{ for _, rule := range listener.Rules {
if strings.Contains(string(b),rule.Host) { if strings.Contains(string(b), rule.Host) {
finded = true finded = true
conn2, err = net.Dial(listener.Protocol, rule.Ip) conn2, err = net.Dial(listener.Protocol, rule.Ip)
fmt.Println(rule.Host) fmt.Println(rule.Host)
break
} }
} }
if !finded { if !finded {
conn2, err = net.Dial(listener.Protocol, listener.DefaultIp) conn2, err = net.Dial(listener.Protocol, listener.DefaultIp)
fmt.Println("Default") fmt.Println("Default")
} }
if err != nil{ if err != nil {
log.Println(err) log.Println(err)
return return
} }
_, err = conn2.Write(b[:n]) _, err = conn2.Write(b[:n])
if err != nil{ if err != nil {
log.Println(err) log.Println(err)
return return
} }
@ -145,19 +147,19 @@ func handleConnection(conn net.Conn, listener Listener) {
go connToConn(conn2, conn) go connToConn(conn2, conn)
} }
func connToConn(conn1 net.Conn,conn2 net.Conn){ func connToConn(conn1 net.Conn, conn2 net.Conn) {
defer conn1.Close() defer conn1.Close()
defer conn2.Close() defer conn2.Close()
var b = make([]byte, 1024*128) var b = make([]byte, 1024*128)
for { for {
n, err := conn1.Read(b) n, err := conn1.Read(b)
if err != nil{ if err != nil {
log.Println(err.Error()) log.Println(err.Error())
break break
} }
_, err = conn2.Write(b[:n]) _, err = conn2.Write(b[:n])
if err != nil{ if err != nil {
log.Println(err.Error()) log.Println(err.Error())
break break
} }

Loading…
Cancel
Save