-
Notifications
You must be signed in to change notification settings - Fork 0
/
headers.go
127 lines (100 loc) · 2.63 KB
/
headers.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
package protocol
import (
"runtime"
"v2ray.com/core/common/net"
"v2ray.com/core/common/uuid"
)
// RequestCommand is a custom command in a proxy request.
type RequestCommand byte
const (
RequestCommandTCP = RequestCommand(0x01)
RequestCommandUDP = RequestCommand(0x02)
RequestCommandMux = RequestCommand(0x03)
)
func (c RequestCommand) TransferType() TransferType {
if c == RequestCommandTCP {
return TransferTypeStream
}
return TransferTypePacket
}
// RequestOption is the options of a request.
type RequestOption byte
const (
// RequestOptionChunkStream indicates request payload is chunked. Each chunk consists of length, authentication and payload.
RequestOptionChunkStream = RequestOption(0x01)
// RequestOptionConnectionReuse indicates client side expects to reuse the connection.
RequestOptionConnectionReuse = RequestOption(0x02)
RequestOptionChunkMasking = RequestOption(0x04)
)
func (v RequestOption) Has(option RequestOption) bool {
return (v & option) == option
}
func (v *RequestOption) Set(option RequestOption) {
*v = (*v | option)
}
func (v *RequestOption) Clear(option RequestOption) {
*v = (*v & (^option))
}
type Security byte
func (v Security) Is(t SecurityType) bool {
return v == Security(t)
}
func NormSecurity(s Security) Security {
if s.Is(SecurityType_UNKNOWN) {
return Security(SecurityType_LEGACY)
}
return s
}
type RequestHeader struct {
Version byte
Command RequestCommand
Option RequestOption
Security Security
Port net.Port
Address net.Address
User *User
}
func (v *RequestHeader) Destination() net.Destination {
if v.Command == RequestCommandUDP {
return net.UDPDestination(v.Address, v.Port)
}
return net.TCPDestination(v.Address, v.Port)
}
type ResponseOption byte
const (
ResponseOptionConnectionReuse = ResponseOption(0x01)
)
func (v *ResponseOption) Set(option ResponseOption) {
*v = (*v | option)
}
func (v ResponseOption) Has(option ResponseOption) bool {
return (v & option) == option
}
func (v *ResponseOption) Clear(option ResponseOption) {
*v = (*v & (^option))
}
type ResponseCommand interface{}
type ResponseHeader struct {
Option ResponseOption
Command ResponseCommand
}
type CommandSwitchAccount struct {
Host net.Address
Port net.Port
ID *uuid.UUID
AlterIds uint16
Level uint32
ValidMin byte
}
func (v *SecurityConfig) AsSecurity() Security {
if v == nil {
return Security(SecurityType_LEGACY)
}
if v.Type == SecurityType_AUTO {
if runtime.GOARCH == "amd64" || runtime.GOARCH == "s390x" {
return Security(SecurityType_AES128_GCM)
}
return Security(SecurityType_CHACHA20_POLY1305)
}
return NormSecurity(Security(v.Type))
}