182 } |
182 } |
183 |
183 |
184 int dir_redirect(pblock *pb, Session *sn, Request *rq) { |
184 int dir_redirect(pblock *pb, Session *sn, Request *rq) { |
185 char *path = pblock_findkeyval(pb_key_path, rq->vars); |
185 char *path = pblock_findkeyval(pb_key_path, rq->vars); |
186 |
186 |
187 // TODO: VFS support |
187 VFSContext *vfs = vfs_request_context(sn, rq); |
188 |
188 |
189 struct stat s; |
189 struct stat s; |
190 if(stat(path, &s) != 0) { |
190 if(vfs_stat(vfs, path, &s) != 0) { |
191 return REQ_NOACTION; |
191 return REQ_NOACTION; |
192 } |
192 } |
193 |
193 |
194 // TODO: remove code duplication (service.c) |
194 // TODO: remove code duplication (service.c) |
|
195 // TODO: make response code configurable |
195 if(S_ISDIR(s.st_mode) && path[strlen(path)-1] != '/') { |
196 if(S_ISDIR(s.st_mode) && path[strlen(path)-1] != '/') { |
196 pblock_nvinsert("content-length", "0", rq->srvhdrs); |
197 pblock_nvinsert("content-length", "0", rq->srvhdrs); |
197 pblock_removekey(pb_key_content_type, rq->srvhdrs); |
198 pblock_removekey(pb_key_content_type, rq->srvhdrs); |
198 char *uri = pblock_findkeyval(pb_key_uri, rq->reqpb); |
199 char *uri = pblock_findkeyval(pb_key_uri, rq->reqpb); |
199 size_t urilen = strlen(uri); |
200 size_t urilen = strlen(uri); |