3
#include<qapplication.h>
6
#include"httpconnect.h"
22
App::App(int mode, const QString &host, int port, const QString &serv, const QString &proxy_host, int proxy_port, const QString &proxy_user, const QString &proxy_pass)
27
connect(d->c, SIGNAL(connectionClosed()), SLOT(con_connectionClosed()));
28
connect(d->c, SIGNAL(readyRead()), SLOT(con_readyRead()));
33
if(mode == 0 || mode == 1) {
34
BSocket *s = new BSocket;
36
connect(s, SIGNAL(connected()), SLOT(st_connected()));
37
connect(s, SIGNAL(error(int)), SLOT(st_error(int)));
39
fprintf(stderr, "adconn: Connecting to %s:%d ...\n", host.latin1(), port);
40
s->connectToHost(host, port);
43
fprintf(stderr, "adconn: Connecting to '%s' server at %s ...\n", serv.latin1(), host.latin1());
44
s->connectToServer(host, serv);
48
HttpConnect *s = new HttpConnect;
50
connect(s, SIGNAL(connected()), SLOT(st_connected()));
51
connect(s, SIGNAL(error(int)), SLOT(st_error(int)));
52
fprintf(stderr, "adconn: Connecting to %s:%d via %s:%d (https)\n", host.latin1(), port, proxy_host.latin1(), proxy_port);
53
if(!proxy_user.isEmpty())
54
s->setAuth(proxy_user, proxy_pass);
55
s->connectToHost(proxy_host, proxy_port, host, port);
58
SocksClient *s = new SocksClient;
60
connect(s, SIGNAL(connected()), SLOT(st_connected()));
61
connect(s, SIGNAL(error(int)), SLOT(st_error(int)));
62
fprintf(stderr, "adconn: Connecting to %s:%d via %s:%d (socks)\n", host.latin1(), port, proxy_host.latin1(), proxy_port);
63
if(!proxy_user.isEmpty())
64
s->setAuth(proxy_user, proxy_pass);
65
s->connectToHost(proxy_host, proxy_port, host, port);
68
HttpPoll *s = new HttpPoll;
70
connect(s, SIGNAL(connected()), SLOT(st_connected()));
71
connect(s, SIGNAL(error(int)), SLOT(st_error(int)));
72
fprintf(stderr, "adconn: Connecting to %s via %s:%d (poll)\n", host.latin1(), proxy_host.latin1(), proxy_port);
73
if(!proxy_user.isEmpty())
74
s->setAuth(proxy_user, proxy_pass);
75
s->connectToHost(proxy_host, proxy_port, host);
86
void App::st_connected()
88
fprintf(stderr, "adconn: Connected\n");
91
connect(d->bs, SIGNAL(connectionClosed()), SLOT(st_connectionClosed()));
92
connect(d->bs, SIGNAL(delayedCloseFinished()), SLOT(st_delayedCloseFinished()));
93
connect(d->bs, SIGNAL(readyRead()), SLOT(st_readyRead()));
96
void App::st_connectionClosed()
98
fprintf(stderr, "adconn: Connection closed by foreign host.\n");
102
void App::st_delayedCloseFinished()
107
void App::st_readyRead()
109
QByteArray a = d->bs->read();
113
void App::st_error(int x)
115
fprintf(stderr, "adconn: Stream error [%d].\n", x);
119
void App::con_connectionClosed()
121
fprintf(stderr, "adconn: Closing.\n");
123
if(d->bs->bytesToWrite() == 0)
127
void App::con_readyRead()
129
QByteArray a = d->c->read();
134
int main(int argc, char **argv)
136
QApplication app(argc, argv, false);
139
printf("usage: adconn [options] [host]\n");
140
printf(" [host] must be in the form 'host:port' or 'domain#server'\n");
141
printf(" When using proxy 'poll', [host] must be a URL\n");
142
printf(" Options:\n");
143
printf(" --proxy=[https|poll|socks],host:port\n");
144
printf(" --proxy-auth=user,pass\n");
152
QString proxy_user, proxy_pass;
154
for(int at = 1; at < argc; ++at) {
155
QString s = argv[at];
158
if(s.left(2) == "--") {
161
int n = s.find('=', 2);
163
name = s.mid(2, n-2);
165
args = QStringList::split(',', s.mid(n), true);
174
for(int x = at; x < argc; ++x)
176
--at; // don't advance
179
if(name == "proxy") {
180
QString type = args[0];
184
printf("invalid host:port for proxy\n");
187
proxy_host = s.mid(0, n);
189
proxy_port = s.mid(n).toInt();
191
if(type == "https") {
194
else if(type == "poll") {
197
else if(type == "socks") {
201
printf("no such proxy type '%s'\n", type.latin1());
205
else if(name == "proxy-auth") {
206
proxy_user = args[0];
207
proxy_pass = args[1];
210
printf("Unknown option '%s'\n", name.latin1());
218
printf("No URL specified\n");
220
printf("No host specified!\n");
236
printf("No port or server specified!\n");
241
printf("Can't use domain#server with proxy!\n");
252
port = s.mid(n).toInt();
256
App *a = new App(mode, host, port, serv, proxy_host, proxy_port, proxy_user, proxy_pass);
257
QObject::connect(a, SIGNAL(quit()), &app, SLOT(quit()));