0

HTTP/2 is a major revision of the HTTP network protocol used by the World Wide Web. The primary goals for HTTP/2 are to reduce latency by enabling full request and response multiplexing, minimize protocol overhead via efficient compression of HTTP header fields, and add support for request prioritization and server push

I am trying to implement a simple server a long with a client using HTTP/2 I followed the examples given here https://python-hyper.org/projects/h2/en/stable/twisted-post-example.html# However each time i try to send a file from the client to the server i get this error

AttributeError: 'NoneType' object has no attribute 'write'

The error comes from this part of the code

def sendFileData(self):
"""
Send some file data on the connection.
"""
# Firstly, check what the flow control window is for stream 1.
window_size = self.conn.local_flow_control_window(stream_id=1)

# Next, check what the maximum frame size is.
max_frame_size = self.conn.max_outbound_frame_size

# We will send no more than the window size or the remaining file size
# of data in this call, whichever is smaller.
bytes_to_send = min(window_size, self.file_size)

# We now need to send a number of data frames.
while bytes_to_send > 0:
    chunk_size = min(bytes_to_send, max_frame_size)
    data_chunk = self.fileobj.read(chunk_size)
    self.conn.send_data(stream_id=1, data=data_chunk)

    bytes_to_send -= chunk_size
    self.file_size -= chunk_size

# We've prepared a whole chunk of data to send. If the file is fully
# sent, we also want to end the stream: we're done here.
if self.file_size == 0:
    self.conn.end_stream(stream_id=1)
else:
    # We've still got data left to send but the window is closed. Save
    # a Deferred that will call us when the window gets opened.
    self.flow_control_deferred = defer.Deferred()
    self.flow_control_deferred.addCallback(self.sendFileData)
This line--> self.transport.write(self.conn.data_to_send())
NNN
  • 41
  • 3
  • Please provide a minimal, reproducible example, otherwise we are just guessing at what your code might do. The error message is pretty self-explanatory: self.transport is None so trying to call write on it will fail. How it got that way is the challenge. – Jean-Paul Calderone Feb 03 '20 at 13:44
  • https://stackoverflow.com/questions/60031077/python-twisted-post-requests-attributeerror-nonetype-object-has-no-attribut – Jean-Paul Calderone Feb 03 '20 at 13:45

1 Answers1

0

HTTP/2 uses self.channel to write response. So change self.transport.write() to self.channel.write().

notorious.no
  • 4,919
  • 3
  • 20
  • 34