http2: fix unhandled frames

This commit is contained in:
Thomas Kriechbaumer 2015-09-03 13:40:35 +02:00
parent a0f3803233
commit bde4bdd1d2

View File

@ -7,7 +7,7 @@ from netlib import odict
from netlib.tcp import NetLibError, Address from netlib.tcp import NetLibError, Address
from netlib.http.http1 import HTTP1Protocol from netlib.http.http1 import HTTP1Protocol
from netlib.http.http2 import HTTP2Protocol from netlib.http.http2 import HTTP2Protocol
from netlib.http.http2.frame import Frame, GoAwayFrame, PriorityFrame, WindowUpdateFrame from netlib.http.http2.frame import Frame, PingFrame, GoAwayFrame, PriorityFrame, WindowUpdateFrame
from .. import utils from .. import utils
from ..exceptions import InvalidCredentials, HttpException, ProtocolException from ..exceptions import InvalidCredentials, HttpException, ProtocolException
@ -193,6 +193,13 @@ class Http2Layer(_HttpLayer):
self.client_conn.send(GoAwayFrame().to_bytes()) self.client_conn.send(GoAwayFrame().to_bytes())
def handle_unexpected_frame_from_client(self, frame): def handle_unexpected_frame_from_client(self, frame):
if isinstance(frame, WindowUpdateFrame):
# Clients are sending WindowUpdate frames depending on their flow control algorithm.
# Since we cannot predict these frames, and we do not need to respond to them,
# simply accept them, and hide them from the log.
# Ideally we should keep track of our own flow control window and
# stall transmission if the outgoing flow control buffer is full.
return
if isinstance(frame, PriorityFrame): if isinstance(frame, PriorityFrame):
# Clients are sending Priority frames depending on their implementation. # Clients are sending Priority frames depending on their implementation.
# The RFC does not clearly state when or which priority preferences should be set. # The RFC does not clearly state when or which priority preferences should be set.
@ -207,13 +214,6 @@ class Http2Layer(_HttpLayer):
self.log("Unexpected HTTP2 Frame: %s" % frame.human_readable(), "info") self.log("Unexpected HTTP2 Frame: %s" % frame.human_readable(), "info")
def handle_unexpected_frame_from_server(self, frame): def handle_unexpected_frame_from_server(self, frame):
if isinstance(frame, WindowUpdateFrame):
# Clients are sending WindowUpdate frames depending on their flow control algorithm.
# Since we cannot predict these frames, and we do not need to respond to them,
# simply accept them, and hide them from the log.
# Ideally we should keep track of our own flow control window and
# stall transmission if the outgoing flow control buffer is full.
return
if isinstance(frame, GoAwayFrame): if isinstance(frame, GoAwayFrame):
# Server wants to terminate the connection, # Server wants to terminate the connection,
# relay it to the client. # relay it to the client.