Files
natpass/code/client/conn/send_code.go
2022-07-25 17:55:41 +08:00

101 lines
2.2 KiB
Go

package conn
import (
"net/http"
"time"
"github.com/lwch/natpass/code/network"
"google.golang.org/protobuf/proto"
)
func makeCodeHeader(header http.Header) map[string]*network.CodeHeaderValues {
ret := make(map[string]*network.CodeHeaderValues)
for key, values := range header {
data := make([]string, len(values))
copy(data, values)
ret[key] = &network.CodeHeaderValues{
Values: data,
}
}
return ret
}
// SendCodeRequest send request
func (conn *Conn) SendCodeRequest(to, linkID string, requestID uint64,
method, uri string, body []byte, header http.Header) uint64 {
var msg network.Msg
msg.To = to
msg.XType = network.Msg_code_request
msg.LinkId = linkID
msg.Payload = &network.Msg_Csreq{
Csreq: &network.CodeRequest{
RequestId: requestID,
Method: method,
Uri: uri,
Body: body,
Header: makeCodeHeader(header),
},
}
select {
case conn.write <- &msg:
data, _ := proto.Marshal(&msg)
return uint64(len(data))
case <-time.After(conn.cfg.WriteTimeout):
return 0
}
}
// SendCodeResponseHeader send response header
func (conn *Conn) SendCodeResponseHeader(to, linkID string, requestID uint64,
code uint32, header http.Header) uint64 {
var msg network.Msg
msg.To = to
msg.XType = network.Msg_code_response_hdr
msg.LinkId = linkID
msg.Payload = &network.Msg_CsrepHdr{
CsrepHdr: &network.CodeResponseHeader{
RequestId: requestID,
Code: code,
Header: makeCodeHeader(header),
},
}
select {
case conn.write <- &msg:
data, _ := proto.Marshal(&msg)
return uint64(len(data))
case <-time.After(conn.cfg.WriteTimeout):
return 0
}
}
// SendCodeResponseBody send response body
func (conn *Conn) SendCodeResponseBody(to, linkID string, requestID uint64,
idx uint32, ok, done bool, data []byte) uint64 {
var mask uint32
if ok {
mask |= 1
}
if done {
mask |= 2
}
var msg network.Msg
msg.To = to
msg.XType = network.Msg_code_response_body
msg.LinkId = linkID
msg.Payload = &network.Msg_CsrepBody{
CsrepBody: &network.CodeResponseBody{
RequestId: requestID,
Index: idx,
Mask: mask,
Body: data,
},
}
select {
case conn.write <- &msg:
data, _ := proto.Marshal(&msg)
return uint64(len(data))
case <-time.After(conn.cfg.WriteTimeout):
return 0
}
}