зеркало из https://github.com/mozilla/pjs.git
228 строки
3.6 KiB
C
228 строки
3.6 KiB
C
/* ***** BEGIN LICENSE BLOCK *****
|
|
* Version: MPL 1.1
|
|
*
|
|
* The contents of this file are subject to the Mozilla Public License Version
|
|
* 1.1 (the "License"); you may not use this file except in compliance with
|
|
* the License. You may obtain a copy of the License at
|
|
* http://www.mozilla.org/MPL/
|
|
*
|
|
* Software distributed under the License is distributed on an "AS IS" basis,
|
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
|
* for the specific language governing rights and limitations under the
|
|
* License.
|
|
*
|
|
* The Original Code is SniffURI.
|
|
*
|
|
* The Initial Developer of the Original Code is
|
|
* Erik van der Poel <erik@vanderpoel.org>.
|
|
* Portions created by the Initial Developer are Copyright (C) 1998-2005
|
|
* the Initial Developer. All Rights Reserved.
|
|
*
|
|
* Contributor(s):
|
|
*
|
|
* ***** END LICENSE BLOCK ***** */
|
|
|
|
#include "all.h"
|
|
|
|
static char *limitURLs[] =
|
|
{
|
|
NULL,
|
|
NULL
|
|
};
|
|
|
|
static URL *lastURL = NULL;
|
|
static URL *urls = NULL;
|
|
|
|
static void
|
|
addURLFunc(App *app, URL *url)
|
|
{
|
|
lastURL->next = url;
|
|
lastURL = url;
|
|
}
|
|
|
|
static void
|
|
grab(char *dir, unsigned char *url, HTTP *http)
|
|
{
|
|
char *add;
|
|
int baseLen;
|
|
FILE *file;
|
|
char *p;
|
|
char *slash;
|
|
char *str;
|
|
|
|
baseLen = strlen(limitURLs[0]);
|
|
if (strncmp((char *) url, limitURLs[0], baseLen))
|
|
{
|
|
fprintf(stderr, "no match: %s vs %s\n", url, limitURLs[0]);
|
|
return;
|
|
}
|
|
|
|
if (url[strlen((char *) url) - 1] == '/')
|
|
{
|
|
add = "index.html";
|
|
}
|
|
else
|
|
{
|
|
add = "";
|
|
}
|
|
|
|
str = calloc(strlen(dir) + 1 + strlen((char *) url + baseLen) +
|
|
strlen(add) + 1, 1);
|
|
if (!str)
|
|
{
|
|
fprintf(stderr, "cannot calloc string\n");
|
|
exit(0);
|
|
}
|
|
strcpy(str, dir);
|
|
strcat(str, "/");
|
|
strcat(str, (char *) url + baseLen);
|
|
p = strchr(str, '#');
|
|
if (p)
|
|
{
|
|
*p = 0;
|
|
}
|
|
strcat(str, add);
|
|
p = str;
|
|
while (1)
|
|
{
|
|
slash = strchr(p, '/');
|
|
if (!slash)
|
|
{
|
|
break;
|
|
}
|
|
*slash = 0;
|
|
if (mkdir(str, 0777))
|
|
{
|
|
if (errno != EEXIST)
|
|
{
|
|
perror("mkdir");
|
|
}
|
|
}
|
|
*slash = '/';
|
|
p = slash + 1;
|
|
}
|
|
file = fopen(str, "w");
|
|
if (!file)
|
|
{
|
|
fprintf(stderr, "cannot open file %s for writing\n", str);
|
|
exit(0);
|
|
}
|
|
bufSetFD(http->in, fileno(file));
|
|
bufSet(http->in, http->body);
|
|
bufWrite(http->in);
|
|
fclose(file);
|
|
free(str);
|
|
}
|
|
|
|
static void
|
|
usage(char *prog)
|
|
{
|
|
fprintf(stderr, "%s [ -d dir ] [ -u uri ]\n", prog);
|
|
exit(0);
|
|
}
|
|
|
|
int
|
|
main(int argc, char *argv[])
|
|
{
|
|
char *dir;
|
|
HTTP *http;
|
|
int i;
|
|
char *prog;
|
|
URL *url;
|
|
|
|
if (!netInit())
|
|
{
|
|
return 1;
|
|
}
|
|
if (!threadInit())
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
prog = strrchr(argv[0], '/');
|
|
if (prog)
|
|
{
|
|
prog++;
|
|
}
|
|
else
|
|
{
|
|
prog = argv[0];
|
|
}
|
|
|
|
dir = NULL;
|
|
for (i = 1; i < argc; i++)
|
|
{
|
|
if (!strcmp(argv[i], "-d"))
|
|
{
|
|
if ((++i < argc) && (!dir))
|
|
{
|
|
dir = argv[i];
|
|
}
|
|
else
|
|
{
|
|
usage(prog);
|
|
}
|
|
}
|
|
else if (!strcmp(argv[i], "-u"))
|
|
{
|
|
if ((++i < argc) && (!limitURLs[0]))
|
|
{
|
|
limitURLs[0] = argv[i];
|
|
}
|
|
else
|
|
{
|
|
usage(prog);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
usage(prog);
|
|
}
|
|
}
|
|
if (!dir)
|
|
{
|
|
dir = "test/grab";
|
|
}
|
|
if (!limitURLs[0])
|
|
{
|
|
limitURLs[0] = "http://sniffuri.org/";
|
|
}
|
|
|
|
addURLInit(addURLFunc, limitURLs, NULL);
|
|
|
|
url = urlParse((unsigned char *) limitURLs[0]);
|
|
urls = url;
|
|
lastURL = url;
|
|
while (url)
|
|
{
|
|
appDefault.data = url;
|
|
http = httpProcess(&appDefault, url, NULL, NULL);
|
|
if (http)
|
|
{
|
|
switch (http->status)
|
|
{
|
|
case 200: /* OK */
|
|
grab(dir, url->url, http);
|
|
break;
|
|
case 302: /* Moved Temporarily */
|
|
break;
|
|
case 403: /* Forbidden */
|
|
break;
|
|
case 404: /* Not Found */
|
|
break;
|
|
default:
|
|
printf("status %d\n", http->status);
|
|
break;
|
|
}
|
|
httpFree(http);
|
|
}
|
|
else
|
|
{
|
|
printf("httpProcess failed: %s\n", url->url);
|
|
}
|
|
url = url->next;
|
|
}
|
|
|
|
return 0;
|
|
}
|