Files
PDTeamX afd5951875 fix: switch port when falling back between HTTP/HTTPS protocols
- When falling back from HTTPS to HTTP on port 443, now switches to port 80
- When falling back from HTTP to HTTPS on port 80, now switches to port 443
- Prevents 'plain HTTP request sent to HTTPS port' errors during fallback
- Added test cases for determineMostLikelySchemeOrder and port fallback logic
2025-12-07 00:57:12 +05:30

116 lines
2.9 KiB
Go

package runner
import (
"testing"
"github.com/projectdiscovery/httpx/common/httpx"
"github.com/stretchr/testify/require"
)
func TestDetermineMostLikelySchemeOrder(t *testing.T) {
tests := []struct {
name string
input string
expected string
}{
{
name: "port 80 should return HTTP",
input: "example.com:80",
expected: httpx.HTTP,
},
{
name: "port 8080 should return HTTP",
input: "example.com:8080",
expected: httpx.HTTP,
},
{
name: "port 443 should return HTTPS",
input: "example.com:443",
expected: httpx.HTTPS,
},
{
name: "port 8443 should return HTTP (port > 1024)",
input: "example.com:8443",
expected: httpx.HTTP,
},
{
name: "no port should return HTTPS",
input: "example.com",
expected: httpx.HTTPS,
},
{
name: "port 443 with IP should return HTTPS",
input: "1.2.3.4:443",
expected: httpx.HTTPS,
},
{
name: "port 80 with IP should return HTTP",
input: "1.2.3.4:80",
expected: httpx.HTTP,
},
}
for _, tc := range tests {
t.Run(tc.name, func(t *testing.T) {
result := determineMostLikelySchemeOrder(tc.input)
require.Equal(t, tc.expected, result, "unexpected scheme for input %s", tc.input)
})
}
}
func TestSwitchPortForFallback(t *testing.T) {
// Test that when switching from HTTPS to HTTP on port 443, port should become 80
// And when switching from HTTP to HTTPS on port 80, port should become 443
tests := []struct {
name string
inputPort string
inputProtocol string
expectedNewPort string
}{
{
name: "HTTPS:443 fallback should switch to port 80",
inputPort: "443",
inputProtocol: httpx.HTTPS,
expectedNewPort: "80",
},
{
name: "HTTP:80 fallback should switch to port 443",
inputPort: "80",
inputProtocol: httpx.HTTP,
expectedNewPort: "443",
},
{
name: "HTTPS:8443 fallback should keep port 8443",
inputPort: "8443",
inputProtocol: httpx.HTTPS,
expectedNewPort: "8443", // non-default port stays the same
},
{
name: "HTTP:8080 fallback should keep port 8080",
inputPort: "8080",
inputProtocol: httpx.HTTP,
expectedNewPort: "8080", // non-default port stays the same
},
}
for _, tc := range tests {
t.Run(tc.name, func(t *testing.T) {
newPort := getPortForFallback(tc.inputPort, tc.inputProtocol)
require.Equal(t, tc.expectedNewPort, newPort, "unexpected port for fallback")
})
}
}
// getPortForFallback returns the port to use when falling back to the other protocol
// This is the logic used in runner.go analyze function
func getPortForFallback(currentPort, currentProtocol string) string {
if currentProtocol == httpx.HTTPS && currentPort == "443" {
return "80"
}
if currentProtocol == httpx.HTTP && currentPort == "80" {
return "443"
}
return currentPort
}