58adb68b2c
* refactor: move tracex outside of engine/netx Consistently with https://github.com/ooni/probe/issues/2121 and https://github.com/ooni/probe/issues/2115, we can now move tracex outside of engine/netx. The main reason why this makes sense now is that the package is now changed significantly from the one that we imported from ooni/probe-engine. We have improved its implementation, which had not been touched significantly for quite some time, and converted it to unit testing. I will document tomorrow some extra work I'd like to do with this package but likely could not do $soon. * go fmt * regen tutorials
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"`
|
|
}
|