# 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;
    }