Simon Hang wrote:
How about below changes?


There aren't many of us who know the zope.server code that well, unfortunately. This is one of the reasons we want to "get out of the server business".

That said, it would *much* easier to understand what you're trying to do if you provided *unified diffs* (create them with "svn diff" or "diff -u").

Philipp


in httptask.py

    def prepareResponseHeaders(self):
        version = self.version
        # Figure out whether the connection should be closed.
        connection = self.request_data.headers.get('CONNECTION', '').lower()
        close_it = 0
        response_headers = self.response_headers

        if version == '1.0':
            if connection == 'keep-alive':
                if not ('Content-Length' in response_headers):
                    close_it = 1
                else:
                    response_headers['Connection'] = 'Keep-Alive'
            else:
                close_it = 1
        elif version == '1.1':
            #insert by Simon
            thisflag = False
            for each in self.accumulated_headers:
                if each.lower() == 'connection: keep-alive':
                    thisflag = True
                    break
            if thisflag == False:
                close_it = 1
            #end of insert
            if connection == 'close':
                close_it = 1
            elif 'Transfer-Encoding' in response_headers:
                if not response_headers['Transfer-Encoding'] == 'chunked':
                    close_it = 1
            elif self.status == '304':
                # Replying with headers only.
                pass
            #insert by simon
            elif not ('Content-Length' in response_headers):
                thisflag = False
                for each in self.accumulated_headers:
                    if each[:14].upper() == 'CONTENT-LENGTH':
                        thisflag = True
                        break
if thisflag == False: #only CONTENT_LENGTH not exist in accumulated headers too

              #end of insert
                    close_it = 1
        else:
            # Close if unrecognized HTTP version.
            close_it = 1

        self.close_on_finish = close_it
        if close_it:
            self.response_headers['Connection'] = 'close'



On 9/19/06, *Simon Hang* <[EMAIL PROTECTED] <mailto:[EMAIL PROTECTED]>> wrote:

    Dear all,
While I was exploring my options to implement NTLM authentication, I
    found some strange behavior of Zope HTTP server.
in zope.server.http.wsgihttpserver.WSGIHTTPServer,
    It use below function to handle response's head:

            def start_response(status, headers):
                # Prepare the headers for output
                status, reason = re.match('([0-9]*) (.*)', status).groups()
                task.setResponseStatus(status, reason)
                task.appendResponseHeaders(['%s: %s' % i for i in headers])

                # Return the write method used to write the response data.
                return fakeWrite

    The result is all response's head from the content part of program
    will be stored in task.accumulated_headers. See below function from
    zope.server.http.httptask.HTTPTask.

        def appendResponseHeaders(self, lst):
            """See zope.publisher.interfaces.http.IHeaderOutput"""
            accum = self.accumulated_headers
            if accum is None:
                self.accumulated_headers = accum = []
            accum.extend(lst)

    But, the problem is while httptask to determin whether to close the
    connection or not, it use below code. The code is only checking
    self.response_headers which has nothing to do with the response our
    application generated. So zope ends up to disconnect connection for
    each single request.

       def prepareResponseHeaders(self):
            version = self.version
            # Figure out whether the connection should be closed.
            connection = self.request_data.headers.get('CONNECTION',
    '').lower()
            close_it = 0
            response_headers = self.response_headers

            if version == '1.0':
                if connection == 'keep-alive':
                    if not ('Content-Length' in response_headers):
                        close_it = 1
                    else:
                        response_headers['Connection'] = 'Keep-Alive'
                else:
                    close_it = 1
            elif version == '1.1':
                thisflag = False
if connection == 'close':
                    close_it = 1
                elif 'Transfer-Encoding' in response_headers:
                    if not response_headers['Transfer-Encoding'] ==
    'chunked':
                        close_it = 1
                elif self.status == '304':
                    # Replying with headers only.
                    pass
                elif not ('Content-Length' in response_headers):
                    close_it = 1
            else:
                # Close if unrecognized HTTP version.
                close_it = 1

            self.close_on_finish = close_it
            if close_it:
                self.response_headers['Connection'] = 'close'
    Can somebody tell me why the thing is implement like this, is there
    special reason to do this? Or can we change it a little bit to let
    zope support persistence connection?

    Thanks,
    Simon



------------------------------------------------------------------------

_______________________________________________
Zope3-users mailing list
Zope3-users@zope.org
http://mail.zope.org/mailman/listinfo/zope3-users

_______________________________________________
Zope3-users mailing list
Zope3-users@zope.org
http://mail.zope.org/mailman/listinfo/zope3-users

Reply via email to