Revision aea0ed67

b/lib/http/__init__.py
281 281
    return serializer.LoadJson(data)
282 282

  
283 283

  
284
def WaitForSocketCondition(poller, sock, event, timeout):
284
def WaitForSocketCondition(sock, event, timeout):
285 285
  """Waits for a condition to occur on the socket.
286 286

  
287
  @type poller: select.Poller
288
  @param poller: Poller object as created by select.poll()
289 287
  @type sock: socket
290 288
  @param sock: Wait for events on this socket
291 289
  @type event: int
......
303 301
    # Poller object expects milliseconds
304 302
    timeout *= 1000
305 303

  
304
  poller = select.poll()
306 305
  poller.register(sock, event)
307 306
  try:
308 307
    while True:
......
320 319
    poller.unregister(sock)
321 320

  
322 321

  
323
def SocketOperation(poller, sock, op, arg1, timeout):
322
def SocketOperation(sock, op, arg1, timeout):
324 323
  """Wrapper around socket functions.
325 324

  
326 325
  This function abstracts error handling for socket operations, especially
327 326
  for the complicated interaction with OpenSSL.
328 327

  
329
  @type poller: select.Poller
330
  @param poller: Poller object as created by select.poll()
331 328
  @type sock: socket
332 329
  @param sock: Socket for the operation
333 330
  @type op: int
......
375 372
      else:
376 373
        wait_for_event = event_poll
377 374

  
378
      event = WaitForSocketCondition(poller, sock, wait_for_event, timeout)
375
      event = WaitForSocketCondition(sock, wait_for_event, timeout)
379 376
      if event is None:
380 377
        raise HttpSocketTimeout()
381 378

  
......
464 461
      raise
465 462

  
466 463

  
467
def ShutdownConnection(poller, sock, close_timeout, write_timeout, msgreader,
468
                       force):
464
def ShutdownConnection(sock, close_timeout, write_timeout, msgreader, force):
469 465
  """Closes the connection.
470 466

  
471
  @type poller: select.Poller
472
  @param poller: Poller object as created by select.poll()
473 467
  @type sock: socket
474 468
  @param sock: Socket to be shut down
475 469
  @type close_timeout: float
......
484 478
                for peer
485 479

  
486 480
  """
487
  poller = select.poll()
488

  
489 481
  #print msgreader.peer_will_close, force
490 482
  if msgreader and msgreader.peer_will_close and not force:
491 483
    # Wait for peer to close
492 484
    try:
493 485
      # Check whether it's actually closed
494
      if not SocketOperation(poller, sock, SOCKOP_RECV, 1, close_timeout):
486
      if not SocketOperation(sock, SOCKOP_RECV, 1, close_timeout):
495 487
        return
496 488
    except (socket.error, HttpError, HttpSocketTimeout):
497 489
      # Ignore errors at this stage
......
500 492
  # Close the connection from our side
501 493
  try:
502 494
    # We don't care about the return value, see NOTES in SSL_shutdown(3).
503
    SocketOperation(poller, sock, SOCKOP_SHUTDOWN, socket.SHUT_RDWR,
495
    SocketOperation(sock, SOCKOP_SHUTDOWN, socket.SHUT_RDWR,
504 496
                    write_timeout)
505 497
  except HttpSocketTimeout:
506 498
    raise HttpError("Timeout while shutting down connection")
......
510 502
      raise HttpError("Error while shutting down connection: %s" % err)
511 503

  
512 504

  
513
def Handshake(poller, sock, write_timeout):
505
def Handshake(sock, write_timeout):
514 506
  """Shakes peer's hands.
515 507

  
516
  @type poller: select.Poller
517
  @param poller: Poller object as created by select.poll()
518 508
  @type sock: socket
519 509
  @param sock: Socket to be shut down
520 510
  @type write_timeout: float
......
522 512

  
523 513
  """
524 514
  try:
525
    return SocketOperation(poller, sock, SOCKOP_HANDSHAKE, None, write_timeout)
515
    return SocketOperation(sock, SOCKOP_HANDSHAKE, None, write_timeout)
526 516
  except HttpSocketTimeout:
527 517
    raise HttpError("Timeout during SSL handshake")
528 518
  except socket.error, err:
......
672 662

  
673 663
    buf = self._FormatMessage()
674 664

  
675
    poller = select.poll()
676

  
677 665
    pos = 0
678 666
    end = len(buf)
679 667
    while pos < end:
680 668
      # Send only SOCK_BUF_SIZE bytes at a time
681 669
      data = buf[pos:(pos + SOCK_BUF_SIZE)]
682 670

  
683
      sent = SocketOperation(poller, sock, SOCKOP_SEND, data,
684
                             write_timeout)
671
      sent = SocketOperation(sock, SOCKOP_SEND, data, write_timeout)
685 672

  
686 673
      # Remove sent bytes
687 674
      pos += sent
......
761 748
    self.sock = sock
762 749
    self.msg = msg
763 750

  
764
    self.poller = select.poll()
765 751
    self.start_line_buffer = None
766 752
    self.header_buffer = StringIO()
767 753
    self.body_buffer = StringIO()
......
774 760
    while self.parser_status != self.PS_COMPLETE:
775 761
      # TODO: Don't read more than necessary (Content-Length), otherwise
776 762
      # data might be lost and/or an error could occur
777
      data = SocketOperation(self.poller, sock, SOCKOP_RECV, SOCK_BUF_SIZE,
778
                             read_timeout)
763
      data = SocketOperation(sock, SOCKOP_RECV, SOCK_BUF_SIZE, read_timeout)
779 764

  
780 765
      if data:
781 766
        buf += data
b/lib/http/client.py
167 167
    http.HttpBase.__init__(self)
168 168
    self.request = req
169 169

  
170
    self.poller = select.poll()
171

  
172 170
    try:
173 171
      # TODO: Implement connection caching/keep-alive
174 172
      self.sock = self._CreateSocket(req.ssl_params,
......
194 192
      finally:
195 193
        # TODO: Keep-alive is not supported, always close connection
196 194
        force_close = True
197
        http.ShutdownConnection(self.poller, self.sock,
198
                                self.CLOSE_TIMEOUT, self.WRITE_TIMEOUT,
199
                                response_msg_reader, force_close)
195
        http.ShutdownConnection(self.sock, self.CLOSE_TIMEOUT,
196
                                self.WRITE_TIMEOUT, response_msg_reader,
197
                                force_close)
200 198

  
201 199
      self.sock.close()
202 200
      self.sock = None
......
246 244

  
247 245
    if not connected:
248 246
      # Wait for connection
249
      event = http.WaitForSocketCondition(self.poller, self.sock,
250
                                          select.POLLOUT, self.CONNECT_TIMEOUT)
247
      event = http.WaitForSocketCondition(self.sock, select.POLLOUT,
248
                                          self.CONNECT_TIMEOUT)
251 249
      if event is None:
252 250
        raise http.HttpError("Timeout while connecting to server")
253 251

  
......
268 266
    if self.using_ssl:
269 267
      self.sock.set_connect_state()
270 268
      try:
271
        http.Handshake(self.poller, self.sock, self.WRITE_TIMEOUT)
269
        http.Handshake(self.sock, self.WRITE_TIMEOUT)
272 270
      except http.HttpSessionHandshakeUnexpectedEOF:
273 271
        raise http.HttpError("Server closed connection during SSL handshake")
274 272

  
b/lib/http/server.py
236 236
    self.sock = sock
237 237
    self.client_addr = client_addr
238 238

  
239
    self.poller = select.poll()
240

  
241 239
    self.request_msg = http.HttpMessage()
242 240
    self.response_msg = http.HttpMessage()
243 241

  
......
260 258
        if self.server.using_ssl:
261 259
          self.sock.set_accept_state()
262 260
          try:
263
            http.Handshake(self.poller, self.sock, self.WRITE_TIMEOUT)
261
            http.Handshake(self.sock, self.WRITE_TIMEOUT)
264 262
          except http.HttpSessionHandshakeUnexpectedEOF:
265 263
            # Ignore rest
266 264
            return
......
278 276
          # Try to send a response
279 277
          self._SendResponse()
280 278
      finally:
281
        http.ShutdownConnection(self.poller, sock,
282
                                self.CLOSE_TIMEOUT, self.WRITE_TIMEOUT,
279
        http.ShutdownConnection(sock, self.CLOSE_TIMEOUT, self.WRITE_TIMEOUT,
283 280
                                request_msg_reader, force_close)
284 281

  
285 282
      self.sock.close()

Also available in: Unified diff