The exercise already allowed me to notice issues such as fields not being properly initialized by savers. This is one of the last steps before moving tracex away from the internal/netx package and into the internal package. See https://github.com/ooni/probe/issues/2121
		
			
				
	
	
		
			248 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			248 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package tracex
 | 
						|
 | 
						|
//
 | 
						|
// All the possible events
 | 
						|
//
 | 
						|
 | 
						|
import (
 | 
						|
	"crypto/x509"
 | 
						|
	"net/http"
 | 
						|
	"time"
 | 
						|
 | 
						|
	"github.com/ooni/probe-cli/v3/internal/netxlite"
 | 
						|
)
 | 
						|
 | 
						|
// Event is one of the events within a trace.
 | 
						|
type Event interface {
 | 
						|
	// Value returns the event value
 | 
						|
	Value() *EventValue
 | 
						|
 | 
						|
	// Name returns the event name
 | 
						|
	Name() string
 | 
						|
}
 | 
						|
 | 
						|
// EventTLSHandshakeStart is the beginning of the TLS handshake.
 | 
						|
type EventTLSHandshakeStart struct {
 | 
						|
	V *EventValue
 | 
						|
}
 | 
						|
 | 
						|
func (ev *EventTLSHandshakeStart) Value() *EventValue {
 | 
						|
	return ev.V
 | 
						|
}
 | 
						|
 | 
						|
func (ev *EventTLSHandshakeStart) Name() string {
 | 
						|
	return "tls_handshake_start"
 | 
						|
}
 | 
						|
 | 
						|
// EventTLSHandshakeDone is the end of the TLS handshake.
 | 
						|
type EventTLSHandshakeDone struct {
 | 
						|
	V *EventValue
 | 
						|
}
 | 
						|
 | 
						|
func (ev *EventTLSHandshakeDone) Value() *EventValue {
 | 
						|
	return ev.V
 | 
						|
}
 | 
						|
 | 
						|
func (ev *EventTLSHandshakeDone) Name() string {
 | 
						|
	return "tls_handshake_done"
 | 
						|
}
 | 
						|
 | 
						|
// EventResolveStart is the beginning of a DNS lookup operation.
 | 
						|
type EventResolveStart struct {
 | 
						|
	V *EventValue
 | 
						|
}
 | 
						|
 | 
						|
func (ev *EventResolveStart) Value() *EventValue {
 | 
						|
	return ev.V
 | 
						|
}
 | 
						|
 | 
						|
func (ev *EventResolveStart) Name() string {
 | 
						|
	return "resolve_start"
 | 
						|
}
 | 
						|
 | 
						|
// EventResolveDone is the end of a DNS lookup operation.
 | 
						|
type EventResolveDone struct {
 | 
						|
	V *EventValue
 | 
						|
}
 | 
						|
 | 
						|
func (ev *EventResolveDone) Value() *EventValue {
 | 
						|
	return ev.V
 | 
						|
}
 | 
						|
 | 
						|
func (ev *EventResolveDone) Name() string {
 | 
						|
	return "resolve_done"
 | 
						|
}
 | 
						|
 | 
						|
// EventDNSRoundTripStart is the start of a DNS round trip.
 | 
						|
type EventDNSRoundTripStart struct {
 | 
						|
	V *EventValue
 | 
						|
}
 | 
						|
 | 
						|
func (ev *EventDNSRoundTripStart) Value() *EventValue {
 | 
						|
	return ev.V
 | 
						|
}
 | 
						|
 | 
						|
func (ev *EventDNSRoundTripStart) Name() string {
 | 
						|
	return "dns_round_trip_start"
 | 
						|
}
 | 
						|
 | 
						|
// EventDNSRoundTripDone is the end of a DNS round trip.
 | 
						|
type EventDNSRoundTripDone struct {
 | 
						|
	V *EventValue
 | 
						|
}
 | 
						|
 | 
						|
func (ev *EventDNSRoundTripDone) Value() *EventValue {
 | 
						|
	return ev.V
 | 
						|
}
 | 
						|
 | 
						|
func (ev *EventDNSRoundTripDone) Name() string {
 | 
						|
	return "dns_round_trip_done"
 | 
						|
}
 | 
						|
 | 
						|
// EventQUICHandshakeStart is the start of a QUIC handshake.
 | 
						|
type EventQUICHandshakeStart struct {
 | 
						|
	V *EventValue
 | 
						|
}
 | 
						|
 | 
						|
func (ev *EventQUICHandshakeStart) Value() *EventValue {
 | 
						|
	return ev.V
 | 
						|
}
 | 
						|
 | 
						|
func (ev *EventQUICHandshakeStart) Name() string {
 | 
						|
	return "quic_handshake_start"
 | 
						|
}
 | 
						|
 | 
						|
// EventQUICHandshakeDone is the end of a QUIC handshake.
 | 
						|
type EventQUICHandshakeDone struct {
 | 
						|
	V *EventValue
 | 
						|
}
 | 
						|
 | 
						|
func (ev *EventQUICHandshakeDone) Value() *EventValue {
 | 
						|
	return ev.V
 | 
						|
}
 | 
						|
 | 
						|
func (ev *EventQUICHandshakeDone) Name() string {
 | 
						|
	return "quic_handshake_done"
 | 
						|
}
 | 
						|
 | 
						|
// EventWriteToOperation summarizes the WriteTo operation.
 | 
						|
type EventWriteToOperation struct {
 | 
						|
	V *EventValue
 | 
						|
}
 | 
						|
 | 
						|
func (ev *EventWriteToOperation) Value() *EventValue {
 | 
						|
	return ev.V
 | 
						|
}
 | 
						|
 | 
						|
func (ev *EventWriteToOperation) Name() string {
 | 
						|
	return netxlite.WriteToOperation
 | 
						|
}
 | 
						|
 | 
						|
// EventReadFromOperation summarizes the ReadFrom operation.
 | 
						|
type EventReadFromOperation struct {
 | 
						|
	V *EventValue
 | 
						|
}
 | 
						|
 | 
						|
func (ev *EventReadFromOperation) Value() *EventValue {
 | 
						|
	return ev.V
 | 
						|
}
 | 
						|
 | 
						|
func (ev *EventReadFromOperation) Name() string {
 | 
						|
	return netxlite.ReadFromOperation
 | 
						|
}
 | 
						|
 | 
						|
// EventHTTPTransactionStart is the beginning of an HTTP transaction.
 | 
						|
type EventHTTPTransactionStart struct {
 | 
						|
	V *EventValue
 | 
						|
}
 | 
						|
 | 
						|
func (ev *EventHTTPTransactionStart) Value() *EventValue {
 | 
						|
	return ev.V
 | 
						|
}
 | 
						|
 | 
						|
func (ev *EventHTTPTransactionStart) Name() string {
 | 
						|
	return "http_transaction_start"
 | 
						|
}
 | 
						|
 | 
						|
// EventHTTPTransactionDone is the end of an HTTP transaction.
 | 
						|
type EventHTTPTransactionDone struct {
 | 
						|
	V *EventValue
 | 
						|
}
 | 
						|
 | 
						|
func (ev *EventHTTPTransactionDone) Value() *EventValue {
 | 
						|
	return ev.V
 | 
						|
}
 | 
						|
 | 
						|
func (ev *EventHTTPTransactionDone) Name() string {
 | 
						|
	return "http_transaction_done"
 | 
						|
}
 | 
						|
 | 
						|
// EventConnectOperation contains information about the connect operation.
 | 
						|
type EventConnectOperation struct {
 | 
						|
	V *EventValue
 | 
						|
}
 | 
						|
 | 
						|
func (ev *EventConnectOperation) Value() *EventValue {
 | 
						|
	return ev.V
 | 
						|
}
 | 
						|
 | 
						|
func (ev *EventConnectOperation) Name() string {
 | 
						|
	return netxlite.ConnectOperation
 | 
						|
}
 | 
						|
 | 
						|
// EventReadOperation contains information about a read operation.
 | 
						|
type EventReadOperation struct {
 | 
						|
	V *EventValue
 | 
						|
}
 | 
						|
 | 
						|
func (ev *EventReadOperation) Value() *EventValue {
 | 
						|
	return ev.V
 | 
						|
}
 | 
						|
 | 
						|
func (ev *EventReadOperation) Name() string {
 | 
						|
	return netxlite.ReadOperation
 | 
						|
}
 | 
						|
 | 
						|
// EventWriteOperation contains information about a write operation.
 | 
						|
type EventWriteOperation struct {
 | 
						|
	V *EventValue
 | 
						|
}
 | 
						|
 | 
						|
func (ev *EventWriteOperation) Value() *EventValue {
 | 
						|
	return ev.V
 | 
						|
}
 | 
						|
 | 
						|
func (ev *EventWriteOperation) Name() string {
 | 
						|
	return netxlite.WriteOperation
 | 
						|
}
 | 
						|
 | 
						|
// Event is one of the events within a trace
 | 
						|
type EventValue struct {
 | 
						|
	Addresses                   []string            `json:",omitempty"`
 | 
						|
	Address                     string              `json:",omitempty"`
 | 
						|
	DNSQuery                    []byte              `json:",omitempty"`
 | 
						|
	DNSResponse                 []byte              `json:",omitempty"`
 | 
						|
	Data                        []byte              `json:",omitempty"`
 | 
						|
	Duration                    time.Duration       `json:",omitempty"`
 | 
						|
	Err                         error               `json:",omitempty"`
 | 
						|
	HTTPMethod                  string              `json:",omitempty"`
 | 
						|
	HTTPRequestHeaders          http.Header         `json:",omitempty"`
 | 
						|
	HTTPResponseHeaders         http.Header         `json:",omitempty"`
 | 
						|
	HTTPResponseBody            []byte              `json:",omitempty"`
 | 
						|
	HTTPResponseBodyIsTruncated bool                `json:",omitempty"`
 | 
						|
	HTTPStatusCode              int                 `json:",omitempty"`
 | 
						|
	HTTPURL                     string              `json:",omitempty"`
 | 
						|
	Hostname                    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"`
 | 
						|
}
 |