Fossil SCM

Update the "fossil server DIRECTORY" operation so that it will serve static content contained in DIRECTORY in addition to Fossil repositories.

drh 2012-11-14 17:23 trunk
Commit 87d6aa31965d7dd789d38e0faa28e313cba89f57
1 file changed +16 -4
+16 -4
--- src/main.c
+++ src/main.c
@@ -1381,27 +1381,39 @@
13811381
while( 1 ){
13821382
while( zPathInfo[i] && zPathInfo[i]!='/' ){ i++; }
13831383
zRepo = zToFree = mprintf("%s%.*s.fossil",g.zRepositoryName,i,zPathInfo);
13841384
13851385
/* To avoid mischief, make sure the repository basename contains no
1386
- ** characters other than alphanumerics, "-", "/", and "_".
1386
+ ** characters other than alphanumerics, "-", "/", "_", and "." beside
1387
+ ** "/" or ".".
13871388
*/
13881389
for(j=strlen(g.zRepositoryName)+1, k=0; zRepo[j] && k<i-1; j++, k++){
1389
- if( !fossil_isalnum(zRepo[j]) && zRepo[j]!='-' && zRepo[j]!='/' ){
1390
+ char c = zRepo[j];
1391
+ if( !fossil_isalnum(c) && c!='-' && c!='/'
1392
+ && (c!='.' || zRepo[j+1]=='/' || zRepo[j-1]=='/' || zRepo[j+1]=='.')
1393
+ ){
13901394
zRepo[j] = '_';
13911395
}
13921396
}
13931397
if( zRepo[0]=='/' && zRepo[1]=='/' ){ zRepo++; j--; }
13941398
13951399
szFile = file_size(zRepo);
1396
- if( zPathInfo[i]=='/' && szFile<0 ){
1400
+ if( szFile<0 ){
13971401
assert( fossil_strcmp(&zRepo[j], ".fossil")==0 );
13981402
zRepo[j] = 0;
1399
- if( file_isdir(zRepo)==1 ){
1403
+ if( zPathInfo[i]=='/' && file_isdir(zRepo)==1 ){
14001404
fossil_free(zToFree);
14011405
i++;
14021406
continue;
1407
+ }
1408
+ if( file_isfile(zRepo) ){
1409
+ Blob content;
1410
+ blob_read_from_file(&content, zRepo);
1411
+ cgi_set_content_type(mimetype_from_name(zRepo));
1412
+ cgi_set_content(&content);
1413
+ cgi_reply();
1414
+ return;
14031415
}
14041416
zRepo[j] = '.';
14051417
}
14061418
14071419
if( szFile<1024 ){
14081420
--- src/main.c
+++ src/main.c
@@ -1381,27 +1381,39 @@
1381 while( 1 ){
1382 while( zPathInfo[i] && zPathInfo[i]!='/' ){ i++; }
1383 zRepo = zToFree = mprintf("%s%.*s.fossil",g.zRepositoryName,i,zPathInfo);
1384
1385 /* To avoid mischief, make sure the repository basename contains no
1386 ** characters other than alphanumerics, "-", "/", and "_".
 
1387 */
1388 for(j=strlen(g.zRepositoryName)+1, k=0; zRepo[j] && k<i-1; j++, k++){
1389 if( !fossil_isalnum(zRepo[j]) && zRepo[j]!='-' && zRepo[j]!='/' ){
 
 
 
1390 zRepo[j] = '_';
1391 }
1392 }
1393 if( zRepo[0]=='/' && zRepo[1]=='/' ){ zRepo++; j--; }
1394
1395 szFile = file_size(zRepo);
1396 if( zPathInfo[i]=='/' && szFile<0 ){
1397 assert( fossil_strcmp(&zRepo[j], ".fossil")==0 );
1398 zRepo[j] = 0;
1399 if( file_isdir(zRepo)==1 ){
1400 fossil_free(zToFree);
1401 i++;
1402 continue;
 
 
 
 
 
 
 
 
1403 }
1404 zRepo[j] = '.';
1405 }
1406
1407 if( szFile<1024 ){
1408
--- src/main.c
+++ src/main.c
@@ -1381,27 +1381,39 @@
1381 while( 1 ){
1382 while( zPathInfo[i] && zPathInfo[i]!='/' ){ i++; }
1383 zRepo = zToFree = mprintf("%s%.*s.fossil",g.zRepositoryName,i,zPathInfo);
1384
1385 /* To avoid mischief, make sure the repository basename contains no
1386 ** characters other than alphanumerics, "-", "/", "_", and "." beside
1387 ** "/" or ".".
1388 */
1389 for(j=strlen(g.zRepositoryName)+1, k=0; zRepo[j] && k<i-1; j++, k++){
1390 char c = zRepo[j];
1391 if( !fossil_isalnum(c) && c!='-' && c!='/'
1392 && (c!='.' || zRepo[j+1]=='/' || zRepo[j-1]=='/' || zRepo[j+1]=='.')
1393 ){
1394 zRepo[j] = '_';
1395 }
1396 }
1397 if( zRepo[0]=='/' && zRepo[1]=='/' ){ zRepo++; j--; }
1398
1399 szFile = file_size(zRepo);
1400 if( szFile<0 ){
1401 assert( fossil_strcmp(&zRepo[j], ".fossil")==0 );
1402 zRepo[j] = 0;
1403 if( zPathInfo[i]=='/' && file_isdir(zRepo)==1 ){
1404 fossil_free(zToFree);
1405 i++;
1406 continue;
1407 }
1408 if( file_isfile(zRepo) ){
1409 Blob content;
1410 blob_read_from_file(&content, zRepo);
1411 cgi_set_content_type(mimetype_from_name(zRepo));
1412 cgi_set_content(&content);
1413 cgi_reply();
1414 return;
1415 }
1416 zRepo[j] = '.';
1417 }
1418
1419 if( szFile<1024 ){
1420

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button