bbcd2e2280
This diff creates a new package under netx called tracex that contains everything we need to perform measurements using events tracing and postprocessing (which is the technique with which we implement most network experiments). The general idea here is to (1) create a unique package out of all of these packages; (2) clean up the code a bit (improve tests, docs, apply more recent code patterns); (3) move the resulting code as a toplevel package inside of internal. Once this is done, netx can be further refactored to avoid subpackages and we can search for more code to salvage/refactor. See https://github.com/ooni/probe/issues/2121
61 lines
2.5 KiB
Go
61 lines
2.5 KiB
Go
package tracex
|
|
|
|
import (
|
|
"crypto/tls"
|
|
"crypto/x509"
|
|
"errors"
|
|
"net/http"
|
|
"time"
|
|
)
|
|
|
|
// Event is one of the events within a trace
|
|
type Event struct {
|
|
Addresses []string `json:",omitempty"`
|
|
Address string `json:",omitempty"`
|
|
DNSQuery []byte `json:",omitempty"`
|
|
DNSReply []byte `json:",omitempty"`
|
|
DataIsTruncated bool `json:",omitempty"`
|
|
Data []byte `json:",omitempty"`
|
|
Duration time.Duration `json:",omitempty"`
|
|
Err error `json:",omitempty"`
|
|
HTTPHeaders http.Header `json:",omitempty"`
|
|
HTTPMethod string `json:",omitempty"`
|
|
HTTPStatusCode int `json:",omitempty"`
|
|
HTTPURL string `json:",omitempty"`
|
|
Hostname string `json:",omitempty"`
|
|
Name string `json:",omitempty"`
|
|
NoTLSVerify bool `json:",omitempty"`
|
|
NumBytes int `json:",omitempty"`
|
|
Proto string `json:",omitempty"`
|
|
TLSServerName string `json:",omitempty"`
|
|
TLSCipherSuite string `json:",omitempty"`
|
|
TLSNegotiatedProto string `json:",omitempty"`
|
|
TLSNextProtos []string `json:",omitempty"`
|
|
TLSPeerCerts []*x509.Certificate `json:",omitempty"`
|
|
TLSVersion string `json:",omitempty"`
|
|
Time time.Time `json:",omitempty"`
|
|
Transport string `json:",omitempty"`
|
|
}
|
|
|
|
// PeerCerts returns the certificates presented by the peer regardless
|
|
// of whether the TLS handshake was successful
|
|
func PeerCerts(state tls.ConnectionState, err error) []*x509.Certificate {
|
|
var x509HostnameError x509.HostnameError
|
|
if errors.As(err, &x509HostnameError) {
|
|
// Test case: https://wrong.host.badssl.com/
|
|
return []*x509.Certificate{x509HostnameError.Certificate}
|
|
}
|
|
var x509UnknownAuthorityError x509.UnknownAuthorityError
|
|
if errors.As(err, &x509UnknownAuthorityError) {
|
|
// Test case: https://self-signed.badssl.com/. This error has
|
|
// never been among the ones returned by MK.
|
|
return []*x509.Certificate{x509UnknownAuthorityError.Cert}
|
|
}
|
|
var x509CertificateInvalidError x509.CertificateInvalidError
|
|
if errors.As(err, &x509CertificateInvalidError) {
|
|
// Test case: https://expired.badssl.com/
|
|
return []*x509.Certificate{x509CertificateInvalidError.Cert}
|
|
}
|
|
return state.PeerCertificates
|
|
}
|