Example #1
0
    struct basic_epoll_event *handle_request()
    {
        if (0 == SSTRNCMP(URI_TEST1, URI))
        {
           return response(HTTP_STATUS_200, HTTP_CONTENT_TYPE_TEXT_PLAIN);
        }
        
        URI::decode(URI);
        const char *file = (URI[1] == 0 ? "." : URI + 1);
        int ffd = open(file, O_RDONLY);
        if (0 > ffd)
            return response(HTTP_STATUS_404, HTTP_CONTENT_TYPE_TEXT_PLAIN);

        http_server *h = (http_server *)events_array.get(ffd);
        if (0 > h->sendFile(this))
        {
            struct stat st;
            int res = fstat(ffd, &st);
            ::close(ffd);
            if (res == 0 && S_ISDIR(st.st_mode) && 0 == generateDirList(file))
            {
                return response(HTTP_STATUS_200, HTTP_CONTENT_TYPE_TEXT_HTML);
            } else
                return response(HTTP_STATUS_500, HTTP_CONTENT_TYPE_TEXT_PLAIN);
        }
        headerStartMime(HTTP_STATUS_200, file);
        headerContentLength();
        return headerClose();
    }
Example #2
0
    struct basic_epoll_event *handle_request()
    {
        /*
        sockaddr_in addr;
        socklen_t len = sizeof(addr);
        char addr_str[INET_ADDRSTRLEN];
        const char *addrp = "-";
        if (0 == getpeername(fd, (struct sockaddr*)&addr, &len) &&
            NULL != inet_ntop(AF_INET, &addr.sin_addr, addr_str, INET_ADDRSTRLEN))
        {
            addrp = addr_str;
        }
        LOGGER_INFO("%s %s%s%s", addrp, URI, *query ? "?" : "", query);
        */
        URI::decode(URI);
        const char *file = (URI[1] == 0 ? "." : URI + 1);
        int ffd = open(file, O_RDONLY);
        if (0 > ffd)
            return response(HTTP_STATUS_404, HTTP_CONTENT_TYPE_TEXT_PLAIN);

        /*
        http_server *h = (http_server *)pool.get();
        h->fd = ffd;
        */
        http_server *h = (http_server *)events_array.get(ffd);
        if (0 > h->sendFile(this))
        {
            struct stat st;
            int res = fstat(ffd, &st);
            //pool.put(h);
            ::close(ffd);
            if (res == 0 && S_ISDIR(st.st_mode) && 0 == generateDirList(file))
            {
                return response(HTTP_STATUS_200, HTTP_CONTENT_TYPE_TEXT_HTML);
            } else
                return response(HTTP_STATUS_500, HTTP_CONTENT_TYPE_TEXT_PLAIN);
        }
        headerStartMime(HTTP_STATUS_200, file);
        headerContentLength();
        return headerClose();
    }