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

Loading…
Cancel
Save