package sliderule

import (
	"crypto/tls"
	"net"
	"net/url"
)

// Request represents a request over any small web protocol.
//
// Because protocols have so many differences, this type represents a
// greatest common denominator of request/response-oriented protocols.
type Request struct {
	// URL is the specific URL being fetched by the request.
	*url.URL

	// Server is the server which received the request.
	//
	// This is only populated in servers.
	// It is unused on the client end.
	Server Server

	// Meta is a place for opaque data.
	//
	// Look for helper methods in protocol packages to use it appropriately
	// for the protocol.
	Meta any

	// RemoteAddr is the address of the other side of the connection.
	//
	// This will be the server address for clients, or the connecting
	// client's address in servers.
	//
	// Be aware though that proxies (and reverse proxies) can confuse this.
	RemoteAddr net.Addr

	// TLSState contains information about the TLS encryption over the connection.
	//
	// This includes peer certificates and version information.
	TLSState *tls.ConnectionState
}

// UnescapedQuery performs %XX unescaping on the URL query segment.
//
// Like URL.Query(), it silently drops malformed %-encoded sequences.
func (req Request) UnescapedQuery() string {
	unescaped, _ := url.QueryUnescape(req.RawQuery)
	return unescaped
}