docstr: Called by libcurl when it wants to change the file descriptors
  it cares about.
docstr_tok: ["Called","by","libcurl","when","it","wants","to","change","the","file","descriptors","it","cares","about","."]
code: def _handle_socket(self, event, fd, multi, data):
      """Called by libcurl when it wants to change the file descriptors
      it cares about.
      """
      event_map = {
          pycurl.POLL_NONE: ioloop.IOLoop.NONE,
          pycurl.POLL_IN: ioloop.IOLoop.READ,
          pycurl.POLL_OUT: ioloop.IOLoop.WRITE,
          pycurl.POLL_INOUT: ioloop.IOLoop.READ | ioloop.IOLoop.WRITE,
      }
      if event == pycurl.POLL_REMOVE:
          if fd in self._fds:
              self.io_loop.remove_handler(fd)
              del self._fds[fd]
      else:
          ioloop_event = event_map[event]
          # libcurl sometimes closes a socket and then opens a new
          # one using the same FD without giving us a POLL_NONE in
          # between.  This is a problem with the epoll IOLoop,
          # because the kernel can tell when a socket is closed and
          # removes it from the epoll automatically, causing future
          # update_handler calls to fail.  Since we can't tell when
          # this has happened, always use remove and re-add
          # instead of update.
          if fd in self._fds:
              self.io_loop.remove_handler(fd)
          self.io_loop.add_handler(
              fd, self._handle_events, ioloop_event
          )
          self._fds[fd] = ioloop_event
  
imports: from __future__ import absolute_import, division, print_function
  import collections
  import functools
  import logging
  import pycurl
  import threading
  import time
  from io import BytesIO
  from tornado import httputil
  from tornado import ioloop
  from tornado import stack_context
  from tornado.escape import utf8, native_str
  from tornado.httpclient import HTTPResponse, HTTPError, AsyncHTTPClient, main
label_desc: Use image node_id 4 for calling the CurlAsyncHTTPClient obj's underlying member method code with example usage: obj._handle_socket(event, fd, multi, data) without return types