# File lib/em/protocols/header_and_content.rb, line 56
      def receive_line line
        case @hc_mode
        when :discard_blanks
          unless line == ""
            @hc_mode = :headers
            receive_line line
          end
        when :headers
          if line == ""
            raise "unrecognized state" unless @hc_headers.length > 0
            if respond_to?(:receive_headers)
              receive_headers @hc_headers
            end
            # @hc_content_length will be nil, not 0, if there was no content-length header.
            if @hc_content_length.to_i > 0
              set_binary_mode @hc_content_length
            else
              dispatch_request
            end
          else
            @hc_headers << line
            if ContentLengthPattern =~ line
              # There are some attacks that rely on sending multiple content-length
              # headers. This is a crude protection, but needs to become tunable.
              raise "extraneous content-length header" if @hc_content_length
              @hc_content_length = $1.to_i
            end
            if @hc_headers.length == 1 and respond_to?(:receive_first_header_line)
              receive_first_header_line line
            end
          end
        else
          raise "internal error, unsupported mode"
        end
      end