diff --git a/src/util/virbuffer.c b/src/util/virbuffer.c index bf703fe7a5..bde118a248 100644 --- a/src/util/virbuffer.c +++ b/src/util/virbuffer.c @@ -638,6 +638,16 @@ virBufferEscape(virBufferPtr buf, char escape, const char *toescape, } +static bool +virBufferURIEncodeCharIsUnencoded(char c) +{ + if (c == '-' || c == '.' || c == '_' || c == '~') + return true; + + return c_isalnum(c); +} + + /** * virBufferURIEncodeString: * @buf: the buffer to append to @@ -664,7 +674,7 @@ virBufferURIEncodeString(virBufferPtr buf, const char *str) virBufferAddLit(buf, ""); /* auto-indent */ for (p = str; *p; ++p) { - if (c_isalnum(*p)) + if (virBufferURIEncodeCharIsUnencoded(*p)) grow_size++; else grow_size += 3; /* %ab */ @@ -674,7 +684,7 @@ virBufferURIEncodeString(virBufferPtr buf, const char *str) return; for (p = str; *p; ++p) { - if (c_isalnum(*p)) { + if (virBufferURIEncodeCharIsUnencoded(*p)) { buf->content[buf->use++] = *p; } else { uc = (unsigned char) *p; diff --git a/tests/viruritest.c b/tests/viruritest.c index 3255e2333a..a11587e52b 100644 --- a/tests/viruritest.c +++ b/tests/viruritest.c @@ -184,7 +184,7 @@ mymain(void) { NULL, NULL, false }, }; TEST_FULL("spice://[3ffe::104]:5900/?tlsSubject=C=XX,L=Testtown,O=Test%20Company,CN=tester.test", - "spice://[3ffe::104]:5900/?tlsSubject=C%3dXX%2cL%3dTesttown%2cO%3dTest%20Company%2cCN%3dtester%2etest", + "spice://[3ffe::104]:5900/?tlsSubject=C%3dXX%2cL%3dTesttown%2cO%3dTest%20Company%2cCN%3dtester.test", "spice", "3ffe::104", 5900, "/", "tlsSubject=C=XX,L=Testtown,O=Test%20Company,CN=tester.test", NULL, NULL, spiceparams); virURIParam params1[] = {