-
Notifications
You must be signed in to change notification settings - Fork 4.5k
/
headers.go
142 lines (112 loc) · 2.95 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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
package protocol
import (
"runtime"
"v2ray.com/core/common/buf"
"v2ray.com/core/common/net"
"v2ray.com/core/common/uuid"
)
type RequestCommand byte
const (
RequestCommandTCP = RequestCommand(0x01)
RequestCommandUDP = RequestCommand(0x02)
)
// 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)
// RequestOptionCompressedStream indicates request payload is compressed.
RequestOptionCompressedStream = 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))
}
type SessionFrameOption byte
const (
SessionFrameOptionDefault SessionFrameOption = 0x00
SessionFrameOptionNew SessionFrameOption = 0x01
SessionFrameOptionContinue SessionFrameOption = 0x02
SessionFrameOptionEnd SessionFrameOption = 0x03
)
type SessionId uint32
const (
DefaultSessionId SessionId = 0
)
type SessionFrame struct {
Id SessionId
Option SessionFrameOption
Address net.Address
Port net.Port
Payload *buf.Buffer
}