fix ASN.1 container parsing

This commit is contained in:
Trolli Schmittlauch 2020-05-08 17:15:40 +02:00
parent 2f10ea6628
commit 91bb72cb57

View file

@ -201,7 +201,7 @@ encodePayload payload'@QueryIDResponsePayload{} =
Start Sequence
: encodeQueryResult resp
: case resp of
FOUND _ -> []
FOUND ns -> encodeNodeState $ ns
FORWARD entrySet ->
Start Sequence
: (concatMap encodeCacheEntry . Set.elems $ entrySet)
@ -314,8 +314,7 @@ parseRequest action = do
sender <- parseNodeState
parts <- parseInteger
part <- parseInteger
payload <- onNextContainer Sequence $
case action of
payload <- case action of
QueryID -> parseQueryIDRequest
Join -> parseJoinRequest
Leave -> parseLeaveRequest
@ -330,18 +329,12 @@ parseResponse responseTo = do
parts <- parseInteger
part <- parseInteger
action <- parseEnum :: ParseASN1 Action
payload <- onNextContainer Sequence $
case action of
payload <- case action of
QueryID -> parseQueryIDResponse
Join -> parseJoinResponse
Leave -> parseLeaveResponse
Stabilise -> parseStabiliseResponse
Ping -> parsePingResponse
-- consume sequence end
end <- getNext
case end of
End Sequence -> return ()
x -> throwParseError $ "unexpected ASN.1 element " ++ show x
return $ Response responseTo senderID parts part action payload
@ -414,7 +407,7 @@ parseJoinRequest = do
return JoinRequestPayload
parseJoinResponse :: ParseASN1 ActionPayload
parseJoinResponse = do
parseJoinResponse = onNextContainer Sequence $ do
succ' <- map fromInteger <$> onNextContainer Sequence (getMany parseInteger)
pred' <- map fromInteger <$> onNextContainer Sequence (getMany parseInteger)
cache <- parseNodeCache
@ -425,7 +418,7 @@ parseJoinResponse = do
}
parseQueryIDRequest :: ParseASN1 ActionPayload
parseQueryIDRequest = do
parseQueryIDRequest = onNextContainer Sequence $ do
targetID <- fromInteger <$> parseInteger
lBestNodes <- parseInteger
return $ QueryIDRequestPayload {
@ -434,7 +427,7 @@ parseQueryIDRequest = do
}
parseQueryIDResponse :: ParseASN1 ActionPayload
parseQueryIDResponse = do
parseQueryIDResponse = onNextContainer Sequence $ do
Enumerated resultType <- getNext
result <- case resultType of
0 -> FOUND <$> parseNodeState
@ -450,7 +443,7 @@ parseStabiliseRequest = do
return StabiliseRequestPayload
parseStabiliseResponse :: ParseASN1 ActionPayload
parseStabiliseResponse = do
parseStabiliseResponse = onNextContainer Sequence $ do
succ' <- map fromInteger <$> onNextContainer Sequence (getMany parseInteger)
pred' <- map fromInteger <$> onNextContainer Sequence (getMany parseInteger)
return $ StabiliseResponsePayload {
@ -459,7 +452,7 @@ parseStabiliseResponse = do
}
parseLeaveRequest :: ParseASN1 ActionPayload
parseLeaveRequest = do
parseLeaveRequest = onNextContainer Sequence $ do
succ' <- map fromInteger <$> onNextContainer Sequence (getMany parseInteger)
pred' <- map fromInteger <$> onNextContainer Sequence (getMany parseInteger)
return $ LeaveRequestPayload {
@ -478,7 +471,7 @@ parsePingRequest = do
return PingRequestPayload
parsePingResponse :: ParseASN1 ActionPayload
parsePingResponse = do
parsePingResponse = onNextContainer Sequence $ do
handledNodes <- getMany parseNodeState
return $ PingResponsePayload {
pingNodeStates = handledNodes