MCPcopy Create free account
hub / github.com/TheThingsNetwork/lorawan-stack / handle

Method handle

pkg/interop/server.go:183–279  ·  view source on GitHub ↗
()

Source from the content-addressed store, hash-verified

181}
182
183func (s *Server) handle() http.Handler {
184 senderAuthenticators := map[MessageType]senderAuthenticator{
185 MessageTypeJoinReq: senderAuthenticatorFunc(s.authenticateNS),
186 MessageTypeRejoinReq: senderAuthenticatorFunc(s.authenticateNS),
187 MessageTypeAppSKeyReq: senderAuthenticatorFunc(s.authenticateAS),
188 MessageTypeHomeNSReq: senderAuthenticatorFunc(s.authenticateNS),
189 }
190
191 return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
192 cid := fmt.Sprintf("interop:%s", r.Header.Get("X-Request-ID"))
193 ctx := events.ContextWithCorrelationID(r.Context(), cid)
194 logger := log.FromContext(ctx)
195
196 data, err := io.ReadAll(r.Body)
197 if err != nil {
198 logger.WithError(err).Debug("Failed to read body")
199 w.WriteHeader(http.StatusBadRequest)
200 return
201 }
202
203 var header MessageHeader
204 if err := json.Unmarshal(data, &header); err != nil {
205 logger.WithError(err).Debug("Failed to unmarshal body")
206 w.WriteHeader(http.StatusBadRequest)
207 return
208 }
209
210 logger = logger.WithFields(log.Fields(
211 "message_type", header.MessageType,
212 "protocol_version", header.ProtocolVersion,
213 "sender_id", header.SenderID,
214 "receiver_id", header.ReceiverID,
215 ))
216 ctx = log.NewContext(ctx, logger)
217
218 if err := header.MessageType.Validate(header.ProtocolVersion); err != nil {
219 logger.WithError(err).Debug("Invalid protocol version or message type")
220 writeError(w, r, header, err)
221 return
222 }
223
224 senderAuthenticator, ok := senderAuthenticators[header.MessageType]
225 if !ok {
226 writeError(w, r, header, ErrMalformedMessage.New())
227 return
228 }
229 ctx, err = senderAuthenticator.Authenticate(ctx, r, data)
230 if err != nil {
231 logRPCError(logger, err, "Failed to authenticate")
232 writeError(w, r, header, err)
233 return
234 }
235
236 var msg any
237 switch header.MessageType {
238 case MessageTypeJoinReq, MessageTypeRejoinReq:
239 msg = &JoinReq{}
240 case MessageTypeAppSKeyReq:

Callers 1

NewServerFunction · 0.95

Calls 15

ContextWithCorrelationIDFunction · 0.92
FromContextFunction · 0.92
FieldsFunction · 0.92
NewContextFunction · 0.92
senderAuthenticatorFuncFuncType · 0.85
logRPCErrorFunction · 0.85
NewEncoderMethod · 0.80
writeErrorFunction · 0.70
GetMethod · 0.65
ContextMethod · 0.65
DebugMethod · 0.65
WithErrorMethod · 0.65

Tested by

no test coverage detected