Pliant talk forum

Pliant talk forum

Bug report: browse_source failure under windows

It hase became impossible to browse_source under windows, but I don't
remenber for how long.
Message posted by michel on 2004/05/02 13:06:13
If under windows I ask for mysite.index.page (or an other .page) i got an erro message HTTP 404 and you can see below the 
HTML server trace, being loaded as administrator. As you can see the server consiser me as user "0"
The same thing accurs if I ask for browse_file and I click on the name of a file,
but if I click on "view" or "edit" I am considered as administrator, the trace is good and the result displayed.

Under linux, on the same machine, with the same pliant tree but the binaries and the same pliant_datadata and pliant_security,
all is OK


connection 046AXMI start at 2004/05/02 13:03:53 from 10.0.0.1
query GET /index.page HTTP/1.1
option Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
option Accept-Language: fr,en;q=0.5
option Accept-Encoding: gzip, deflate
option User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
option Host: saulsaie
option Connection: Keep-Alive
user  0 : everybody browse_source browse_file 
site is saulsaie.chats
answer HTTP/1.1 301 Moved Permanently
answer Server: Pliant/91
answer Content-Length: 528
answer Content-Type: text/html
answer Location: http://saulsaie.chats/index.page/
connection 046AXMI11 start at 2004/05/02 13:03:53 from 10.0.0.1
query GET /index.page/ HTTP/1.1
option Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
option Accept-Language: fr,en;q=0.5
option Accept-Encoding: gzip, deflate
option User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
option Host: saulsaie.chats
option Connection: Keep-Alive
user  0 : everybody browse_source browse_file 
site is saulsaie.chats
requested an unknown page /index.page/
answer HTTP/1.1 404 Not Found
answer Server: Pliant/91
answer Expires: 0
answer Content-Length: 175
answer Content-Type: text/html
Message posted by hubert.tonneau on 2004/05/02 13:10:58
If you don't have a line like this one in the trace:
option Authorization: Basic ...
then it means that you are not logged in, unless you use Pliant secured proxy
to connect to the server.

So everything looks fine to me.
Message posted by michel on 2004/05/02 13:41:11
If I request for mysite/ I  have the trace with the requered sentance (trace, first part), but without changing anything I ask for
"index.page" I get 404 and the trace I 've send first.
If iI ask for an other service requiring administrator right I am still logged.

Soory to cut a part but it is too long for transfer.

connection 046AZES start at 2004/05/02 13:42:27 from 10.0.0.1
query GET / HTTP/1.1
option Host: saulsaie
option User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; fr-FR; rv:1.6) Gecko/20040113
option Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,image/jpeg,image/gif;q=0.2,*/*;q=0.1
option Accept-Language: fr,en;q=0.5
option Accept-Encoding: gzip,deflate
option Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
option Keep-Alive: 300
option Connection: keep-alive
option Referer: http://saulsaie/
option Authorization: Basic cm9vdDpnb3VyYmFs
option Cache-Control: max-age=0
user root 1 : everybody browse_source browse_file  mail administrator
site is saulsaie.chats
answer HTTP/1.1 200 OK
answer Server: Pliant/91
answer Pragma: no-cache
answer Content-Type: text/html; charset=iso-8859-1
answer Content-Encoding: deflate
answer Transfer-Encoding: chunked
connection 046AZES restart at 2004/05/02 13:42:27 from 10.0.0.1
query GET /common/91/pliant.js HTTP/1.1
option Host: saulsaie
option User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; fr-FR; rv:1.6) Gecko/20040113
option Accept: */*
option Accept-Language: fr,en;q=0.5
option Accept-Encoding: gzip,deflate
option Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
option Keep-Alive: 300
option Connection: keep-alive
option Referer: http://saulsaie/
option If-Modified-Since: Sun, 25 Apr 2004 14:35:06 GMT
option Authorization: Basic cm9vdDpnb3VyYmFs
option Cache-Control: max-age=0
user root 1 : everybody browse_source browse_file  mail administrator
site is saulsaie.chats
answer HTTP/1.1 200 OK
answer Server: Pliant/91
Message posted by pom on 2004/05/02 21:39:25
After some researches, I think I've found the enormous bug.

Here is what happens:
before giving up to default.page (that will handle ".page" extentions),
the HTTP server first tries to add a "/" (could it be a dirdctory).

So, it calls file_query, that initializes info:name with "/index.page/"
and calls query method on the native file system.
We are under win32. So, the method removes the trailing "/" and tests
wether a file or directory exists (this is the case: regular file /index.page
exists). Then it returns!
So, file_query will return ok. Remains the call to is_directory method
that will also reply ok as the name ends with "/" (it has not been changed).

Thus, the server will redirect the request to "/index.page/", and he
will eventually fail as the directiry does not exist !

Conclusion:

The query method in /pliant/language/stream/native.pli should
1/ remove the leading "/" and readd it only if the file is a directory,
2/ fail if a directory is asked for and a regular file is found.
Message posted by hubert.tonneau on 2004/05/02 21:54:49
Is the following new version of 'query' method correct ?

  eif os_api="win32"
    var Str wname := replace filename "/" "\"
    if filename:len>1 and (filename filename:len-1)="/":0
      if not (filename:len>2 and (filename filename:len-2)=":":0)
        wname := wname 0 wname:len-1
    var Int handle := os_FindFirstFile wname (var os_FIND_DATA data)
    if handle=os_INVALID_HANDLE_VALUE
      return failure
    if (data:dwFileAttributes .and. os_FILE_ATTRIBUTE_DIRECTORY)<>0 and (filename:len=0 or filename:(filename:len-1)<>"/")
      info name += "/"
    info size := data nFileSizeLow
    info:datetime seconds := os_datetime_origin:seconds + data:ftLastWriteTime:dwLowDateTime*(100*0.1^9)+data:ftLastWriteTime:dwHighDateTime*(100*0.1^9*2.0^32)
    os_FindClose handle
    status := success
    if wname:len<filename:len and not info:is_directory
      status := failure
Message posted by pom on 2004/05/02 23:12:18
Could be bad for "/" (wname will be "\") so wname:len=filename:len.
The following seems ok.

  eif os_api="win32"
    var Str wname := replace filename "/" "\"
    if filename:len>1 and (filename filename:len-1)="/":0
      if not (filename:len>2 and (filename filename:len-2)=":":0)
        wname := wname 0 wname:len-1
    var Int handle := os_FindFirstFile wname (var os_FIND_DATA data)
    if handle=os_INVALID_HANDLE_VALUE
      return failure
    if (data:dwFileAttributes .and. os_FILE_ATTRIBUTE_DIRECTORY)<>0 and (filename:len=0 or filename:(filename:len-1)<>"/")
      info name += "/"
    info size := data nFileSizeLow
    info:datetime seconds := os_datetime_origin:seconds + data:ftLastWriteTime:dwLowDateTime*(100*0.1^9)+data:ftLastWriteTime:dwHighDateTime*(100*0.1^9*2.0^32)
    os_FindClose handle
    status := success
    if filename:len>0 and (filename filename:len-1)="/":0 and not info:is_directory
      status := failure
Message posted by hubert.tonneau on 2004/05/02 23:15:46
> Could be bad for "/" (wname will be "\") so wname:len=filename:len.

'/' is a directory, so where is the problem ?
Message posted by pom on 2004/05/03 10:51:50
It is simpler to include the case of the root, than simply saying
that "\" always is a directory (you never know what may happen with windows...).
Message posted by michel on 2004/05/16 09:43:20

Correction

Done by Patrice and verified.

On the file "/pliant/language/stream/native.pli" replace the lines
110     status := success
and
126    status := success

by the same lines :
          if (filename filename:len-1)="/" and (data:dwFileAttributes .and. os_FILE_ATTRIBUTE_DIRECTORY)=0
            status := failure
         else
           status := success
It runs fine with windows and must run with os2

Michel