22 #include <sys/utsname.h>
29 #include <kstandarddirs.h>
30 #include <klibloader.h>
31 #include <kstringhandler.h>
32 #include <kstaticdeleter.h>
33 #include <kio/slaveconfig.h>
34 #include <kio/ioslave_defaults.h>
35 #include <kio/http_slave_defaults.h>
37 #include "kprotocolmanager.h"
40 KProtocolManagerPrivate
43 KProtocolManagerPrivate();
45 ~KProtocolManagerPrivate();
57 static KProtocolManagerPrivate* d = 0;
58 static KStaticDeleter<KProtocolManagerPrivate> kpmpksd;
60 KProtocolManagerPrivate::KProtocolManagerPrivate()
61 :config(0), http_config(0), init_busy(false)
63 kpmpksd.setObject(d,
this);
66 KProtocolManagerPrivate::~KProtocolManagerPrivate()
74 #define CFG_DEFAULT_UAGENT(X) \
75 TQString("Mozilla/5.0 (compatible; Konqueror/%1.%2%3) KHTML/%4.%5.%6 (like Gecko)") \
76 .arg(KDE_VERSION_MAJOR).arg(KDE_VERSION_MINOR).arg(X).arg(KDE_VERSION_MAJOR).arg(KDE_VERSION_MINOR).arg(KDE_VERSION_RELEASE)
80 kpmpksd.destructObject();
83 KIO::SlaveConfig::self()->
reset ();
86 KConfig *KProtocolManager::config()
89 d =
new KProtocolManagerPrivate;
93 d->config =
new KConfig(
"kioslaverc",
true,
false);
98 KConfig *KProtocolManager::http_config()
101 d =
new KProtocolManagerPrivate;
105 d->http_config =
new KConfig(
"kio_httprc",
false,
false);
107 return d->http_config;
115 cfg->setGroup( TQString::null );
116 int val = cfg->readNumEntry(
"ReadTimeout", DEFAULT_READ_TIMEOUT );
117 return QMAX(MIN_TIMEOUT_VALUE, val);
123 cfg->setGroup( TQString::null );
124 int val = cfg->readNumEntry(
"ConnectTimeout", DEFAULT_CONNECT_TIMEOUT );
125 return QMAX(MIN_TIMEOUT_VALUE, val);
131 cfg->setGroup( TQString::null );
132 int val = cfg->readNumEntry(
"ProxyConnectTimeout", DEFAULT_PROXY_CONNECT_TIMEOUT );
133 return QMAX(MIN_TIMEOUT_VALUE, val);
139 cfg->setGroup( TQString::null );
140 int val = cfg->readNumEntry(
"ResponseTimeout", DEFAULT_RESPONSE_TIMEOUT );
141 return QMAX(MIN_TIMEOUT_VALUE, val);
148 return proxyType() != NoProxy;
154 cfg->setGroup(
"Proxy Settings" );
155 return cfg->readBoolEntry(
"ReversedException",
false);
161 cfg->setGroup(
"Proxy Settings" );
162 return static_cast<ProxyType>(cfg->readNumEntry(
"ProxyType" ));
168 cfg->setGroup(
"Proxy Settings" );
169 return static_cast<ProxyAuthMode>(cfg->readNumEntry(
"AuthMode" ));
176 KConfig *cfg = http_config();
177 return cfg->readBoolEntry(
"UseCache",
true );
182 KConfig *cfg = http_config();
183 TQString tmp = cfg->readEntry(
"cache");
185 return DEFAULT_CACHE_CONTROL;
191 KConfig *cfg = http_config();
192 return cfg->readPathEntry(
"CacheDir", KGlobal::dirs()->saveLocation(
"cache",
"http"));
197 KConfig *cfg = http_config();
198 return cfg->readNumEntry(
"MaxCacheAge", DEFAULT_MAX_CACHE_AGE );
203 KConfig *cfg = http_config();
204 return cfg->readNumEntry(
"MaxCacheSize", DEFAULT_MAX_CACHE_SIZE );
210 cfg->setGroup(
"Proxy Settings" );
212 return cfg->readEntry(
"NoProxyFor" );
217 TQString noProxy = noProxyForRaw();
218 if (proxyType() == EnvVarProxy)
219 noProxy = TQString::fromLocal8Bit(getenv(noProxy.local8Bit()));
226 TQString scheme = protocol.lower();
228 if (scheme ==
"webdav")
230 else if (scheme ==
"webdavs")
234 cfg->setGroup(
"Proxy Settings" );
235 return cfg->readEntry( scheme +
"Proxy" );
247 if (!url.host().isEmpty())
250 TQString p = u.protocol().lower();
259 else if ( p ==
"webdavs" )
265 if ( p.startsWith(
"http") || p ==
"ftp" || p ==
"gopher" )
266 DCOPRef(
"kded",
"proxyscout" ).call(
"proxyForURL", u ).get( proxy );
270 proxy = TQString(TQString::fromLocal8Bit(getenv(proxyFor(url.protocol()).local8Bit()))).stripWhiteSpace();
273 proxy = proxyFor( url.protocol() );
280 return (proxy.isEmpty() ? TQString::fromLatin1(
"DIRECT") : proxy);
285 DCOPRef(
"kded",
"proxyscout" ).send(
"blackListProxy", proxy );
293 static bool revmatch(
const char *host,
const char *nplist)
298 const char *hptr = host + strlen( host ) - 1;
299 const char *nptr = nplist + strlen( nplist ) - 1;
300 const char *shptr = hptr;
302 while ( nptr >= nplist )
304 if ( *hptr != *nptr )
309 while(--nptr>=nplist && *nptr!=
',' && *nptr!=
' ') ;
312 while(--nptr>=nplist && (*nptr==
',' || *nptr==
' ')) ;
316 if ( nptr==nplist || nptr[-1]==
',' || nptr[-1]==
' ')
333 KURL::List list = KURL::split(url);
334 KURL::List::Iterator it = list.fromLast();
335 return slaveProtocol(*it, proxy);
339 d =
new KProtocolManagerPrivate;
349 proxy = proxyForURL(url);
350 if ((proxy !=
"DIRECT") && (!proxy.isEmpty()))
352 bool isRevMatch =
false;
354 bool useRevProxy = ((type == ManualProxy) && useReverseProxy());
359 if ( (type == ManualProxy) || (type == EnvVarProxy) )
360 noProxy = noProxyFor();
362 if (!noProxy.isEmpty())
364 TQString qhost = url.host().lower();
365 const char *host = qhost.latin1();
366 TQString qno_proxy = noProxy.stripWhiteSpace().lower();
367 const char *no_proxy = qno_proxy.latin1();
368 isRevMatch = revmatch(host, no_proxy);
373 if (!isRevMatch && url.port() > 0)
375 qhost +=
':' + TQString::number (url.port());
376 host = qhost.latin1();
377 isRevMatch = revmatch (host, no_proxy);
382 if (!isRevMatch && host && (strchr(host,
'.') == NULL))
383 isRevMatch = revmatch(
"<local>", no_proxy);
386 if ( (!useRevProxy && !isRevMatch) || (useRevProxy && isRevMatch) )
389 if ( d->url.isValid() )
393 TQString protocol = url.protocol().lower();
394 if (protocol.startsWith(
"http") || protocol.startsWith(
"webdav"))
395 d->protocol = protocol;
398 d->protocol = d->url.protocol();
399 kdDebug () <<
"slaveProtocol: " << d->protocol << endl;
411 d->proxy = proxy = TQString::null;
412 d->protocol = url.protocol();
420 TQString sendUserAgent = KIO::SlaveConfig::self()->
configData(
"http", hostname.lower(),
"SendUserAgent").lower();
421 if (sendUserAgent ==
"false")
422 return TQString::null;
424 TQString useragent = KIO::SlaveConfig::self()->
configData(
"http", hostname.lower(),
"UserAgent");
428 if (useragent.isEmpty())
429 return defaultUserAgent();
436 TQString modifiers = KIO::SlaveConfig::self()->
configData(
"http", TQString::null,
"UserAgentKeys");
437 return defaultUserAgent(modifiers);
443 d =
new KProtocolManagerPrivate;
445 TQString modifiers = _modifiers.lower();
446 if (modifiers.isEmpty())
447 modifiers = DEFAULT_USER_AGENT_KEYS;
449 if (d->modifiers == modifiers)
453 int debian_append = 0;
455 if( uname(&nam) >= 0 )
457 if( modifiers.contains(
'o') )
459 supp += TQString(
"; %1").arg(nam.sysname);
461 if ( modifiers.contains(
'v') )
463 supp += TQString(
" %1").arg(nam.release);
467 if( modifiers.contains(
'p') )
470 supp += TQString::fromLatin1(
"; X11");
472 if( modifiers.contains(
'm') )
474 supp += TQString(
"; %1").arg(nam.machine);
476 if( modifiers.contains(
'l') )
478 TQStringList languageList = KGlobal::locale()->languageList();
479 TQStringList::Iterator it = languageList.find( TQString::fromLatin1(
"C") );
480 if( it != languageList.end() )
482 if( languageList.contains( TQString::fromLatin1(
"en") ) > 0 )
483 languageList.remove( it );
485 (*it) = TQString::fromLatin1(
"en");
487 if( languageList.count() )
488 supp += TQString(
"; %1").arg(languageList.join(
", "));
491 d->modifiers = modifiers;
492 d->useragent = CFG_DEFAULT_UAGENT(supp);
494 if (debian_append == 1)
495 d->useragent.append(
" (Debian)");
496 else if (debian_append == 2)
498 #define STRINGIFY(macro_or_string) STRINGIFY_ARG(macro_or_string)
499 #define STRINGIFY_ARG(contents) #contents
500 d->useragent.append(
" (Debian package " STRINGIFY(DEBIAN_VERSION)
")");
511 cfg->setGroup( TQString::null );
512 return cfg->readBoolEntry(
"MarkPartial",
true );
518 cfg->setGroup( TQString::null );
519 return cfg->readNumEntry(
"MinimumKeepSize",
520 DEFAULT_MINIMUM_KEEP_SIZE );
526 cfg->setGroup( TQString::null );
527 return cfg->readBoolEntry(
"AutoResume",
false );
533 cfg->setGroup( TQString::null );
534 return cfg->readBoolEntry(
"PersistentConnections",
true );
540 cfg->setGroup( TQString::null );
541 return cfg->readBoolEntry(
"PersistentProxyConnection",
false );
547 cfg->setGroup(
"Proxy Settings" );
548 return cfg->readEntry(
"Proxy Config Script" );