rejetto forum
Software => HFS ~ HTTP File Server => Programmers corner => Topic started by: Mars on September 04, 2009, 10:56:34 PM
-
rejetto code:
procedure handleItem(f:Tfile);
....
if recur then url:=copy(itemFolder, ofsRelUrl, MAXINT)
else url:='';
addArray(md.table, [
'%item-folder%', itemFolder,
'%item-relative-folder%', url
]);
The text in red is the cause of the bug, its value is determined for another use from a character string the length of which is superior to the necessary real value. The chaine of origin contains characters codified under the shape %xx, where from an overestimation of the variable
The following solution requires least resources and gives a correct result.
sometime the var %folder% is not defined for events then i introduce the var %item-base-folder% which give the same result
main.pas
function Tmainfrm.getFolderPage(folder:Tfile; conn:ThttpConn; otpl:Tobject):string;
var
...
md: TmacroData;
currentFolder:string; //add by mars
procedure applySequential();
.....
procedure handleItem(f:Tfile);
...
if recur then url:=copy(itemfolder, length(currentFolder)+1, MAXINT) //mod by mars else url:='';
addArray(md.table, [
'%item-folder%', macroquote(itemFolder), //mod by mars
'%item-base-folder%', macroquote(currentFolder), //add by mars
'%item-relative-folder%', macroquote(url) //mod by mars
]);
...
url:=s
end
else
begin
if recur then
s:=copy(f.url(fullEncode), ofsRelUrl, MAXINT)+fingerprint
else
s:=f.relativeURL(fullEncode)+fingerprint;
url:=baseurl+s;
end;
addArray(md.table, [
'%item-url%', macroQuote(s),
'%item-full-url%', macroQuote(url)
]);
// select appropriate template
...
var
i: integer;
begin
...
ofsRelUrl:=length(folder.url(fullEncode))+1; //create the error when full encode is true
...
hasher:=Thasher.create();
hasher.loadFrom(folder.resource);
try
if recur then currentFolder:=optUTF8(diffTpl, folder.getFolder()+if_(not folder.isRoot,folder.name+'/')); //add by mars
listing.fromFolder( folder, conn, recur );
if not recur or (otpl <> filelistTpl) then
listing.sort(conn, diffTpl['sort by']);
....
end; // getFolderPage
usage: http://127.0.0.1/......./?recursive
[folder=file=link]
<tr><td>
%item-name%
<p>%item-folder%
<p>%folder%
<p>%item-relative-folder%
-
thank you mars,
but you are adding symbols in getFolderPage, where %folder% is defined for sure. They won't be visible in the events you say!
it should be fixed in next build.
-
always the same bug with your choice:
http://127.0.0.1/?recursive
with in the template
[file=folder=link]
<tr><td>
{.if|{.get|can delete.}{.and|{.get|can access.}|{.get|can archive item.}.}| <input type='checkbox' name='selection' value="%item-url%"> .}
{.if|{.get|is new.}|<span class='flag'> NEW </span>.}
{.if not|{.get|can access.}|<img src='/~img_lock'>.}
<a href="%item-url%"><img src="%item-icon%"> %item-name%</a>
<p> folder= %folder%
<p> item-folder= %item-folder%
<p> item-relative= %item-relative-folder%
<p> item-name= %item-name%
<p> item-url = %item-url%
<p> item-full-url= %item-full-url%
<p> item-resource = %item-resource%
---------------------------
and compare the item-folder line with the relative line : first chars are deleted
using folder.getFolder() is the best way
replace your line
ofsRelItemUrl:=length(optUTF8(diffTpl, folder.pathTill()))+3;
by this one only
ofsRelItemUrl:=length(optUTF8(diffTpl, folder.getFolder()))+1;
the time to evaluate ofsRelItemUrl is the same in each case ;)
-
i made some tests and it was working to me.
can you tell me how to reproduce the bug?
give me the paths and urls to browse.
-
this line was not perfect with recursive from root
ofsRelItemUrl:=length(optUTF8(diffTpl, folder.pathTill()))+3;
update to
ofsRelItemUrl:=length(optUTF8(diffTpl, folder.pathTill()))+if_(not folder.isRoot,2)+1;
;)
-
ok, to answer my question: the bug could be reproduced by doing a search from the root :)
thanks for the fix