mirror of
https://github.com/rkd77/elinks.git
synced 2024-12-04 14:46:47 -05:00
contrib: Tool for view pages offline.
This tool is intended for developers to make debugging ELinks more fun.
This commit is contained in:
parent
e0984481b0
commit
4e310fd9aa
5
contrib/proxy/Makefile
Normal file
5
contrib/proxy/Makefile
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
all: /tmp/log gen
|
||||||
|
./gen
|
||||||
|
|
||||||
|
gen: gen.c
|
||||||
|
$(CC) -g -o $@ $<
|
29
contrib/proxy/README
Normal file
29
contrib/proxy/README
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
This program generate proxy.py - a tool for developers to find bugs offline.
|
||||||
|
How to use it:
|
||||||
|
1) make the change in src/network/socket.c and recompile the ELinks
|
||||||
|
/* To enable logging of tranfers, for debugging purposes. */
|
||||||
|
#if 0
|
||||||
|
^^^^^
|
||||||
|
set this to 1
|
||||||
|
|
||||||
|
2) set connection.max_connections = 1
|
||||||
|
set connection.max_connections_to_host = 1
|
||||||
|
|
||||||
|
3) run the ELinks and gather data.
|
||||||
|
|
||||||
|
4) revert "#if 1 change" and recompile ELinks.
|
||||||
|
|
||||||
|
5) run make in directory with this file. The proxy.py should be generated
|
||||||
|
and some files with .txt extension.
|
||||||
|
|
||||||
|
6) run proxy.py
|
||||||
|
|
||||||
|
7) run ELinks and set protocol.http.proxy = localhost:8000
|
||||||
|
|
||||||
|
8) repeat previous session, go to the same pages, etc.
|
||||||
|
|
||||||
|
If you want to use https use browser scripting to replace
|
||||||
|
'https' with 'http' in follow_url.
|
||||||
|
|
||||||
|
Enjoy,
|
||||||
|
Witek
|
177
contrib/proxy/gen.c
Normal file
177
contrib/proxy/gen.c
Normal file
@ -0,0 +1,177 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
struct stat st;
|
||||||
|
char *file = "/tmp/log";
|
||||||
|
unsigned char *data;
|
||||||
|
int counter = 0;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
unsigned char *string;
|
||||||
|
unsigned char *host;
|
||||||
|
unsigned char *data;
|
||||||
|
int length;
|
||||||
|
} tab[100000]; /* should be enough */
|
||||||
|
|
||||||
|
unsigned char header[] =
|
||||||
|
"#!/usr/bin/env python\n"
|
||||||
|
"import BaseHTTPServer\n\n";
|
||||||
|
|
||||||
|
unsigned char footer[] =
|
||||||
|
"class Serwer(BaseHTTPServer.BaseHTTPRequestHandler):\n"
|
||||||
|
"\tdef do_GET(self):\n"
|
||||||
|
"\t\tglobal slownik\n"
|
||||||
|
"\t\tof = open(slownik[self.path])\n"
|
||||||
|
"\t\tprint (self.path)\n"
|
||||||
|
"\t\tself.wfile.write(of.read())\n"
|
||||||
|
"\t\tof.close()\n\n"
|
||||||
|
"\tdef do_POST(self):\n"
|
||||||
|
"\t\tself.do_GET()\n\n"
|
||||||
|
"def run(server_class = BaseHTTPServer.HTTPServer, handler_class = Serwer):\n"
|
||||||
|
"\tserver_address = ('', 8000)\n"
|
||||||
|
"\thttpd = server_class(server_address, handler_class)\n"
|
||||||
|
"\thttpd.serve_forever()\n\n"
|
||||||
|
"run()\n";
|
||||||
|
|
||||||
|
static unsigned char *
|
||||||
|
find(unsigned char *from, unsigned char *key)
|
||||||
|
{
|
||||||
|
unsigned char *end = data + st.st_size;
|
||||||
|
unsigned char *beg;
|
||||||
|
int l = strlen(key);
|
||||||
|
|
||||||
|
for (beg = from;; beg++) {
|
||||||
|
beg = memchr(beg, key[0], end - beg);
|
||||||
|
if (!beg)
|
||||||
|
break;
|
||||||
|
if (!strncmp(beg, key, l))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return beg;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
parse(void)
|
||||||
|
{
|
||||||
|
unsigned char *current = data;
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
unsigned char *conn = find(current, "CONNECTION:");
|
||||||
|
unsigned char *get = find(current, "GET /");
|
||||||
|
unsigned char *post = find(current, "POST /");
|
||||||
|
unsigned char *host, *space, *http;
|
||||||
|
size_t enter;
|
||||||
|
|
||||||
|
if (counter) {
|
||||||
|
unsigned char *min = data + st.st_size;
|
||||||
|
|
||||||
|
if (conn)
|
||||||
|
min = conn;
|
||||||
|
if (get && get < min)
|
||||||
|
min = get;
|
||||||
|
if (post && post < min)
|
||||||
|
min = post;
|
||||||
|
tab[counter - 1].length = min - http;
|
||||||
|
}
|
||||||
|
if (get && post) {
|
||||||
|
if (get < post) {
|
||||||
|
current = get + 4;
|
||||||
|
} else {
|
||||||
|
current = post + 5;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (get) {
|
||||||
|
current = get + 4;
|
||||||
|
} else if (post) {
|
||||||
|
current = post + 5;
|
||||||
|
} else {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
space = strchr(current, ' ');
|
||||||
|
if (!space)
|
||||||
|
return;
|
||||||
|
|
||||||
|
host = find(space + 1, "Host: ");
|
||||||
|
if (!host)
|
||||||
|
return;
|
||||||
|
|
||||||
|
*space = '\0';
|
||||||
|
tab[counter].string = current;
|
||||||
|
host += 6;
|
||||||
|
enter = strcspn(host, "\r\n\0");
|
||||||
|
host[enter] = '\0';
|
||||||
|
tab[counter].host = host;
|
||||||
|
|
||||||
|
http = find(host + enter + 1, "HTTP/");
|
||||||
|
if (!http)
|
||||||
|
return;
|
||||||
|
tab[counter++].data = http;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
dicts(FILE *f)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
fprintf(f, "slownik = {\n");
|
||||||
|
for (i = 0; i < counter - 1; i++) {
|
||||||
|
fprintf(f, "\t'http://%s%s' : '%d.txt',\n", tab[i].host, tab[i].string, i);
|
||||||
|
}
|
||||||
|
for (; i < counter; i++) {
|
||||||
|
fprintf(f, "\t'http://%s%s' : '%d.txt'\n", tab[i].host, tab[i].string, i);
|
||||||
|
}
|
||||||
|
fprintf(f, "}\n\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
save(void)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
FILE *f;
|
||||||
|
|
||||||
|
for (i = 0; i < counter; i++) {
|
||||||
|
char buf[12];
|
||||||
|
|
||||||
|
snprintf(buf, 12, "%d.txt", i);
|
||||||
|
f = fopen(buf, "w");
|
||||||
|
if (!f)
|
||||||
|
return;
|
||||||
|
fwrite(tab[i].data, 1, tab[i].length, f);
|
||||||
|
fclose(f);
|
||||||
|
}
|
||||||
|
f = fopen("proxy.py", "w");
|
||||||
|
if (!f)
|
||||||
|
return;
|
||||||
|
fprintf(f, "%s", header);
|
||||||
|
dicts(f);
|
||||||
|
fprintf(f, "%s", footer);
|
||||||
|
fclose(f);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
FILE *f;
|
||||||
|
|
||||||
|
if (argc > 1)
|
||||||
|
file = argv[1];
|
||||||
|
f = fopen(file, "r");
|
||||||
|
if (!f)
|
||||||
|
return 1;
|
||||||
|
stat(file, &st);
|
||||||
|
data = calloc(1, st.st_size + 1);
|
||||||
|
if (!data)
|
||||||
|
return 2;
|
||||||
|
fread(data, 1, st.st_size, f);
|
||||||
|
fclose(f);
|
||||||
|
|
||||||
|
parse();
|
||||||
|
save();
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user