Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Candidate fix for --baseurl option when used with a directory of repositories. May need fine-tuning. |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | baseUrlRepoDir |
Files: | files | file ages | folders |
SHA1: |
7063f8d4cc40b369c57193a005a1f64d |
User & Date: | mistachkin 2016-02-02 03:39:39.358 |
References
2016-03-17
| ||
19:32 | Simpler alternative to [7063f8d4cc]. Skips initial directory portion of PATH_INFO when building the g.zBaseURL and g.zTop used with a directory of repositories. ... (check-in: abb19e88 user: mistachkin tags: trunk) | |
2016-02-02
| ||
04:18 | Simpler alternative to [7063f8d4cc]. Skips initial directory portion of PATH_INFO when building the g.zBaseURL and g.zTop used with a directory of repositories. ... (check-in: 7d5307b4 user: mistachkin tags: altBaseUrlRepoDir) | |
Context
2016-02-02
| ||
03:39 | Candidate fix for --baseurl option when used with a directory of repositories. May need fine-tuning. ... (Closed-Leaf check-in: 7063f8d4 user: mistachkin tags: baseUrlRepoDir) | |
2016-02-01
| ||
20:38 | Add --https and --nossl options to the 'server' command. ... (check-in: b8c7af5b user: mistachkin tags: trunk) | |
Changes
Changes to src/main.c.
︙ | ︙ | |||
154 155 156 157 158 159 160 161 162 163 164 165 166 167 | int fSshClient; /* HTTP client flags for SSH client */ char *zSshCmd; /* SSH command string */ int fNoSync; /* Do not do an autosync ever. --nosync */ int fIPv4; /* Use only IPv4, not IPv6. --ipv4 */ char *zPath; /* Name of webpage being served */ char *zExtra; /* Extra path information past the webpage name */ char *zBaseURL; /* Full text of the URL being served */ char *zHttpsURL; /* zBaseURL translated to https: */ char *zTop; /* Parent directory of zPath */ const char *zContentType; /* The content type of the input HTTP request */ int iErrPriority; /* Priority of current error message */ char *zErrMsg; /* Text of an error message */ int sslNotAvailable; /* SSL is not available. Do not redirect to https: */ Blob cgiIn; /* Input to an xfer www method */ | > | 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 | int fSshClient; /* HTTP client flags for SSH client */ char *zSshCmd; /* SSH command string */ int fNoSync; /* Do not do an autosync ever. --nosync */ int fIPv4; /* Use only IPv4, not IPv6. --ipv4 */ char *zPath; /* Name of webpage being served */ char *zExtra; /* Extra path information past the webpage name */ char *zBaseURL; /* Full text of the URL being served */ char *zAltBaseURL; /* Value of --baseurl option, if any */ char *zHttpsURL; /* zBaseURL translated to https: */ char *zTop; /* Parent directory of zPath */ const char *zContentType; /* The content type of the input HTTP request */ int iErrPriority; /* Priority of current error message */ char *zErrMsg; /* Text of an error message */ int sslNotAvailable; /* SSL is not available. Do not redirect to https: */ Blob cgiIn; /* Input to an xfer www method */ |
︙ | ︙ | |||
1394 1395 1396 1397 1398 1399 1400 | const char *zHost; const char *zMode; const char *zCur; if( g.zBaseURL!=0 ) return; if( zAltBase ){ int i, n, c; | | | 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 | const char *zHost; const char *zMode; const char *zCur; if( g.zBaseURL!=0 ) return; if( zAltBase ){ int i, n, c; g.zTop = g.zBaseURL = g.zAltBaseURL = mprintf("%s", zAltBase); if( strncmp(g.zTop, "http://", 7)==0 ){ /* it is HTTP, replace prefix with HTTPS. */ g.zHttpsURL = mprintf("https://%s", &g.zTop[7]); }else if( strncmp(g.zTop, "https://", 8)==0 ){ /* it is already HTTPS, use it. */ g.zHttpsURL = mprintf("%s", g.zTop); }else{ |
︙ | ︙ | |||
1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 | */ static void process_one_web_page( const char *zNotFound, /* Redirect here on a 404 if not NULL */ Glob *pFileGlob, /* Deliver static files matching */ int allowRepoList /* Send repo list for "/" URL */ ){ const char *zPathInfo; char *zPath = NULL; int idx; int i; /* Handle universal query parameters */ if( PB("utc") ){ g.fTimeFormat = 1; }else if( PB("localtime") ){ g.fTimeFormat = 2; } /* If the repository has not been opened already, then find the ** repository based on the first element of PATH_INFO and open it. */ | > > > > > > > > > | > > | | | | 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 | */ static void process_one_web_page( const char *zNotFound, /* Redirect here on a 404 if not NULL */ Glob *pFileGlob, /* Deliver static files matching */ int allowRepoList /* Send repo list for "/" URL */ ){ const char *zPathInfo; const char *zFullPathInfo; char *zPath = NULL; int idx; int i; /* Handle universal query parameters */ if( PB("utc") ){ g.fTimeFormat = 1; }else if( PB("localtime") ){ g.fTimeFormat = 2; } /* If the repository has not been opened already, then find the ** repository based on the first element of PATH_INFO and open it. */ zPathInfo = zFullPathInfo = PD("PATH_INFO",""); /* If zAltBaseURL is present (i.e. the --baseurl option was used), ** make sure to skip over the portion of zTop that appears in the ** value of zAltBaseURL; otherwise, it may be duplicated later. */ if( g.zAltBaseURL && g.zTop ){ int nTop = strlen(g.zTop); if ( strncmp(zPathInfo, g.zTop, nTop)==0 ){ zPathInfo += nTop; } } if( !g.repositoryOpen ){ char *zRepo, *zToFree; const char *zOldScript = PD("SCRIPT_NAME", ""); char *zNewScript; int j, k; i64 szFile; i = zFullPathInfo[0]!=0; while( 1 ){ while( zFullPathInfo[i] && zFullPathInfo[i]!='/' ){ i++; } zRepo = zToFree = mprintf("%s%.*s.fossil",g.zRepositoryName,i,zFullPathInfo); /* To avoid mischief, make sure the repository basename contains no ** characters other than alphanumerics, "/", "_", "-", and ".", and ** that "-" never occurs immediately after a "/" and that "." is always ** surrounded by two alphanumerics. Any character that does not ** satisfy these constraints is converted into "_". */ |
︙ | ︙ | |||
1643 1644 1645 1646 1647 1648 1649 | } if( szFile==0 && sqlite3_strglob("*/.fossil",zRepo)!=0 ){ if( zRepo[0]=='/' && zRepo[1]=='/' ){ zRepo++; j--; } szFile = file_size(zRepo); /* this should only be set from the --baseurl option, not CGI */ if( g.zBaseURL && g.zBaseURL[0]!=0 && g.zTop && g.zTop[0]!=0 && file_isdir(g.zRepositoryName)==1 ){ | > | | > | | 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 | } if( szFile==0 && sqlite3_strglob("*/.fossil",zRepo)!=0 ){ if( zRepo[0]=='/' && zRepo[1]=='/' ){ zRepo++; j--; } szFile = file_size(zRepo); /* this should only be set from the --baseurl option, not CGI */ if( g.zBaseURL && g.zBaseURL[0]!=0 && g.zTop && g.zTop[0]!=0 && file_isdir(g.zRepositoryName)==1 ){ if( zPathInfo==zFullPathInfo ){ g.zBaseURL = mprintf("%s%.*s", g.zBaseURL, i, zPathInfo); g.zTop = mprintf("%s%.*s", g.zTop, i, zPathInfo); } } } if( szFile<0 && i>0 ){ const char *zMimetype; assert( fossil_strcmp(&zRepo[j], ".fossil")==0 ); zRepo[j] = 0; if( zFullPathInfo[i]=='/' && file_isdir(zRepo)==1 ){ fossil_free(zToFree); i++; continue; } if( pFileGlob!=0 && file_isfile(zRepo) && glob_match(pFileGlob, zRepo) |
︙ | ︙ | |||
1675 1676 1677 1678 1679 1680 1681 | return; } zRepo[j] = '.'; } if( szFile<1024 ){ set_base_url(0); | | | | | | | | | | | 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 | return; } zRepo[j] = '.'; } if( szFile<1024 ){ set_base_url(0); if( strcmp(zFullPathInfo,"/")==0 && allowRepoList && repo_list_page() ){ /* Will return a list of repositories */ }else if( zNotFound ){ cgi_redirect(zNotFound); }else{ #ifdef FOSSIL_ENABLE_JSON if(g.json.isJsonMode){ json_err(FSL_JSON_E_RESOURCE_NOT_FOUND,NULL,1); return; } #endif @ <h1>Not Found</h1> cgi_set_status(404, "not found"); cgi_reply(); } return; } break; } zNewScript = mprintf("%s%.*s", zOldScript, i, zFullPathInfo); cgi_replace_parameter("PATH_INFO", &zFullPathInfo[i+1]); zFullPathInfo += i; cgi_replace_parameter("SCRIPT_NAME", zNewScript); db_open_repository(zRepo); if( g.fHttpTrace ){ fprintf(stderr, "# repository: [%s]\n" "# new PATH_INFO = [%s]\n" "# new SCRIPT_NAME = [%s]\n", zRepo, zFullPathInfo, zNewScript); } } /* Find the page that the user has requested, construct and deliver that ** page. */ if( g.zContentType && strncmp(g.zContentType, "application/x-fossil", 20)==0 ){ zFullPathInfo = "/xfer"; } set_base_url(0); if( zFullPathInfo==0 || zFullPathInfo[0]==0 || (zFullPathInfo[0]=='/' && zFullPathInfo[1]==0) ){ #ifdef FOSSIL_ENABLE_JSON if(g.json.isJsonMode){ json_err(FSL_JSON_E_RESOURCE_NOT_FOUND,NULL,1); fossil_exit(0); } #endif fossil_redirect_home() /*does not return*/; }else{ zPath = mprintf("%s", zFullPathInfo); } /* Make g.zPath point to the first element of the path. Make ** g.zExtra point to everything past that point. */ while(1){ char *zAltRepo = 0; |
︙ | ︙ |