src/server/safs/service.c

changeset 59
ab25c0a231d0
parent 58
66c22e54aa90
child 69
4a10bc0ee80d
--- a/src/server/safs/service.c	Tue Mar 19 17:38:32 2013 +0100
+++ b/src/server/safs/service.c	Mon May 06 13:44:27 2013 +0200
@@ -61,11 +61,28 @@
     }
 
     /* get stat */
-    if (vfs_fstat(vfs, fd, s) != 0) {
+    if(vfs_fstat(vfs, fd, s) != 0) {
         //perror("prepare_service_file: stat");
         protocol_status(sn, rq, 500, NULL);
         return NULL;
     }
+    
+    // check if the file is a directory
+    if(S_ISDIR(s->st_mode)) {
+        pblock_nvinsert("content-length", "0", rq->srvhdrs);
+        pblock_removekey(pb_key_content_type, rq->srvhdrs);
+        char *uri = pblock_findkeyval(pb_key_uri, rq->reqpb);
+        size_t urilen = strlen(uri);
+        char *location = pool_malloc(sn->pool, urilen + 2);
+        memcpy(location, uri, urilen);
+        location[urilen] = '/';
+        location[urilen+1] = '\0';
+        pblock_kvinsert(pb_key_location, location, urilen + 1, rq->srvhdrs);
+        protocol_status(sn, rq, 302, NULL);
+        http_start_response(sn, rq);
+        vfs_close(fd);
+        return fd;
+    }
 
     /* add content-length header*/
     char contentLength[32];
@@ -89,14 +106,16 @@
         return REQ_ABORTED;
     }
     
-    // send file
-    sendfiledata sfd;
-    sfd.fd = fd;
-    sfd.len = s.st_size;
-    sfd.offset = 0;
-    sfd.header = NULL;
-    sfd.trailer = NULL;
-    net_sendfile(sn->csd, &sfd);
+    if(!S_ISDIR(s.st_mode)) {
+        // send file
+        sendfiledata sfd;
+        sfd.fd = fd;
+        sfd.len = s.st_size;
+        sfd.offset = 0;
+        sfd.header = NULL;
+        sfd.trailer = NULL;
+        net_sendfile(sn->csd, &sfd);
+    }
     
     vfs_close(fd);
 

mercurial