tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

whatsnew-2.0.txt (26344B)


      1 What's New In Libevent 2.0 so far:
      2 
      3 1. Meta-issues
      4 
      5 1.1. About this document
      6 
      7  This document describes the key differences between Libevent 1.4 and
      8  Libevent 2.0, from a user's point of view.  It was most recently
      9  updated based on features in git master as of August 2010.
     10 
     11  NOTE: I am very sure that I missed some thing on this list.  Caveat
     12  haxxor.
     13 
     14 1.2. Better documentation
     15 
     16  There is now a book-in-progress that explains how to use Libevent and its
     17  growing pile of APIs.  As of this writing, it covers everything except the
     18  http and rpc code.  Check out the latest draft at
     19  http://www.wangafu.net/~nickm/libevent-book/ .
     20 
     21 2. New and Improved Event APIs
     22 
     23  Many APIs are improved, refactored, or deprecated in Libevent 2.0.
     24 
     25  COMPATIBILITY:
     26 
     27  Nearly all existing code that worked with Libevent 1.4 should still
     28  work correctly with Libevent 2.0.  However, if you are writing new code,
     29  or if you want to port old code, we strongly recommend using the new APIs
     30  and avoiding deprecated APIs as much as possible.
     31 
     32  Binaries linked against Libevent 1.4 will need to be recompiled to link
     33  against Libevent 2.0.  This is nothing new; we have never been good at
     34  preserving binary compatibility between releases.  We'll try harder in the
     35  future, though: see 2.1 below.
     36 
     37 2.1. New header layout for improved forward-compatibility
     38 
     39  Libevent 2.0 has a new header layout to make it easier for programmers to
     40  write good, well-supported libevent code.  The new headers are divided
     41  into three types.
     42 
     43  There are *regular headers*, like event2/event.h.  These headers contain
     44  the functions that most programmers will want to use.
     45 
     46  There are *backward compatibility headers*, like event2/event_compat.h.
     47  These headers contain declarations for deprecated functions from older
     48  versions of Libevent.  Documentation in these headers should suggest what's
     49  wrong with the old functions, and what functions you want to start using
     50  instead of the old ones.  Some of these functions might be removed in a
     51  future release.  New programs should generally not include these headers.
     52 
     53  Finally, there are *structure headers*, like event2/event_struct.h.
     54  These headers contain definitions of some structures that Libevent has
     55  historically exposed.  Exposing them caused problems in the past,
     56  since programs that were compiled to work with one version of Libevent
     57  would often stop working with another version that changed the size or
     58  layout of some object.  We've moving them into separate headers so
     59  that programmers can know that their code is not depending on any
     60  unstable aspect of the Libvent ABI.  New programs should generally not
     61  include these headers unless they really know what they are doing, are
     62  willing to rebuild their software whenever they want to link it
     63  against a new version of Libevent, and are willing to risk their code
     64  breaking if and when data structures change.
     65 
     66  Functionality that once was located in event.h is now more subdivided.
     67  The core event logic is now in event2/event.h.  The "evbuffer" functions
     68  for low-level buffer manipulation are in event2/buffer.h.  The
     69  "bufferevent" functions for higher-level buffered IO are in
     70  event2/bufferevent.h.
     71 
     72  COMPATIBILITY:
     73 
     74  All of the old headers (event.h, evdns.h, evhttp.h, evrpc.h, and
     75  evutil.h) will continue to work by including the corresponding new
     76  headers.  Old code should not be broken by this change.
     77 
     78 2.2. New thread-safe, binary-compatible, harder-to-mess-up APIs
     79 
     80  Some aspects of the historical Libevent API have encouraged
     81  non-threadsafe code, or forced code built against one version of Libevent
     82  to no longer build with another.  The problems with now-deprecated APIs
     83  fell into two categories:
     84 
     85     1) Dependence on the "current" event_base.  In an application with
     86        multiple event_bases, Libevent previously had a notion of the
     87        "current" event_base.  New events were linked to this base, and
     88        the caller needed to explicitly reattach them to another base.
     89        This was horribly error-prone.
     90 
     91        Functions like "event_set" that worked with the "current" event_base
     92        are now deprecated but still available (see 2.1).  There are new
     93        functions like "event_assign" that take an explicit event_base
     94        argument when setting up a structure.  Using these functions will help
     95        prevent errors in your applications, and to be more threadsafe.
     96 
     97     2) Structure dependence.  Applications needed to allocate 'struct
     98        event' themselves, since there was no function in Libevent to do it
     99        for them.  But since the size and contents of struct event can
    100        change between libevent versions, this created binary-compatibility
    101        nightmares.  All structures of this kind are now isolated in
    102        _struct.h header (see 2.1), and there are new allocate-and-
    103        initialize functions you can use instead of the old initialize-only
    104        functions.  For example, instead of malloc and event_set, you
    105        can use event_new().
    106 
    107        (For people who do really want to allocate a struct event on the
    108        stack, or put one inside another structure, you can still use
    109        event2/event_compat.h.)
    110 
    111   So in the case where old code would look like this:
    112 
    113      #include <event.h>
    114      ...
    115      struct event *ev = malloc(sizeof(struct event));
    116      /* This call will cause a buffer overrun if you compile with one version
    117         of Libevent and link dynamically against another. */
    118      event_set(ev, fd, EV_READ, cb, NULL);
    119      /* If you forget this call, your code will break in hard-to-diagnose
    120         ways in the presence of multiple event bases. */
    121      event_set_base(ev, base);
    122 
    123   New code will look more like this:
    124 
    125     #include <event2/event.h>
    126     ...
    127     struct event *ev;
    128     ev = event_new(base, fd, EV_READ, cb, NULL);
    129 
    130 2.3. Overrideable allocation functions
    131 
    132  If you want to override the allocation functions used by libevent
    133  (for example, to use a specialized allocator, or debug memory
    134  issues, or so on), you can replace them by calling
    135  event_set_mem_functions.  It takes replacements for malloc(),
    136  free(), and realloc().
    137 
    138  If you're going to use this facility, you need to call it _before_
    139  Libevent does any memory allocation; otherwise, Libevent may allocate some
    140  memory with malloc(), and free it with the free() function you provide.
    141 
    142  You can disable this feature when you are building Libevent by passing
    143  the --disable-malloc-replacement argument to configure.
    144 
    145 2.4. Configurable event_base creation
    146 
    147  Older versions of Libevent would always got the fastest backend
    148  available, unless you reconfigured their behavior with the environment
    149  variables EVENT_NOSELECT, EVENT_NOPOLL, and so forth.  This was annoying
    150  to programmers who wanted to pick a backend explicitly without messing
    151  with the environment.
    152 
    153  Also, despite our best efforts, not every backend supports every
    154  operation we might like.  Some features (like edge-triggered events, or
    155  working with non-socket file descriptors) only work with some operating
    156  systems' fast backends.  Previously, programmers who cared about this
    157  needed to know which backends supported what.  This tended to get quite
    158  ungainly.
    159 
    160  There is now an API to choose backends, either by name or by feature.
    161  Here is an example:
    162 
    163      struct event_config_t *config;
    164      struct event_base *base;
    165 
    166      /* Create a new configuration object. */
    167      config = event_config_new();
    168      /* We don't want to use the "select" method. */
    169      event_config_avoid_method(config, "select");
    170      /* We want a method that can work with non-socket file descriptors */
    171      event_config_require_features(config, EV_FEATURE_FDS);
    172 
    173      base = event_base_new_with_config(config);
    174      if (!base) {
    175         /* There is no backend method that does what we want. */
    176         exit(1);
    177      }
    178      event_config_free(config);
    179 
    180  Supported features are documented in event2/event.h
    181 
    182 2.5. Socket is now an abstract type
    183 
    184  All APIs that formerly accepted int as a socket type now accept
    185  "evutil_socket_t".  On Unix, this is just an alias for "int" as
    186  before.  On Windows, however, it's an alias for SOCKET, which can
    187  be wider than int on 64-bit platforms.
    188 
    189 2.6. Timeouts and persistent events work together.
    190 
    191  Previously, it wasn't useful to set a timeout on a persistent event:
    192  the timeout would trigger once, and never again.  This is not what
    193  applications tend to want.  Instead, applications tend to want every
    194  triggering of the event to re-set the timeout.  So now, if you set
    195  up an event like this:
    196       struct event *ev;
    197       struct timeval tv;
    198       ev = event_new(base, fd, EV_READ|EV_PERSIST, cb, NULL);
    199       tv.tv_sec = 1;
    200       tv.tv_usec = 0;
    201       event_add(ev, &tv);
    202 
    203  The callback 'cb' will be invoked whenever fd is ready to read, OR whenever
    204  a second has passed since the last invocation of cb.
    205 
    206 2.7. Multiple events allowed per fd
    207 
    208  Older versions of Libevent allowed at most one EV_READ event and at most
    209  one EV_WRITE event per socket, per event base.  This restriction is no
    210  longer present.
    211 
    212 2.8. evthread_* functions for thread-safe structures.
    213 
    214  Libevent structures can now be built with locking support.  This code
    215  makes it safe to add, remove, and activate events on an event base from a
    216  different thread.  (Previously, if you wanted to write multithreaded code
    217  with Libevent, you could only an event_base or its events in one thread at
    218  a time.)
    219 
    220  If you want threading support and you're using pthreads, you can just
    221  call evthread_use_pthreads().  (You'll need to link against the
    222  libevent_pthreads library in addition to libevent_core.  These functions are
    223  not in libevent_core.)
    224 
    225  If you want threading support and you're using Windows, you can just
    226  call evthread_use_windows_threads().
    227 
    228  If you are using some locking system besides Windows and pthreads, You
    229  can enable this on a per-event-base level by writing functions to
    230  implement mutexes, conditions, and thread IDs, and passing them to
    231  evthread_set_lock_callbacks and related functions in event2/thread.h.
    232 
    233  Once locking functions are enabled, every new event_base is created with a
    234  lock.  You can prevent a single event_base from being built with a lock
    235  disabled by using the EVENT_BASE_FLAG_NOLOCK flag in its
    236  event_config.  If an event_base is created with a lock, it is safe to call
    237  event_del, event_add, and event_active on its events from any thread.  The
    238  event callbacks themselves are still all executed from the thread running
    239  the event loop.
    240 
    241  To make an evbuffer or a bufferevent object threadsafe, call its
    242  *_enable_locking() function.
    243 
    244  The HTTP api is not currently threadsafe.
    245 
    246  To build Libevent with threading support disabled, pass
    247  --disable-thread-support to the configure script.
    248 
    249 2.9. Edge-triggered events on some backends.
    250 
    251  With some backends, it's now possible to add the EV_ET flag to an event
    252  in order to request that the event's semantics be edge-triggered.  Right
    253  now, epoll and kqueue support this.
    254 
    255  The corresponding event_config feature is EV_FEATURE_ET; see 2.4 for more
    256  information.
    257 
    258 2.10. Better support for huge numbers of timeouts
    259 
    260  The heap-based priority queue timer implementation for Libevent 1.4 is good
    261  for randomly distributed timeouts, but suboptimal if you have huge numbers
    262  of timeouts that all expire in the same amount of time after their
    263  creation.  The new event_base_init_common_timeout() logic lets you signal
    264  that a given timeout interval will be very common, and should use a linked
    265  list implementation instead of a priority queue.
    266 
    267 2.11. Improved debugging support
    268 
    269  It's been pretty easy to forget to delete all your events before you
    270  re-initialize them, or otherwise put Libevent in an internally inconsistent
    271  state.  You can tell libevent to catch these and other common errors with
    272  the new event_enable_debug_mode() call.  Just invoke it before you do
    273  any calls to other libevent functions, and it'll catch many common
    274  event-level errors in your code.
    275 
    276 2.12. Functions to access all event fields
    277 
    278  So that you don't have to access the struct event fields directly, Libevent
    279  now provides accessor functions to retrieve everything from an event that
    280  you set during event_new() or event_assign().
    281 
    282 3. Backend-specific and performance improvements.
    283 
    284 3.1. Change-minimization on O(1) backends
    285 
    286  With previous versions of Libevent, if you called event_del() and
    287  event_add() repeatedly on a single event between trips to the backend's
    288  dispatch function, the backend might wind up making unnecessary calls or
    289  passing unnecessary data to the kernel.  The new backend logic batches up
    290  redundant adds and deletes, and performs no more operations than necessary
    291  at the kernel level.
    292 
    293  This logic is on for the kqueue backend, and available (but off by
    294  default) for the epoll backend.  To turn it on for the epoll backend,
    295  set the EVENT_BASE_FLAG_EPOLL_USE_CHANGELIST flag in the
    296  event_base_cofig, or set the EVENT_EPOLL_USE_CHANGELIST environment
    297  variable.  Doing this with epoll may result in weird bugs if you give
    298  any fds closed by dup() or its variants.
    299 
    300 3.2. Improved notification on Linux
    301 
    302  When we need to wake the event loop up from another thread, we use
    303  an epollfd to do so, instead of a socketpair.  This is supposed to be
    304  faster.
    305 
    306 3.3. Windows: better support for everything
    307 
    308  Bufferevents on Windows can use a new mechanism (off-by-default; see below)
    309  to send their data via Windows overlapped IO and get their notifications
    310  via the IOCP API.  This should be much faster than using event-based
    311  notification.
    312 
    313  Other functions throughout the code have been fixed to work more
    314  consistently with Windows.  Libevent now builds on Windows using either
    315  mingw, or using MSVC (with nmake).  Libevent works fine with UNICODE
    316  defined, or not.
    317 
    318  Data structures are a little smarter: our lookups from socket to pending
    319  event are now done with O(1) hash tables rather than O(lg n) red-black
    320  trees.
    321 
    322  Unfortunately, the main Windows backend is still select()-based: from
    323  testing the IOCP backends on the mailing list, it seems that there isn't
    324  actually a way to tell for certain whether a socket is writable with IOCP.
    325  Libevent 2.1 may add a multithreaded WaitForMultipleEvents-based
    326  backend for better performance with many inactive sockets and better
    327  integration with Windows events.
    328 
    329 4. Improvements to evbuffers
    330 
    331  Libevent has long had an "evbuffer" implementation to wrap access to an
    332  input or output memory buffer.  In previous versions, the implementation
    333  was very inefficient and lacked some desirable features.  We've made many
    334  improvements in Libevent 2.0.
    335 
    336 4.1. Chunked-memory internal representation
    337 
    338  Previously, each evbuffer was a huge chunk of memory.  When we ran out of
    339  space in an evbuffer, we used realloc() to grow the chunk of memory.  When
    340  data was misaligned, we used memmove to move the data back to the front
    341  of the buffer.
    342 
    343  Needless to say, this is a terrible interface for networked IO.
    344 
    345  Now, evbuffers are implemented as a linked list of memory chunks, like
    346  most Unix kernels use for network IO.  (See Linux's skbuf interfaces,
    347  or *BSD's mbufs).  Data is added at the end of the linked list and
    348  removed from the front, so that we don't ever need realloc huge chunks
    349  or memmove the whole buffer contents.
    350 
    351  To avoid excessive calls to read and write, we use the readv/writev
    352  interfaces (or WSASend/WSARecv on Windows) to do IO on multiple chunks at
    353  once with a single system call.
    354 
    355  COMPATIBILITY NOTE:
    356  The evbuffer struct is no longer exposed in a header.  The code here is
    357  too volatile to expose an official evbuffer structure, and there was never
    358  any means provided to create an evbuffer except via evbuffer_new which
    359  heap-allocated the buffer.
    360 
    361  If you need access to the whole buffer as a linear chunk of memory, the
    362  EVBUFFER_DATA() function still works.  Watch out, though: it needs to copy
    363  the buffer's contents in a linear chunk before you can use it.
    364 
    365 4.2. More flexible readline support
    366 
    367  The old evbuffer_readline() function (which accepted any sequence of
    368  CR and LF characters as a newline, and which couldn't handle lines
    369  containing NUL characters), is now deprecated.  The preferred
    370  function is evbuffer_readln(), which supports a variety of
    371  line-ending styles, and which can return the number of characters in
    372  the line returned.
    373 
    374  You can also call evbuffer_search_eol() to find the end of a line
    375  in an evbuffer without ever extracting the line.
    376 
    377 4.3. Support for file-based IO in evbuffers.
    378 
    379  You can now add chunks of a file into a evbuffer, and Libevent will have
    380  your OS use mapped-memory functionality, sendfile, or splice to transfer
    381  the data without ever copying it to userspace.  On OSs where this is not
    382  supported, Libevent just loads the data.
    383 
    384  There are probably some bugs remaining in this code.  On some platforms
    385  (like Windows), it just reads the relevant parts of the file into RAM.
    386 
    387 4.4. Support for zero-copy ("scatter/gather") writes in evbuffers.
    388 
    389  You can add a piece of memory to an evbuffer without copying it.
    390  Instead, Libevent adds a new element to the evbuffer's linked list of
    391  chunks with a pointer to the memory you supplied.  You can do this
    392  either with a reference-counted chunk (via evbuffer_add_reference), or
    393  by asking Libevent for a pointer to its internal vectors (via
    394  evbuffer_reserve_space or evbuffer_peek()).
    395 
    396 4.5. Multiple callbacks per evbuffer
    397 
    398  Previously, you could only have one callback active on an evbuffer at a
    399  time.  In practice, this meant that if one part of Libevent was using an
    400  evbuffer callback to notice when an internal evbuffer was reading or
    401  writing data, you couldn't have your own callback on that evbuffer.
    402 
    403  Now, you can now use the evbuffer_add_cb() function to add a callback that
    404  does not interfere with any other callbacks.
    405 
    406  The evbuffer_setcb() function is now deprecated.
    407 
    408 4.6. New callback interface
    409 
    410  Previously, evbuffer callbacks were invoked with the old size of the
    411  buffer and the new size of the buffer.  This interface could not capture
    412  operations that simultaneously filled _and_ drained a buffer, or handle
    413  cases where we needed to postpone callbacks until multiple operations were
    414  complete.
    415 
    416  Callbacks that are set with evbuffer_setcb still use the old API.
    417  Callbacks added with evbuffer_add_cb() use a new interface that takes a
    418  pointer to a struct holding the total number of bytes drained read and the
    419  total number of bytes written.  See event2/buffer.h for full details.
    420 
    421 4.7. Misc new evbuffer features
    422 
    423   You can use evbuffer_remove() to move a given number of bytes from one
    424   buffer to another.
    425 
    426   The evbuffer_search() function lets you search for repeated instances of
    427   a pattern inside an evbuffer.
    428 
    429   You can use evbuffer_freeze() to temporarily suspend drains from or adds
    430   to a given evbuffer.  This is useful for code that exposes an evbuffer as
    431   part of its public API, but wants users to treat it as a pure source or
    432   sink.
    433 
    434   There's an evbuffer_copyout() that looks at the data at the start of an
    435   evbuffer without doing a drain.
    436 
    437   You can have an evbuffer defer all of its callbacks, so that rather than
    438   being invoked immediately when the evbuffer's length changes, they are
    439   invoked from within the event_loop.  This is useful when you have a
    440   complex set of callbacks that can change the length of other evbuffers,
    441   and you want to avoid having them recurse and overflow your stack.
    442 
    443 5. Bufferevents improvements
    444 
    445   Libevent has long included a "bufferevents" structure and related
    446   functions that were useful for generic buffered IO on a TCP connection.
    447   This is what Libevent uses for its HTTP implementation.  In addition to
    448   the improvements that they get for free from the underlying evbuffer
    449   implementation above, there are many new features in Libevent 2.0's
    450   evbuffers.
    451 
    452 5.1. New OO implementations
    453 
    454   The "bufferevent" structure is now an abstract base type with multiple
    455   implementations.  This should not break existing code, which always
    456   allocated bufferevents with bufferevent_new().
    457 
    458   Current implementations of the bufferevent interface are described below.
    459 
    460 5.2. bufferevent_socket_new() replaces bufferevent_new()
    461 
    462   Since bufferevents that use a socket are not the only kind,
    463   bufferevent_new() is now deprecated.  Use bufferevent_socket_new()
    464   instead.
    465 
    466 5.3. Filtered bufferevent IO
    467 
    468   You can use bufferevent_filter_new() to create a bufferevent that wraps
    469   around another bufferevent and transforms data it is sending and
    470   receiving.  See test/regress_zlib.c for a toy example that uses zlib to
    471   compress data before sending it over a bufferevent.
    472 
    473 5.3. Linked pairs of bufferevents
    474 
    475   You can use bufferevent_pair_new() to produce two linked
    476   bufferevents.  This is like using socketpair, but doesn't require
    477   system-calls.
    478 
    479 5.4. SSL support for bufferevents with OpenSSL
    480 
    481   There is now a bufferevent type that supports SSL/TLS using the
    482   OpenSSL library.  The code for this is build in a separate
    483   library, libevent_openssl, so that your programs don't need to
    484   link against OpenSSL unless they actually want SSL support.
    485 
    486   There are two ways to construct one of these bufferevents, both
    487   declared in <event2/bufferevent_ssl.h>.  If you want to wrap an
    488   SSL layer around an existing bufferevent, you would call the
    489   bufferevent_openssl_filter_new() function.  If you want to do SSL
    490   on a socket directly, call bufferevent_openssl_socket_new().
    491 
    492 5.5. IOCP support for bufferevents on Windows
    493 
    494   There is now a bufferevents backend that supports IOCP on Windows.
    495   Supposedly, this will eventually make Windows IO much faster for
    496   programs using bufferevents.  We'll have to see; the code is not
    497   currently optimized at all.  To try it out, call the
    498   event_base_start_iocp() method on an event_base before contructing
    499   bufferevents.
    500 
    501   This is tricky code; there are probably some bugs hiding here.
    502 
    503 5.6. Improved connect support for bufferevents.
    504 
    505   You can now create a bufferevent that is not yet connected to any
    506   host, and tell it to connect, either by address or by hostname.
    507 
    508   The functions to do this are bufferevent_socket_connect and
    509   bufferevent_socket_connect_hostname.
    510 
    511 5.7. Rate-limiting for bufferevents
    512 
    513   If you need to limit the number of bytes read/written by a single
    514   bufferevent, or by a group of them, you can do this with a new set of
    515   bufferevent rate-limiting calls.
    516 
    517 6. Other improvements
    518 
    519 6.1. DNS improvements
    520 
    521 6.1.1. DNS: IPv6 nameservers
    522 
    523   The evdns code now lets you have nameservers whose addresses are IPv6.
    524 
    525 6.1.2. DNS: Better security
    526 
    527   Libevent 2.0 tries harder to resist DNS answer-sniping attacks than
    528   earlier versions of evdns.  See comments in the code for full details.
    529 
    530   Notably, evdns now supports the "0x20 hack" to make it harder to
    531   impersonate a DNS server.  Additionally, Libevent now uses a strong
    532   internal RNG to generate DNS transaction IDs, so you don't need to supply
    533   your own.
    534 
    535 6.1.3. DNS: Getaddrinfo support
    536 
    537   There's now an asynchronous getaddrinfo clone, evdns_getaddrinfo(),
    538   to make the results of the evdns functions more usable.  It doesn't
    539   support every feature of a typical platform getaddrinfo() yet, but it
    540   is quite close.
    541 
    542   There is also a blocking evutil_getaddrinfo() declared in
    543   event2/util.h, to provide a getaddrinfo() implementation for
    544   platforms that don't have one, and smooth over the differences in
    545   various platforms implementations of RFC3493.
    546 
    547   Bufferevents provide bufferevent_connect_hostname(), which combines
    548   the name lookup and connect operations.
    549 
    550 6.1.4. DNS: No more evdns globals
    551 
    552   Like an event base, evdns operations are now supposed to use an evdns_base
    553   argument.  This makes them easier to wrap for other (more OO) languages,
    554   and easier to control the lifetime of.  The old evdns functions will
    555   still, of course, continue working.
    556 
    557 6.2. Listener support
    558 
    559   You can now more easily automate setting up a bound socket to listen for
    560   TCP connections.  Just use the evconnlistener_*() functions in the
    561   event2/listener.h header.
    562 
    563   The listener code supports IOCP on Windows if available.
    564 
    565 6.3. Secure RNG support
    566 
    567   Network code very frequently needs a secure, hard-to-predict random number
    568   generator.  Some operating systems provide a good C implementation of one;
    569   others do not.  Libevent 2.0 now provides a consistent implementation
    570   based on the arc4random code originally from OpenBSD.  Libevent (and you)
    571   can use the evutil_secure_rng_*() functions to access a fairly secure
    572   random stream of bytes.
    573 
    574 6.4. HTTP
    575 
    576   The evhttp uriencoding and uridecoding APIs have updated versions
    577   that behave more correctly, and can handle strings with internal NULs.
    578 
    579   The evhttp query parsing and URI parsing logic can now detect errors
    580   more usefully.  Moreover, we include an actual URI parsing function
    581   (evhttp_uri_parse()) to correctly parse URIs, so as to discourage
    582   people from rolling their own ad-hoc parsing functions.
    583 
    584   There are now accessor functions for the useful fields of struct http
    585   and friends; it shouldn't be necessary to access them directly any
    586   more.
    587 
    588   Libevent now lets you declare support for all specified HTTP methods,
    589   including OPTIONS, PATCH, and so on.  The default list is unchanged.
    590 
    591   Numerous evhttp bugs also got fixed.
    592 
    593 7. Infrastructure improvements
    594 
    595 7.1. Better unit test framework
    596 
    597   We now use a unit test framework that Nick wrote called "tinytest".
    598   The main benefit from Libevent's point of view is that tests which
    599   might mess with global state can all run each in their own
    600   subprocess.  This way, when there's a bug that makes one unit test
    601   crash or mess up global state, it doesn't affect any others.
    602 
    603 7.2. Better unit tests
    604 
    605   Despite all the code we've added, our unit tests are much better than
    606   before.  Right now, iterating over the different backends on various
    607   platforms, I'm getting between 78% and 81% test coverage, compared
    608   with less than 45% test coverage in Libevent 1.4.