diff options
author | dequis <dx@dxzone.com.ar> | 2015-03-01 04:23:08 -0300 |
---|---|---|
committer | dequis <dx@dxzone.com.ar> | 2015-03-01 17:46:41 -0300 |
commit | b0542e479435c9558d8c77f85a575dabdd61df92 (patch) | |
tree | 86c263cc180ea7230404f6beab358a8fb2663e92 /facebook/facebook-json.c | |
parent | 97f5a33c90cd22c4a03d3dda61e09be9b67091d9 (diff) | |
download | bitlbee-facebook-b0542e479435c9558d8c77f85a575dabdd61df92.tar.gz bitlbee-facebook-b0542e479435c9558d8c77f85a575dabdd61df92.tar.bz2 bitlbee-facebook-b0542e479435c9558d8c77f85a575dabdd61df92.tar.xz |
facebook-json: add fb_json_str_escape() to properly escape messages
Fixes issues such as losing messages that include a quote character.
Only escapes the minimum needed to work - control characters,
backslashes and quotes. UTF-8 chars are still valid json, so they are
sent as-is.
Diffstat (limited to 'facebook/facebook-json.c')
-rw-r--r-- | facebook/facebook-json.c | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/facebook/facebook-json.c b/facebook/facebook-json.c index 6d26289..70f0b39 100644 --- a/facebook/facebook-json.c +++ b/facebook/facebook-json.c @@ -314,3 +314,35 @@ gboolean fb_json_str_chk(const json_value *json, const gchar *name, *val = jv->u.string.ptr; return TRUE; } + +/** + * Backslash-escapes a string to make it safe for json. The returned string + * should be freed with #g_free() when no longer needed. + * + * @param str The string to escape. + * + * @return The resulting string, or NULL on error. + **/ +gchar *fb_json_str_escape(const gchar *str) +{ + GString *out; + guint i; + + g_return_val_if_fail(str != NULL, NULL); + + /* let's overallocate a bit */ + out = g_string_sized_new(strlen(str) * 2); + + for (i = 0; str[i] != '\0'; i++) { + if ((str[i] > 0) && (str[i] < 0x20)) { + g_string_append_printf(out, "\\u%04x", str[i]); + continue; + } + if ((str[i] == '"') || (str[i] == '\\')) { + g_string_append_c(out, '\\'); + } + g_string_append_c(out, str[i]); + } + + return g_string_free(out, FALSE); +} |