MCPcopy
hub / github.com/OpenNHP/opennhp / handleNhpOpenResource

Method handleNhpOpenResource

endpoints/server/udpserver.go:1053–1138  ·  view source on GitHub ↗
(req *common.NhpAuthRequest, res *common.ResourceData)

Source from the content-addressed store, hash-verified

1051}
1052
1053func (s *UdpServer) handleNhpOpenResource(req *common.NhpAuthRequest, res *common.ResourceData) (ackMsg *common.ServerKnockAckMsg, err error) {
1054 knkMsg := req.Msg
1055 srcAddr := req.SrcAddr
1056 addrStr := srcAddr.String()
1057 ackMsg = req.Ack
1058
1059 acDstIpMap := make(map[string][]*common.NetAddress)
1060 for resName, info := range res.Resources {
1061 addrs, exist := acDstIpMap[resName]
1062 if exist {
1063 addrs = append(addrs, info.Addr)
1064 acDstIpMap[resName] = addrs
1065 } else {
1066 acDstIpMap[resName] = []*common.NetAddress{info.Addr}
1067 }
1068 }
1069
1070 // PART III: request ac operation for each resource and block for response
1071 var acWg sync.WaitGroup
1072 var artMsgsMutex sync.Mutex
1073 artMsgs := make(map[string]*common.ACOpsResultMsg)
1074 ackMsg.ResourceHost = make(map[string]string)
1075 ackMsg.ACTokens = make(map[string]string)
1076 ackMsg.PreAccessActions = make(map[string]*common.PreAccessInfo)
1077
1078 for resName, addrs := range acDstIpMap {
1079 resInfo := res.Resources[resName]
1080 if resInfo == nil {
1081 continue
1082 }
1083 acId := resInfo.ACId
1084 s.acConnectionMapMutex.Lock()
1085 acConn, found := s.acConnectionMap[acId]
1086 s.acConnectionMapMutex.Unlock()
1087 if !found {
1088 log.Warning("server-agent(%s@%s)-ac(@%s)[handleNhpOpenResource] no ac connection is available", knkMsg.UserId, addrStr, acId)
1089 artMsg := &common.ACOpsResultMsg{}
1090 err = common.ErrACConnectionNotFound
1091 artMsg.ErrCode = common.ErrACConnectionNotFound.ErrorCode()
1092 artMsg.ErrMsg = err.Error()
1093 artMsgsMutex.Lock()
1094 artMsgs[resName] = artMsg
1095 artMsgsMutex.Unlock()
1096 continue
1097 }
1098
1099 acWg.Add(1)
1100 go func(name string, info *common.ResourceInfo, dstAddrs []*common.NetAddress) {
1101 defer acWg.Done()
1102
1103 openTime := res.OpenTime
1104 if knkMsg.HeaderType == core.NHP_EXT {
1105 openTime = 1 // timeout in 1 second
1106 }
1107 artMsg, err := s.processACOperation(knkMsg, acConn, srcAddr, dstAddrs, openTime)
1108 artMsgsMutex.Lock()
1109 artMsgs[name] = artMsg
1110 if err == nil {

Callers 1

NewNhpServerHelperMethod · 0.95

Calls 6

processACOperationMethod · 0.95
DestHostMethod · 0.80
ErrorCodeMethod · 0.65
ErrorMethod · 0.65
AddMethod · 0.65
StringMethod · 0.45

Tested by

no test coverage detected