@@ -64,8 +64,10 @@ frameReceiver ctx mkreq recvN = loop 0 `E.catch` sendGoaway
64 cont <- processStreamGuardingError $ decodeFrameHeader hd
64 cont <- processStreamGuardingError $ decodeFrameHeader hd
65 when cont $ loop (n + 1)
65 when cont $ loop (n + 1)
67− processStreamGuardingError (_, FrameHeader{streamId})
67+ processStreamGuardingError (fid, FrameHeader{streamId})
68+ | isResponse streamId &&
69+ (fid `notElem` [FramePriority,FrameRSTStream,FrameWindowUpdate]) =
68− | isResponse streamId = E.throwIO $ ConnectionError ProtocolError "stream id should be odd"
70+ E.throwIO $ ConnectionError ProtocolError "stream id should be odd"
69 processStreamGuardingError (FrameUnknown _, FrameHeader{payloadLength}) = do
71 processStreamGuardingError (FrameUnknown _, FrameHeader{payloadLength}) = do
70 mx <- readIORef continued
72 mx <- readIORef continued
71 case mx of
73 case mx of
@@ -155,7 +157,7 @@ frameReceiver ctx mkreq recvN = loop 0 `E.catch` sendGoaway
155 when (ftyp `notElem` [FrameHeaders,FramePriority]) $
157 when (ftyp `notElem` [FrameHeaders,FramePriority]) $
156 E.throwIO $ ConnectionError ProtocolError "this frame is not allowed in an idel stream"
158 E.throwIO $ ConnectionError ProtocolError "this frame is not allowed in an idel stream"
157 csid <- readIORef clientStreamId
159 csid <- readIORef clientStreamId
158− when (streamId <= csid) $
160+ when (isRequest streamId && streamId <= csid) $
159 E.throwIO $ ConnectionError ProtocolError "stream identifier must not decrease"
161 E.throwIO $ ConnectionError ProtocolError "stream identifier must not decrease"
160 when (ftyp == FrameHeaders) $ do
162 when (ftyp == FrameHeaders) $ do
161 writeIORef clientStreamId streamId
163 writeIORef clientStreamId streamId