FTP problem: Get dir listing when expecting 404 Not Found

Renate Bahnemann <[email protected]>
Newsgroups gmane.comp.lib.libwww
Message-ID <[email protected]>
Hi

I am new to libwww but have managed to integrate libwww into our
application to retrieve small ASCII files transparently from either an
ftp or webserver.

However, I've hit a snag and would like to propose a small patch that
gets around the problem.

Problem occurs for the following:

ftp://<host>:<port>/<top-dir>/<invalid-dir>/<filename>
	returns an empty directory listing,
	I expected "404 Not Found" error.

By comparison the following scenario's produce:

ftp://<host>:<port>/<top-dir>/<valid-dir>
	returns "404 Not Found"

ftp://<host>:<port>/<top-dir>/<valid-dir>/
	returns directory listing

ftp://<host>:<port>/<top-dir>/<invalid-dir>
	return "404 Not Found"

I am wondering whether the current behaviour of the library conforms to
paragraph 3.2.2 of RFC 1738.

Here is a portion of the trace of the communication between the client
and the server:
IN is the client
OUT is the server
   ....	
   OUT 230 Guest login ok, access restrictions apply.
   IN  TYPE I
   OUT 200 Type set to I.
   IN  PORT 192,168,35,47,153,217
   OUT 200 PORT command successful.
   IN  RETR /pub/nonsuch/anyfile
   OUT 550 /pub/nonsuch/anyfile: No such file or directory.
   IN  CWD /
   OUT 250 CWD command successful.
   IN  CWD pub
   OUT 250 CWD command successful.
   IN  CWD nonsuch
   OUT 550 nonsuch: No such file or directory.
   IN  SYST
   OUT 215 UNIX Type: L8 Version: SUNOS
   IN  LIST anyfile
   OUT 150 Binary data connection for /bin/ls (192.168.35.47,39385) (0
bytes).
   OUT 226 Binary Transfer complete.

Stepping through the code I found the code that causes this to be in
HTFTP.c(v1.109):
   1568: 	    else if (!FTP_DIR(data) && !data->stream_error) {
   1569: 		FTPListType(data, ctrl->server);

If I delete the above lines, I get the results that I expect and am
wondering whether the changes that were applied to CVS versions 1.95 and
1.104 have not made this code redundant.

I am attaching a patch that shows my changes.
Patch tests OK with: 
	patch HTFTP.c HTFTP.patch

(My platform is Solaris 5.7.
Also the application defaults to FTP_DEFAULT_TRANSFER_MODE (i.e. 'I'))

Is my 'fix' valid or am I misunderstanding something and making a
mistake in my application?

Regards
Renate
HTFTP.patch (text/plain, 747 B)
*** HTFTP.c.orig	Fri Aug  8 19:35:58 2003
--- HTFTP.c	Fri Aug  8 19:29:57 2003
***************
*** 1563,1575 ****
  		ctrl->state = FTP_SUCCESS;
  	    else if (status == HT_OK)
  		ctrl->state = FTP_NEED_DCON;
! 	    else if (HTRequest_method(request) == METHOD_PUT)
  		ctrl->state = FTP_ERROR;
- 	    else if (!FTP_DIR(data) && !data->stream_error) {
- 		FTPListType(data, ctrl->server);
- 		ctrl->state = FTP_NEED_SERVER;         /* Try a dir instead? */
- 	    } else
- 		ctrl->state = FTP_ERROR;
  	    break;
  
  	  case FTP_NEED_SERVER:
--- 1563,1570 ----
  		ctrl->state = FTP_SUCCESS;
  	    else if (status == HT_OK)
  		ctrl->state = FTP_NEED_DCON;
! 	    else
  		ctrl->state = FTP_ERROR;
  	    break;
  
  	  case FTP_NEED_SERVER:
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.