Pārlūkot izejas kodu

enhance: port handling in site indexing

Jacky 3 mēneši atpakaļ
vecāks
revīzija
b5ee43b2b0
1 mainītis faili ar 47 papildinājumiem un 11 dzēšanām
  1. 47 11
      internal/site/index.go

+ 47 - 11
internal/site/index.go

@@ -4,6 +4,7 @@ import (
 	"net"
 	"path/filepath"
 	"regexp"
+	"strconv"
 	"strings"
 
 	"github.com/0xJacky/Nginx-UI/internal/cache"
@@ -45,8 +46,12 @@ func scanForSite(configPath string, content []byte) error {
 		Urls:    []string{},
 	}
 
-	// Map to track hosts and their SSL status
-	hostMap := make(map[string]bool)
+	// Map to track hosts, their SSL status and port
+	type hostInfo struct {
+		hasSSL bool
+		port   int
+	}
+	hostMap := make(map[string]hostInfo)
 
 	for _, block := range serverBlocks {
 		serverBlockContent := block[0]
@@ -84,36 +89,67 @@ func scanForSite(configPath string, content []byte) error {
 			continue
 		}
 
-		// Check if SSL is enabled
+		// Check if SSL is enabled and extract port
 		listenMatches := listenRegex.FindAllSubmatch(serverBlockContent, -1)
 		hasSSL := false
+		port := 80 // Default HTTP port
 
 		for _, match := range listenMatches {
 			if len(match) >= 2 {
 				listenValue := string(match[1])
-				if strings.Contains(listenValue, "ssl") || strings.Contains(listenValue, "443") {
+				if strings.Contains(listenValue, "ssl") {
 					hasSSL = true
-					break
+					port = 443 // Default HTTPS port
+				}
+
+				// Extract port number if present
+				portRegex := regexp.MustCompile(`^(?:(\d+)|.*:(\d+))`)
+				portMatches := portRegex.FindStringSubmatch(listenValue)
+				if len(portMatches) > 0 {
+					// Check which capture group has the port
+					portStr := ""
+					if portMatches[1] != "" {
+						portStr = portMatches[1]
+					} else if portMatches[2] != "" {
+						portStr = portMatches[2]
+					}
+
+					if portStr != "" {
+						if extractedPort, err := strconv.Atoi(portStr); err == nil {
+							port = extractedPort
+						}
+					}
 				}
 			}
 		}
 
-		// Update host map with SSL status
+		// Update host map with SSL status and port
 		for _, name := range validServerNames {
-			// Only update if this host doesn't have SSL yet
-			if currentSSL, exists := hostMap[name]; !exists || !currentSSL {
-				hostMap[name] = hasSSL
+			// Only update if this host doesn't have SSL yet or we're adding SSL now
+			info, exists := hostMap[name]
+			if !exists || (!info.hasSSL && hasSSL) {
+				hostMap[name] = hostInfo{hasSSL: hasSSL, port: port}
 			}
 		}
 	}
 
 	// Generate URLs from the host map
-	for host, hasSSL := range hostMap {
+	for host, info := range hostMap {
 		protocol := "http"
-		if hasSSL {
+		defaultPort := 80
+
+		if info.hasSSL {
 			protocol = "https"
+			defaultPort = 443
 		}
+
 		url := protocol + "://" + host
+
+		// Add port to URL if non-standard
+		if info.port != defaultPort {
+			url += ":" + strconv.Itoa(info.port)
+		}
+
 		siteIndex.Urls = append(siteIndex.Urls, url)
 	}