module Unicorn::HttpResponse

Public Instance Methods

httpdate() click to toggle source

Returns a string which represents the time as rfc1123-date of HTTP-date defined by RFC 2616:

day-of-week, DD month-name CCYY hh:mm:ss GMT

Note that the result is always GMT.

This method is identical to Time#httpdate in the Ruby standard library, except it is implemented in C for performance. We always saw Time#httpdate at or near the top of the profiler output so we decided to rewrite this in C.

Caveats: it relies on a Ruby implementation with the global VM lock, a thread-safe version will be provided when a Unix-only, GVL-free Ruby implementation becomes viable.

static VALUE httpdate(VALUE self)
{
        static time_t last;
        time_t now = time(NULL); /* not a syscall on modern 64-bit systems */
        struct tm tm;

        if (last == now)
                return buf;
        last = now;
        gmtime_r(&now, &tm);

        /* we can make this thread-safe later if our Ruby loses the GVL */
        snprintf(buf_ptr, buf_capa,
                 "%s, %02d %s %4d %02d:%02d:%02d GMT",
                 week + (tm.tm_wday * 4),
                 tm.tm_mday,
                 months + (tm.tm_mon * 4),
                 tm.tm_year + 1900,
                 tm.tm_hour,
                 tm.tm_min,
                 tm.tm_sec);

        return buf;
}