[prev in list] [next in list] [prev in thread] [next in thread]
List: kfm-devel
Subject: Re: kurl-patch
From: Tobias Anton <anton () stud ! fbi ! fh-darmstadt ! de>
Date: 2001-07-28 14:29:59
[Download RAW message or body]
Please review this one.
the major change is that internally,
the query is stored without the leading '?'
Tobias
["kurl.patch" (text/x-diff)]
Index: kurl.cpp
===================================================================
RCS file: /home/kde/kdelibs/kdecore/kurl.cpp,v
retrieving revision 1.168
diff -u -r1.168 kurl.cpp
--- kurl.cpp 2001/07/19 07:42:41 1.168
+++ kurl.cpp 2001/07/28 11:36:43
@@ -188,7 +188,7 @@
unsigned int character = segment[ i++ ].unicode();
if ((character == ' ') || (character > 255))
bKeepEncoded = false;
- if (character == '%' )
+ if (character == '%' )
{
char a = i+1 < old_length ? hex2int( segment[i].latin1() ) : -1;
char b = i+1 < old_length ? hex2int( segment[i+1].latin1() ) : -1;
@@ -265,7 +265,7 @@
// RFC 2396!! (dA)
QString result;
int cdUp, orig_pos, pos;
-
+
cdUp = 0;
pos = orig_pos = len;
while ( pos && (pos = path.findRev('/',--pos)) != -1 )
@@ -278,7 +278,7 @@
// Ignore any occurances of '.' This includes entries
// that simply do not make sense like /..../
if ( (len!=0 || !cleanDirSeparator) && (len != 1 || path[pos+1] != '.') )
- {
+ {
if ( !cdUp )
result = path.mid(pos, len+1) + result;
else
@@ -287,10 +287,10 @@
}
orig_pos = pos;
}
-
+
if ( result.isEmpty() )
result = "/";
-
+
// Restore the trailing '/'
len = result.length();
if ( len > 0 && result.right(1)[0] != '/' && slash )
@@ -506,6 +506,7 @@
void KURL::parse( const QString& _url, int encoding_hint )
{
+ kdDebug(126) << "parse " << _url << endl;
// Return immediately whenever the given url
// is empty or null.
if ( _url.isEmpty() )
@@ -521,6 +522,9 @@
QChar* orig = buf;
memcpy( buf, _url.unicode(), len * sizeof( QChar ) );
+ QChar delim;
+ QString tmp;
+
uint pos = 0;
// Node 1: Accept alpha or slash
@@ -554,7 +558,7 @@
{
m_strProtocol = QString( orig, pos ).lower();
pos++;
- goto Node11;
+ goto Node9;
}
else
goto NodeErr;
@@ -566,10 +570,10 @@
// Node 4: Accept any amount of characters.
if (buf[pos] == '[') // An IPv6 host follows.
- goto Node8;
+ goto Node8;
// Terminate on / or @ or ? or #
x = buf[pos];
- while( (x != ':') && (x != '@') && (x != '/') && (x != '?') && (x != '#') && (pos < len) )
+ while( (x != ':') && (x != '@') && (x != '/') && (x != '?') && (x != '#') && (pos < len) )
x = buf[++pos];
if ( pos == len )
{
@@ -605,9 +609,9 @@
start = pos++;
// Node 6: Read everything until @, /, ? or #
- while( (pos < len) &&
- (buf[pos] != '@') &&
- (buf[pos] != '/') &&
+ while( (pos < len) &&
+ (buf[pos] != '@') &&
+ (buf[pos] != '/') &&
(buf[pos] != '?') &&
(buf[pos] != '#')) pos++;
// If we now have a '@' the ':' seperates user and password.
@@ -647,8 +651,8 @@
if (pos < len) pos++; // Skip ']'
if (pos == len)
goto NodeOk;
- }
- else
+ }
+ else
{
// Non IPv6 address
start = pos++;
@@ -659,7 +663,7 @@
{
m_strHost = decode(QString( buf + start, pos - start ), 0, encoding_hint);
goto NodeOk;
- }
+ }
m_strHost = decode(QString( buf + start, pos - start ), 0, encoding_hint);
}
x = buf[pos];
@@ -686,37 +690,40 @@
if ( pos == len )
goto NodeOk;
start = pos++;
+
+ Node9: // parse path until query or reference reached
+
+ while( buf[pos] != '#' && buf[pos]!='?' && pos < len ) pos++;
- // Node 9: Accept any character and # or terminate
- Node9:
- while( buf[pos] != '#' && pos < len ) pos++;
+ tmp = QString( buf + start, pos - start );
+ setEncodedPathAndQuery( tmp, encoding_hint );
+
if ( pos == len )
- {
- QString tmp( buf + start, len - start );
- setEncodedPathAndQuery( tmp, encoding_hint );
- // setEncodedPathAndQuery( QString( buf + start, pos - start ) );
goto NodeOk;
- }
- else if ( buf[pos] != '#' )
- goto NodeErr;
- setEncodedPathAndQuery( QString( buf + start, pos - start ), encoding_hint );
- pos++;
- // Node 10: Accept all the rest
- m_strRef_encoded = QString( buf + pos, len - pos );
- goto NodeOk;
+ start = pos + 1;
- // Node 11 We need at least one character
- Node11:
- start = pos;
- if ( pos++ == len )
- goto NodeOk; // Wrong, but since a fix was applied up top it is a non-issue here!!!!
- // Just for the record an opaque URL such as "mailto:" is always required
- // to have at least one more character other than a '/' following the colon.
- // Node 12: Accept the res
- setEncodedPathAndQuery( QString( buf + start, len - start ), encoding_hint );
- goto NodeOk;
+ Node10: // parse query or reference depending on what comes first
+ delim = (buf[pos++]=='#'?'?':'#');
+ while(buf[pos]!=delim && pos < len) pos++;
+
+ tmp = QString(buf + start, pos - start);
+ if (delim=='#')
+ m_strQuery_encoded = tmp;
+ else
+ m_strRef_encoded = tmp;
+
+ if (pos == len)
+ goto NodeOk;
+
+ Node11: // feed the rest into the remaining variable
+ tmp = QString( buf + pos + 1, len - pos - 1);
+ if (delim == '#')
+ m_strRef_encoded = tmp;
+ else
+ m_strQuery_encoded = tmp;
+
NodeOk:
delete []orig;
m_bIsMalformed = false; // Valid URL
@@ -981,10 +988,22 @@
}
// TODO apply encoding_hint to the query
- tmp += m_strQuery_encoded;
+ if (!m_strQuery_encoded.isNull())
+ tmp += '?' + m_strQuery_encoded;
return tmp;
}
+void KURL::setEncodedPath( const QString& _txt, int encoding_hint )
+{
+ m_strPath_encoded = _txt;
+
+ bool keepEncoded;
+ m_strPath = decode( m_strPath_encoded, &keepEncoded, encoding_hint );
+ if (!keepEncoded)
+ m_strPath_encoded = QString::null;
+}
+
+
void KURL::setEncodedPathAndQuery( const QString& _txt, int encoding_hint )
{
int pos = _txt.find( '?' );
@@ -996,7 +1015,7 @@
else
{
m_strPath_encoded = _txt.left( pos );
- m_strQuery_encoded = _txt.right(_txt.length() - pos);
+ m_strQuery_encoded = _txt.right(_txt.length() - pos + 1);
}
bool keepEncoded;
m_strPath = decode( m_strPath_encoded, &keepEncoded, encoding_hint );
@@ -1063,7 +1082,7 @@
u += "@";
}
bool IPv6 = (m_strHost.find(':') != -1);
- if (IPv6)
+ if (IPv6)
u += '[' + m_strHost + ']';
else
u += encode(m_strHost, true, encoding_hint);
@@ -1108,7 +1127,7 @@
u += "@";
}
bool IPv6 = (m_strHost.find(':') != -1);
- if (IPv6)
+ if (IPv6)
u += '[' + m_strHost + ']';
else
u += lazy_encode(m_strHost);
@@ -1124,8 +1143,8 @@
}
u += trailingSlash( _trailing, lazy_encode( m_strPath ) );
-
- u += m_strQuery_encoded;
+ if (!m_strQuery_encoded.isNull())
+ u += '?' + m_strQuery_encoded;
if ( hasRef() )
{
@@ -1270,7 +1289,7 @@
int i = result.findRev( "/" );
// If ( i == -1 ) => the first character is not a '/'
- // So it's some URL like file:blah.tgz, with no path
+ // So it's some URL like file:blah.tgz, with no path
if ( i == -1 )
return QString::null;
@@ -1459,8 +1478,10 @@
void KURL::setQuery( const QString &_txt, int )
{
- if (_txt.length() && (_txt[0] !='?'))
- m_strQuery_encoded = "?" + _txt;
+ if (!_txt.length())
+ return;
+ if (_txt[0] =='?')
+ m_strQuery_encoded = _txt.mid(1);
else
m_strQuery_encoded = _txt;
}
Index: kurl.h
===================================================================
RCS file: /home/kde/kdelibs/kdecore/kurl.h,v
retrieving revision 1.76
diff -u -r1.76 kurl.h
--- kurl.h 2001/07/19 07:42:41 1.76
+++ kurl.h 2001/07/28 11:36:53
@@ -229,6 +229,8 @@
*/
void setEncodedPathAndQuery( const QString& _txt, int encoding_hint = 0 );
+ void setEncodedPath(const QString& _txt, int encoding_hint = 0 );
+
/**
* @return The concatenation if the encoded path , '?' and the encoded query.
*
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic