This patch is to ensure the encoding= of the <?xml block gets changed if the charset is converted for compatability with the handset. This was patched to fix specifically accessing:
http://tagtag.com/site/wapdir/index.php
What happens without the patch is that the charset is converted to UTF-8 for compatability with the handset, but the encoding= is left as ISO-8859-2. The handset can't handle ISO-8859-2, so it fails to load the site. The patch obviously fixes this.
Jon
Index: gw/wap-appl.c
===================================================================
RCS file: /home/cvs/gateway/gw/wap-appl.c,v
retrieving revision 1.114
diff -u -p -d -r1.114 wap-appl.c
--- gw/wap-appl.c 7 Mar 2005 14:14:21 -0000 1.114
+++ gw/wap-appl.c 14 Apr 2005 13:09:35 -0000
@@ -142,6 +142,7 @@ struct content {
Octstr *charset;
Octstr *url;
Octstr *version;
+ int was_converted;
};
@@ -725,6 +726,7 @@ static void return_reply(int status, Oct
content.url = url;
content.body = content_body;
content.version = content.type = content.charset = NULL;
+ content.was_converted = 0;
server = ua = NULL;
/* Get session machine for this session. If this was a connection-less
@@ -870,7 +872,7 @@ static void return_reply(int status, Oct
octstr_get_cstr(charset), "UTF-8") >=
0) {
octstr_destroy(content.charset);
content.charset = octstr_create("UTF-8");
- /* XXX it might be good idea to change
<?xml...encoding?> */
+ content.was_converted = 1;
}
}
}
@@ -890,7 +892,7 @@ static void return_reply(int status, Oct
octstr_get_cstr(charset),
"ISO-8859-1") >= 0) {
octstr_destroy(content.charset);
content.charset = octstr_create("ISO-8859-1");
- /* XXX it might be good idea to change
<?xml...encoding?> */
+ content.was_converted = 1;
}
}
}
@@ -1315,7 +1317,7 @@ static Octstr *convert_wml_to_wmlc(struc
/* content->charset is passed from the HTTP header parsing */
ret = wml_compile(content->body, content->charset, &wmlc,
- content->version);
+ content->version, content->was_converted);
/* wmlc is created implicitely in wml_compile() */
if (ret == 0)
Index: gw/wap_push_ppg.c
===================================================================
RCS file: /home/cvs/gateway/gw/wap_push_ppg.c,v
retrieving revision 1.68
diff -u -p -d -r1.68 wap_push_ppg.c
--- gw/wap_push_ppg.c 11 Feb 2005 15:35:48 -0000 1.68
+++ gw/wap_push_ppg.c 14 Apr 2005 13:09:35 -0000
@@ -1928,7 +1928,7 @@ static Octstr *convert_wml_to_wmlc(struc
{
Octstr *wmlc;
- if (wml_compile(content->body, content->charset, &wmlc, NULL) == 0)
+ if (wml_compile(content->body, content->charset, &wmlc, NULL, 0) == 0)
return wmlc;
warning(0, "PPG: wml compilation failed");
return NULL;
Index: gw/wml_compiler.c
===================================================================
RCS file: /home/cvs/gateway/gw/wml_compiler.c,v
retrieving revision 1.119
diff -u -p -d -r1.119 wml_compiler.c
--- gw/wml_compiler.c 11 Feb 2005 15:35:48 -0000 1.119
+++ gw/wml_compiler.c 14 Apr 2005 13:09:35 -0000
@@ -328,7 +328,7 @@ static void string_table_output(Octstr *
* For more information, look wml_compiler.h.
*/
int wml_compile(Octstr *wml_text, Octstr *charset, Octstr **wml_binary,
- Octstr *version)
+ Octstr *version, int was_converted)
{
int ret = 0;
size_t size;
@@ -368,7 +368,14 @@ int wml_compile(Octstr *wml_text, Octstr
* We will trust the xml preamble encoding more then the HTTP header
* charset definition.
*/
- if ((encoding = find_charset_encoding(wml_text)) != NULL) {
+ if (was_converted) {
+ /*
+ * the charset was converted by the upstream caller. we need to
+ * ensure the encoding= block matches the new charset.
+ */
+ encoding = octstr_duplicate(charset);
+ }
+ else if ((encoding = find_charset_encoding(wml_text)) != NULL) {
/* ok, we rely on the xml preamble encoding */
} else if (charset && octstr_len(charset) > 0) {
/* we had a HTTP response charset, use this */
Index: gw/wml_compiler.h
===================================================================
RCS file: /home/cvs/gateway/gw/wml_compiler.h,v
retrieving revision 1.15
diff -u -p -d -r1.15 wml_compiler.h
--- gw/wml_compiler.h 11 Feb 2005 15:35:48 -0000 1.15
+++ gw/wml_compiler.h 14 Apr 2005 13:09:35 -0000
@@ -91,7 +91,8 @@
int wml_compile(Octstr *wml_text,
Octstr *charset,
Octstr **wml_binary,
- Octstr *version);
+ Octstr *version,
+ int was_converted);
/*
* A function to initialize the wml compiler for use. Allocates memory
Index: test/wml_tester.c
===================================================================
RCS file: /home/cvs/gateway/test/wml_tester.c,v
retrieving revision 1.26
diff -u -p -d -r1.26 wml_tester.c
--- test/wml_tester.c 11 Feb 2005 15:35:49 -0000 1.26
+++ test/wml_tester.c 14 Apr 2005 13:09:35 -0000
@@ -177,7 +177,7 @@ int main(int argc, char **argv)
set_zero(wml_text);
for (i = 0; i <= num; i++) {
- ret = wml_compile(wml_text, charset, &wml_binary, NULL);
+ ret = wml_compile(wml_text, charset, &wml_binary, NULL, 0);
if (i < num)
octstr_destroy(wml_binary);
}
