forked from schmittlauch/Hash2Pub
fix ASN.1 container parsing
This commit is contained in:
parent
2f10ea6628
commit
91bb72cb57
|
@ -201,7 +201,7 @@ encodePayload payload'@QueryIDResponsePayload{} =
|
||||||
Start Sequence
|
Start Sequence
|
||||||
: encodeQueryResult resp
|
: encodeQueryResult resp
|
||||||
: case resp of
|
: case resp of
|
||||||
FOUND _ -> []
|
FOUND ns -> encodeNodeState $ ns
|
||||||
FORWARD entrySet ->
|
FORWARD entrySet ->
|
||||||
Start Sequence
|
Start Sequence
|
||||||
: (concatMap encodeCacheEntry . Set.elems $ entrySet)
|
: (concatMap encodeCacheEntry . Set.elems $ entrySet)
|
||||||
|
@ -314,13 +314,12 @@ parseRequest action = do
|
||||||
sender <- parseNodeState
|
sender <- parseNodeState
|
||||||
parts <- parseInteger
|
parts <- parseInteger
|
||||||
part <- parseInteger
|
part <- parseInteger
|
||||||
payload <- onNextContainer Sequence $
|
payload <- case action of
|
||||||
case action of
|
QueryID -> parseQueryIDRequest
|
||||||
QueryID -> parseQueryIDRequest
|
Join -> parseJoinRequest
|
||||||
Join -> parseJoinRequest
|
Leave -> parseLeaveRequest
|
||||||
Leave -> parseLeaveRequest
|
Stabilise -> parseStabiliseRequest
|
||||||
Stabilise -> parseStabiliseRequest
|
Ping -> parsePingRequest
|
||||||
Ping -> parsePingRequest
|
|
||||||
|
|
||||||
return $ Request requestID sender parts part action payload
|
return $ Request requestID sender parts part action payload
|
||||||
|
|
||||||
|
@ -330,18 +329,12 @@ parseResponse responseTo = do
|
||||||
parts <- parseInteger
|
parts <- parseInteger
|
||||||
part <- parseInteger
|
part <- parseInteger
|
||||||
action <- parseEnum :: ParseASN1 Action
|
action <- parseEnum :: ParseASN1 Action
|
||||||
payload <- onNextContainer Sequence $
|
payload <- case action of
|
||||||
case action of
|
QueryID -> parseQueryIDResponse
|
||||||
QueryID -> parseQueryIDResponse
|
Join -> parseJoinResponse
|
||||||
Join -> parseJoinResponse
|
Leave -> parseLeaveResponse
|
||||||
Leave -> parseLeaveResponse
|
Stabilise -> parseStabiliseResponse
|
||||||
Stabilise -> parseStabiliseResponse
|
Ping -> parsePingResponse
|
||||||
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
|
return $ Response responseTo senderID parts part action payload
|
||||||
|
|
||||||
|
@ -414,7 +407,7 @@ parseJoinRequest = do
|
||||||
return JoinRequestPayload
|
return JoinRequestPayload
|
||||||
|
|
||||||
parseJoinResponse :: ParseASN1 ActionPayload
|
parseJoinResponse :: ParseASN1 ActionPayload
|
||||||
parseJoinResponse = do
|
parseJoinResponse = onNextContainer Sequence $ do
|
||||||
succ' <- map fromInteger <$> onNextContainer Sequence (getMany parseInteger)
|
succ' <- map fromInteger <$> onNextContainer Sequence (getMany parseInteger)
|
||||||
pred' <- map fromInteger <$> onNextContainer Sequence (getMany parseInteger)
|
pred' <- map fromInteger <$> onNextContainer Sequence (getMany parseInteger)
|
||||||
cache <- parseNodeCache
|
cache <- parseNodeCache
|
||||||
|
@ -425,7 +418,7 @@ parseJoinResponse = do
|
||||||
}
|
}
|
||||||
|
|
||||||
parseQueryIDRequest :: ParseASN1 ActionPayload
|
parseQueryIDRequest :: ParseASN1 ActionPayload
|
||||||
parseQueryIDRequest = do
|
parseQueryIDRequest = onNextContainer Sequence $ do
|
||||||
targetID <- fromInteger <$> parseInteger
|
targetID <- fromInteger <$> parseInteger
|
||||||
lBestNodes <- parseInteger
|
lBestNodes <- parseInteger
|
||||||
return $ QueryIDRequestPayload {
|
return $ QueryIDRequestPayload {
|
||||||
|
@ -434,7 +427,7 @@ parseQueryIDRequest = do
|
||||||
}
|
}
|
||||||
|
|
||||||
parseQueryIDResponse :: ParseASN1 ActionPayload
|
parseQueryIDResponse :: ParseASN1 ActionPayload
|
||||||
parseQueryIDResponse = do
|
parseQueryIDResponse = onNextContainer Sequence $ do
|
||||||
Enumerated resultType <- getNext
|
Enumerated resultType <- getNext
|
||||||
result <- case resultType of
|
result <- case resultType of
|
||||||
0 -> FOUND <$> parseNodeState
|
0 -> FOUND <$> parseNodeState
|
||||||
|
@ -450,7 +443,7 @@ parseStabiliseRequest = do
|
||||||
return StabiliseRequestPayload
|
return StabiliseRequestPayload
|
||||||
|
|
||||||
parseStabiliseResponse :: ParseASN1 ActionPayload
|
parseStabiliseResponse :: ParseASN1 ActionPayload
|
||||||
parseStabiliseResponse = do
|
parseStabiliseResponse = onNextContainer Sequence $ do
|
||||||
succ' <- map fromInteger <$> onNextContainer Sequence (getMany parseInteger)
|
succ' <- map fromInteger <$> onNextContainer Sequence (getMany parseInteger)
|
||||||
pred' <- map fromInteger <$> onNextContainer Sequence (getMany parseInteger)
|
pred' <- map fromInteger <$> onNextContainer Sequence (getMany parseInteger)
|
||||||
return $ StabiliseResponsePayload {
|
return $ StabiliseResponsePayload {
|
||||||
|
@ -459,7 +452,7 @@ parseStabiliseResponse = do
|
||||||
}
|
}
|
||||||
|
|
||||||
parseLeaveRequest :: ParseASN1 ActionPayload
|
parseLeaveRequest :: ParseASN1 ActionPayload
|
||||||
parseLeaveRequest = do
|
parseLeaveRequest = onNextContainer Sequence $ do
|
||||||
succ' <- map fromInteger <$> onNextContainer Sequence (getMany parseInteger)
|
succ' <- map fromInteger <$> onNextContainer Sequence (getMany parseInteger)
|
||||||
pred' <- map fromInteger <$> onNextContainer Sequence (getMany parseInteger)
|
pred' <- map fromInteger <$> onNextContainer Sequence (getMany parseInteger)
|
||||||
return $ LeaveRequestPayload {
|
return $ LeaveRequestPayload {
|
||||||
|
@ -478,7 +471,7 @@ parsePingRequest = do
|
||||||
return PingRequestPayload
|
return PingRequestPayload
|
||||||
|
|
||||||
parsePingResponse :: ParseASN1 ActionPayload
|
parsePingResponse :: ParseASN1 ActionPayload
|
||||||
parsePingResponse = do
|
parsePingResponse = onNextContainer Sequence $ do
|
||||||
handledNodes <- getMany parseNodeState
|
handledNodes <- getMany parseNodeState
|
||||||
return $ PingResponsePayload {
|
return $ PingResponsePayload {
|
||||||
pingNodeStates = handledNodes
|
pingNodeStates = handledNodes
|
||||||
|
|
Loading…
Reference in a new issue