aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWilmer van der Gaast <wilmer@gaast.net>2010-07-29 10:57:01 +0200
committerWilmer van der Gaast <wilmer@gaast.net>2010-07-29 10:57:01 +0200
commitb40e60db39f0b187774cfd2e0fe1b503f9bf1a54 (patch)
tree38fd49db9aad6e7dcca05a24b1add0cf7e96c243
parent3963fdd2bc0a8b1a3665b2dfdab574cf53bf071d (diff)
Fixing http_encode(): BitlBee now calls setlocale() (for nickname
transliteration to work), which changes the behaviour of isalpha() (turns out it's not a simple macro). For HTTP-encoding, this sucks, especially when doing OAuth (which is very picky about the way HTTP encoding is done). This should fix problems some people were seeing with posting Twitter messages containing accents.
-rw-r--r--lib/misc.c12
-rw-r--r--tests/check.c2
-rw-r--r--tests/check_util.c9
3 files changed, 19 insertions, 4 deletions
diff --git a/lib/misc.c b/lib/misc.c
index 47c1ac90..26d22ae0 100644
--- a/lib/misc.c
+++ b/lib/misc.c
@@ -304,14 +304,18 @@ void http_encode( char *s )
for( i = j = 0; t[i]; i ++, j ++ )
{
- if( !isalnum( t[i] ) && !strchr( "._-~", t[i] ) )
+ /* Warning: isalnum() is locale-aware, so don't use it here! */
+ if( ( t[i] >= 'A' && t[i] <= 'Z' ) ||
+ ( t[i] >= 'a' && t[i] <= 'z' ) ||
+ ( t[i] >= '0' && t[i] <= '9' ) ||
+ strchr( "._-~", t[i] ) )
{
- sprintf( s + j, "%%%02X", ((unsigned char*)t)[i] );
- j += 2;
+ s[j] = t[i];
}
else
{
- s[j] = t[i];
+ sprintf( s + j, "%%%02X", ((unsigned char*)t)[i] );
+ j += 2;
}
}
s[j] = 0;
diff --git a/tests/check.c b/tests/check.c
index e42f1255..601d9726 100644
--- a/tests/check.c
+++ b/tests/check.c
@@ -2,6 +2,7 @@
#include <glib.h>
#include <gmodule.h>
#include <check.h>
+#include <locale.h>
#include "bitlbee.h"
#include "testsuite.h"
@@ -91,6 +92,7 @@ int main (int argc, char **argv)
g_option_context_free(pc);
log_init();
+ setlocale(LC_CTYPE, "");
if (verbose) {
log_link( LOGLVL_ERROR, LOGOUTPUT_CONSOLE );
diff --git a/tests/check_util.c b/tests/check_util.c
index b00d645b..c323241e 100644
--- a/tests/check_util.c
+++ b/tests/check_util.c
@@ -160,6 +160,14 @@ START_TEST(test_word_wrap)
}
END_TEST
+START_TEST(test_http_encode)
+ char s[80];
+
+ strcpy( s, "ee\xc3""\xab""ee!!..." );
+ http_encode( s );
+ fail_unless( strcmp( s, "ee%C3%ABee%21%21..." ) == 0 );
+END_TEST
+
Suite *util_suite (void)
{
Suite *s = suite_create("Util");
@@ -173,5 +181,6 @@ Suite *util_suite (void)
tcase_add_test (tc_core, test_set_url_username);
tcase_add_test (tc_core, test_set_url_username_pwd);
tcase_add_test (tc_core, test_word_wrap);
+ tcase_add_test (tc_core, test_http_encode);
return s;
}