src/corelib/io/qurl.cpp
changeset 29 b72c6db6890b
parent 25 e24348a560a6
child 30 5dc02b23752f
--- a/src/corelib/io/qurl.cpp	Fri Jun 11 14:24:45 2010 +0300
+++ b/src/corelib/io/qurl.cpp	Wed Jun 23 19:07:03 2010 +0300
@@ -338,6 +338,7 @@
     bool hasQuery;
     bool hasFragment;
     bool isValid;
+    bool isHostValid;
 
     char valueDelimiter;
     char pairDelimiter;
@@ -2990,7 +2991,9 @@
         // only LDH is present
         if (c == '-' || (c >= '0' && c <= '9')
             || (c >= 'A' && c <= 'Z')
-            || (c >= 'a' && c <= 'z'))
+            || (c >= 'a' && c <= 'z')
+            //underscore is not supposed to be allowed, but other browser accept it (QTBUG-7434)
+            || c == '_')
             continue;
 
         return false;
@@ -3345,6 +3348,7 @@
     ref = 1;
     port = -1;
     isValid = false;
+    isHostValid = true;
     parsingMode = QUrl::TolerantMode;
     valueDelimiter = '=';
     pairDelimiter = '&';
@@ -3371,6 +3375,7 @@
       hasQuery(copy.hasQuery),
       hasFragment(copy.hasFragment),
       isValid(copy.isValid),
+      isHostValid(copy.isHostValid),
       valueDelimiter(copy.valueDelimiter),
       pairDelimiter(copy.pairDelimiter),
       stateFlags(copy.stateFlags),
@@ -3401,6 +3406,8 @@
             that->host = host.toLower();
     } else {
         that->host = qt_ACE_do(host, NormalizeAce);
+        if (that->host.isNull())
+            that->isHostValid = false;
     }
     return that->host;
 }
@@ -3477,6 +3484,7 @@
 
 void QUrlPrivate::setAuthority(const QString &auth)
 {
+    isHostValid = true;
     if (auth.isEmpty())
         return;
 
@@ -4167,7 +4175,7 @@
     if (!QURL_HASFLAG(d->stateFlags, QUrlPrivate::Parsed)) d->parse();
     if (!QURL_HASFLAG(d->stateFlags, QUrlPrivate::Validated)) d->validate();
 
-    return d->isValid;
+    return d->isValid && d->isHostValid;
 }
 
 /*!
@@ -4419,7 +4427,6 @@
     if (!QURL_HASFLAG(d->stateFlags, QUrlPrivate::Parsed)) d->parse();
     detach();
     QURL_UNSETFLAG(d->stateFlags, QUrlPrivate::Validated | QUrlPrivate::Normalized);
-
     d->setAuthority(authority);
 }
 
@@ -4640,6 +4647,7 @@
     if (!d) d = new QUrlPrivate;
     if (!QURL_HASFLAG(d->stateFlags, QUrlPrivate::Parsed)) d->parse();
     detach();
+    d->isHostValid = true;
     QURL_UNSETFLAG(d->stateFlags, QUrlPrivate::Validated | QUrlPrivate::Normalized | QUrlPrivate::HostCanonicalized);
 
     d->host = host;