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");
     }
 }
