mget from disk

Hello. I've modified libwww/Library/examples/mget.c
so that it can get files from disk, and I've noticed
a peculiarity. 

When I use mget to download a web page from the
network, everything works as it should. However, 
when I try to load a file from disk, the first
load seems to work, but then libwww seems to get
hung up in its event loop. 

The terminate handler is never called, and I must
eventually hit Control-C. 

When I do hit the break key, gdb says that
processing stopped in the select() function. 
Is this a bug in my program, in the library, 
or just a misuse of features?

I'm using Linux(elf). 

Here is my modified mget.c:

/*
**      @(#) $Id: mget.c,v 1.2 2000/07/20 02:45:29 appman Exp $
**      
**      More libwww samples can be found at
"http://www.w3.org/Library/Examples/"
**      
**      Copyright © 1995-1998 World Wide Web Consortium, (Massachusetts
**      Institute of Technology, Institut National de Recherche en
**      Informatique et en Automatique, Keio University). All Rights
**      Reserved. This program is distributed under the W3C's Software
**      Intellectual Property License. This program is distributed in
the hope
**      that it will be useful, but WITHOUT ANY WARRANTY; without even
the
**      implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
**      PURPOSE. See W3C License http://www.w3.org/Consortium/Legal/
for more
**      details.
**
**      Sample showing how fire off many GET requests and then enter
the event loop
**      This does only work on GET and HEAD methods as other methods
can't be
**      pipelined this way. If issuing lots of POST requests, for
example, then
**      use the HTTP_setConnectionMode(HTTP_11_NO_PIPELINING) function
call
*/

#include "WWWLib.h"
#include "WWWInit.h"

#define MAX_COUNT       1024

PRIVATE int remaining = 0;

/* ----------------------------------------------------------------- */

PRIVATE int printer (const char * fmt, va_list pArgs)
{
    return (vfprintf(stdout, fmt, pArgs));
}

PRIVATE int tracer (const char * fmt, va_list pArgs)
{
    return (vfprintf(stderr, fmt, pArgs));
}

PRIVATE int terminate_handler (HTRequest * request, HTResponse *
response,
                               void * param, int status) 
{
    HTChunk * chunk = (HTChunk *) HTRequest_context(request);

    /* Check for status */
    HTPrint("Load %d resulted in status %d\n", remaining, status);

#if 0
    if (status == HT_LOADED && chunk && HTChunk_data(chunk))
        HTPrint("%s", HTChunk_data(chunk));
#endif

    /* Remember to delete our chunk of data */
    if (chunk) HTChunk_delete(chunk);
        
    /* We are done with this request */
    HTRequest_delete(request);

    if (--remaining <= 0) {

        /* Terminate libwww */
        HTProfile_delete();

        exit(0);
    }

    return HT_OK;
}

int main (int argc, char ** argv)
{
    HTRequest * request = NULL;
        char * local_addr = NULL;
    char * addr = NULL;
    int max_cnt = 0;
    BOOL status = YES;
    const char * cwd = 0;

    /* Create a new premptive client */
    HTProfile_newNoCacheClient("libwww-MGET", "1.0");

    /* Need our own trace and print functions */
    HTPrint_setCallback(printer);
    HTTrace_setCallback(tracer);

    /* Add our own filter to handle termination */
    HTNet_addAfter(terminate_handler, NULL, NULL, HT_ALL,
HT_FILTER_LAST);

    /* Turn on tracing */
#if 0
    HTSetTraceMessageMask("sop");
#endif

    /* Handle command line args */
    if (argc >= 3) {
        max_cnt = atoi(argv[2]);

                /***********************************
                Below is my modification. It should allow
                disk files to be loaded as well as Internet
                web pages. 
                ***********************************/
#if 0
        addr = argv[1];
#else
        cwd = HTGetCurrentDirectoryURL ();
        addr = HTParse (argv[1], cwd, PARSE_ALL);
#endif

        if (max_cnt<0 || max_cnt>MAX_COUNT) max_cnt=1;
        remaining = max_cnt;
    } else {
        HTPrint("Type the URI of the destination you want to GET and
the number of times you want to get it\n");
        HTPrint("\t%s <destination> <count>\n", argv[0]);
        HTPrint("For example, %s http://www.w3.org 2\n", argv[0]);
        return -1;
    }

    if (addr && *addr) {
        HTChunk * chunk;
        int cnt = 0;

        /* We don't wany any progress notification or other user stuff
*/
        HTAlert_setInteractive(NO);

        /* Now issue the requests */
        HTPrint("Issuing %d GET request(s) on `%s\'\n", max_cnt, addr);

        for (cnt=0; cnt<max_cnt; cnt++) {

            /* Create a request */
            request = HTRequest_new();

            /* Set the output format to source */
            HTRequest_setOutputFormat(request, WWW_SOURCE);

            /* Now start the load */
            if ((chunk = HTLoadToChunk(addr, request)) == NULL) {
                status = NO;
                break;
            } else
                HTRequest_setContext(request, chunk);
        }

        /* Go into the event loop... */
        if (status) HTEventList_loop(request);

    }

    return 0;
}




__________________________________________________
Do You Yahoo!?
Get Yahoo! Mail – Free email you can access from anywhere!
http://mail.yahoo.com/

Received on Thursday, 20 July 2000 08:37:23 UTC