���Z � @ s� d d l Z d d l Z d d l Z d d l m Z d d l m Z m Z d d l m Z d d l m Z d d l m Z m Z m Z m Z d d l m Z d Z e e j j d � � Z Gd d � d e � Z Gd d � d e � Z d S)� N� )�hdrs)� set_exception� set_result)�StreamWriter)� server_logger)�HTTPNotModified�HTTPOk�HTTPPartialContent�HTTPRequestRangeNotSatisfiable)�StreamResponse�FileResponseZAIOHTTP_NOSENDFILEc s[ e Z d Z � f d d � Z d d � Z d d � Z � f d d � Z d d d � Z � S)�SendfileStreamWriterc s g | _ t � j | | � d S)N)�_sendfile_buffer�super�__init__)�self�args�kwargs)� __class__� �/web_fileresponse.pyr s zSendfileStreamWriter.__init__c C s) | j t | � 7_ | j j | � d S)N)�output_size�lenr �append)r �chunkr r r �_write s zSendfileStreamWriter._writec C s� | r | j | � | j � r# d Sy. t j | | | | � } | d k rP | } WnS t t f k rq d } Yn6 t k r� } z t | | � d SWYd d } ~ Xn X| | k r� | j | | j | | | | | | | | d � n t | d � d S)Nr T)Z remove_writer� cancelled�os�sendfile�BlockingIOError�InterruptedError� Exceptionr Z add_writer�_sendfile_cbr ) r �fut�out_fd�in_fd�offset�count�loopZ registered�n�excr r r r# ! s"