diff -urN boa-0.94.13/src/get.c /home/jacmet/localcvs/boa-0.94.13/src/get.c --- boa-0.94.13/src/get.c 2002-07-26 05:05:59.000000000 +0200 +++ /home/jacmet/localcvs/boa-0.94.13/src/get.c 2002-09-29 22:49:17.000000000 +0200 @@ -134,7 +134,25 @@ close(data_fd); return 0; } - req->filesize = statbuf.st_size; + + /* did the client request an range? */ + if (req->filepos != 0) + { + if (lseek(data_fd, req->filepos, SEEK_SET) == -1) + return 0; + } + + req->realsize = statbuf.st_size; + + if ((req->filesize != 0) && (statbuf.st_size > req->filesize)) + { + req->filesize -= req->filepos; + } + else + { + req->filesize = statbuf.st_size - req->filepos; + } + req->last_modified = statbuf.st_mtime; if (req->method == M_HEAD || req->filesize == 0) { @@ -143,7 +161,8 @@ return 0; } - if (req->filesize > MAX_FILE_MMAP) { + /* mmapping is not supported for range requests */ + if ((req->filesize > MAX_FILE_MMAP) || (req->filepos != 0)) { send_r_request_ok(req); /* All's well */ req->status = PIPE_READ; req->cgi_status = CGI_BUFFER; diff -urN boa-0.94.13/src/globals.h /home/jacmet/localcvs/boa-0.94.13/src/globals.h --- boa-0.94.13/src/globals.h 2002-07-24 05:03:59.000000000 +0200 +++ /home/jacmet/localcvs/boa-0.94.13/src/globals.h 2002-09-29 22:38:18.000000000 +0200 @@ -114,6 +114,7 @@ #ifdef ACCEPT_ON char accept[MAX_ACCEPT_LENGTH]; /* Accept: fields */ #endif + unsigned long realsize; /* for http range request */ }; typedef struct request request; diff -urN boa-0.94.13/src/request.c /home/jacmet/localcvs/boa-0.94.13/src/request.c --- boa-0.94.13/src/request.c 2002-07-24 05:03:59.000000000 +0200 +++ /home/jacmet/localcvs/boa-0.94.13/src/request.c 2002-09-29 22:40:28.000000000 +0200 @@ -698,6 +698,20 @@ req->header_user_agent = value; if (!add_cgi_env(req, "USER_AGENT", value, 1)) return 0; + } else if (!memcmp(line, "RANGE", 6)) { + /* range must be in bytes */ + if (!memcmp(value, "bytes=",6)) + { + value += 6; + req->filepos = (unsigned long)atoll(value); + value = strchr(value,'-'); + /* was there an end position? */ + if (value != NULL) + { + req->filesize = (unsigned long)atoll(value); + } + return 1; + } } else { if (!add_cgi_env(req, line, value, 1)) return 0; diff -urN boa-0.94.13/src/response.c /home/jacmet/localcvs/boa-0.94.13/src/response.c --- boa-0.94.13/src/response.c 2002-06-06 07:08:54.000000000 +0200 +++ /home/jacmet/localcvs/boa-0.94.13/src/response.c 2002-09-29 22:47:37.000000000 +0200 @@ -41,6 +41,20 @@ req_write(req, "\r\n"); } +void print_content_range(request * req) +{ + if (req->filepos != 0) + { + req_write(req, "Content-Range: "); + req_write(req, simple_itoa(req->filepos)); + req_write(req, "-"); + req_write(req, simple_itoa(req->filepos + req->filesize - 1)); + req_write(req, "/"); + req_write(req, simple_itoa(req->filepos + req->realsize)); + req_write(req, "\r\n"); + } +} + void print_last_modified(request * req) { static char lm[] = "Last-Modified: " @@ -91,6 +105,7 @@ print_content_length(req); print_last_modified(req); print_content_type(req); + print_content_range(req); req_write(req, "\r\n"); } }