如何在BaseHTTPServer中手动关闭连接?

时间:2012-09-09 15:35:42

标签: python sockets basehttpserver

我有一个向HTTP服务器发送请求的脚本。

HTTP服务器脚本(代码段):

...

class MyHandler(BaseHTTPServer.BaseHTTPRequestHandler):
  def do_GET(sa):
    pdict = cgi.parse_header(sa.headers.getheader('referer'))
    q = pdict[0]
    q = urllib.unquote(q)

    if q == "enternetixplorer" # basically just ignore this, doesn't have to do with the question
      sa.wfile.write("blah blah blah")
      # now restart server
      httpd.server_close()
      python = sys.executable
      os.execl(python, python, * sys.argv)

...

“blah blah blah”被发回,但连接似乎没有关闭,我的脚本一直在等待,直到我中止服务器。 (我的想法是BaseHTTPServer在计算“do_GET()”的最后一部分时自动关闭连接,但是我通过重新启动脚本来防止这种情况。)

如果我是对的,我该如何关闭连接?如果没有,还有什么可能是问题?

编辑: 服务器脚本必须重新启动整个程序。

1 个答案:

答案 0 :(得分:1)

执行时:

os.execl(python, python, * sys.argv)

Python documentation for os.exec*说:

  

这些函数都执行一个新程序,取代当前的程序   处理;他们不回来。在Unix上,加载了新的可执行文件   进入当前进程,并将具有相同的进程ID   呼叫者。错误将报告为OSError异常。

因此,当您调用该函数时,do_GET函数会挂起并且永不返回,因此HTTP服务器永远不会刷新HTTP消息的结尾。

我认为在您的情况下,最简单的更改是在调用exec之前调用os.fork,然后仅在子进程中调用exec。让父进程从do_GET函数返回。