mirror of
https://github.com/projectdiscovery/httpx
synced 2026-06-08 16:50:17 +00:00
afd5951875
- 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
116 lines
2.9 KiB
Go
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
|
|
}
|
|
|