Changeset 32727


Ignore:
Timestamp:
Jul 17, 2017, 6:00:17 AM (4 weeks ago)
Author:
brainslayer
Message:

use senfile for direct file transfers

Location:
src/router/httpd
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • src/router/httpd/httpd.c

    r32715 r32727  
    5454#include <signal.h>
    5555#include <sys/wait.h>
     56#include <sys/sendfile.h>
    5657
    5758#ifdef HAVE_OPENSSL
     
    150151
    151152/* Forwards. */
     153static int wfsendfile(int fd, size_t nbytes, webs_t wp);
    152154static int initialize_listen_socket(usockaddr * usaP);
    153155static int auth_check(webs_t conn_fp);
     
    486488        if (!handler->send_headers)
    487489                send_headers(stream, 200, "Ok", handler->extra_header, handler->mime_type, len, attach);
    488         char *buffer = malloc(4096);
    489         while (len) {
    490                 size_t ret = fread(buffer, 1, len > 4096 ? 4096 : len, web);
    491                 if (!ret) {
    492                         dd_syslog(LOG_INFO, "%s: cannot ret from stream (%s)\n", __func__, strerror(errno));
    493                         break;  // deadlock prevention
    494                 }
    495                 len -= ret;
    496                 wfwrite(buffer, ret, 1, stream);
    497         }
    498         free(buffer);
     490#ifdef HAVE_HTTPS
     491        if (stream->do_ssl) {
     492                char *buffer = malloc(4096);
     493                while (len) {
     494                        size_t ret = fread(buffer, 1, len > 4096 ? 4096 : len, web);
     495                        if (!ret) {
     496                                dd_syslog(LOG_INFO, "%s: cannot ret from stream (%s)\n", __func__, strerror(errno));
     497                                break;  // deadlock prevention
     498                        }
     499                        len -= ret;
     500                        wfwrite(buffer, ret, 1, stream);
     501                }
     502                free(buffer);
     503        } else
     504#endif
     505        {
     506                wfflush(stream);
     507                wfsendfile(fileno(web), len, stream);
     508        }
    499509        fclose(web);
    500510}
     
    15451555                 */
    15461556                r = 1;
    1547 //              (void)setsockopt(conn_fp->conn_fd, IPPROTO_TCP, TCP_NOPUSH, (void *)&r, sizeof(r));
     1557                (void)setsockopt(conn_fp->conn_fd, IPPROTO_TCP, TCP_NOPUSH, (void *)&r, sizeof(r));
     1558#endif                          /* TCP_NOPUSH */
     1559#ifdef TCP_CORK
     1560                /* Set the TCP_NOPUSH socket option, to try and avoid the 0.2 second
     1561                 ** delay between sending the headers and sending the data.  A better
     1562                 ** solution is writev() (as used in thttpd), or send the headers with
     1563                 ** send(MSG_MORE) (only available in Linux so far).
     1564                 */
     1565                r = 1;
     1566                (void)setsockopt(conn_fp->conn_fd, IPPROTO_TCP, TCP_CORK, (void *)&r, sizeof(r));
    15481567#endif                          /* TCP_NOPUSH */
    15491568
     
    17651784
    17661785        return ret;
     1786}
     1787
     1788static int wfsendfile(int fd, size_t nbytes, webs_t wp)
     1789{
     1790        return sendfile(wp->conn_fd, fd, NULL, nbytes);
     1791
    17671792}
    17681793
  • src/router/httpd/httpd.h

    r32610 r32727  
    5050        int filter_id;
    5151} persistent_vars;
    52 
    5352
    5453typedef struct {
     
    10099} webs;
    101100
    102 
    103101typedef webs *webs_t;
    104102
Note: See TracChangeset for help on using the changeset viewer.