Mercurial > pidgin
annotate src/html.c @ 6629:bdc448cf4cb6
[gaim-migrate @ 7153]
Tim Ringenbach (marv_sf) writes:
" This patch makes sending colors in yahoo work. It also
makes a few changing to receiving them, and addresses
most of the problems with that patch (which I think
were all related to the fact it didn't do outgoing colors).
It now handles bold, italic, underline, font face, font
size, and font color in both directions. It disables
the background color button if the prpl is yahoo (in a
generic way), and farthermore strips out any <body>
tags that the user might try to type anyway (the yahoo
server purposely mangles them).
It also adds a line to g_strescape some debug messages
because I got tired them of changing the color of my
terminal.
I think I got all the bugs out. If you run with -d or
open the debug window, it will show you what both
conversion function returned, which should help track
down any problems."
committer: Tailor Script <tailor@pidgin.im>
author | Luke Schierer <lschiere@pidgin.im> |
---|---|
date | Tue, 26 Aug 2003 01:34:51 +0000 |
parents | 7c14b35bc984 |
children | 67c4e9d39242 |
rev | line source |
---|---|
1 | 1 /* |
2 * gaim | |
3 * | |
4 * Copyright (C) 1998-1999, Mark Spencer <markster@marko.net> | |
5176 | 5 * 2003, Nathan Walp <faceprint@faceprint.com> |
1 | 6 * |
7 * This program is free software; you can redistribute it and/or modify | |
8 * it under the terms of the GNU General Public License as published by | |
9 * the Free Software Foundation; either version 2 of the License, or | |
10 * (at your option) any later version. | |
11 * | |
12 * This program is distributed in the hope that it will be useful, | |
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
15 * GNU General Public License for more details. | |
16 * | |
17 * You should have received a copy of the GNU General Public License | |
18 * along with this program; if not, write to the Free Software | |
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
20 * | |
21 */ | |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5681
diff
changeset
|
22 #include "internal.h" |
3630 | 23 |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5681
diff
changeset
|
24 #include "debug.h" |
6115
11bedb793a44
[gaim-migrate @ 6578]
Christian Hammond <chipx86@chipx86.com>
parents:
5940
diff
changeset
|
25 #include "html.h" |
1092
a930439f29b1
[gaim-migrate @ 1102]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1088
diff
changeset
|
26 #include "proxy.h" |
1 | 27 |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5681
diff
changeset
|
28 #include "gaim.h" |
3717
988485669631
[gaim-migrate @ 3850]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
3630
diff
changeset
|
29 |
4359
5fb47ec9bfe4
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4335
diff
changeset
|
30 gchar *strip_html(const gchar *text) |
1 | 31 { |
1883
060161a5d5f8
[gaim-migrate @ 1893]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1881
diff
changeset
|
32 int i, j, k; |
1 | 33 int visible = 1; |
1883
060161a5d5f8
[gaim-migrate @ 1893]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1881
diff
changeset
|
34 gchar *text2 = g_strdup(text); |
1250
b5783215b245
[gaim-migrate @ 1260]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1092
diff
changeset
|
35 |
4757 | 36 if(!text) |
37 return NULL; | |
4503 | 38 |
1250
b5783215b245
[gaim-migrate @ 1260]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1092
diff
changeset
|
39 for (i = 0, j = 0; text2[i]; i++) { |
b5783215b245
[gaim-migrate @ 1260]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1092
diff
changeset
|
40 if (text2[i] == '<') { |
1883
060161a5d5f8
[gaim-migrate @ 1893]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1881
diff
changeset
|
41 k = i + 1; |
4777 | 42 if(g_ascii_isspace(text2[k])) { |
43 visible = 1; | |
44 } else { | |
45 while (text2[k]) { | |
46 if (text2[k] == '<') { | |
47 visible = 1; | |
48 break; | |
49 } | |
50 if (text2[k] == '>') { | |
51 visible = 0; | |
52 break; | |
53 } | |
54 k++; | |
1883
060161a5d5f8
[gaim-migrate @ 1893]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1881
diff
changeset
|
55 } |
060161a5d5f8
[gaim-migrate @ 1893]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1881
diff
changeset
|
56 } |
060161a5d5f8
[gaim-migrate @ 1893]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1881
diff
changeset
|
57 } else if (text2[i] == '>' && !visible) { |
1 | 58 visible = 1; |
59 continue; | |
60 } | |
4473 | 61 if (text2[i] == '&' && strncasecmp(text2+i,""",6) == 0) { |
62 text2[j++] = '\"'; | |
63 i = i+5; | |
64 continue; | |
65 } | |
1250
b5783215b245
[gaim-migrate @ 1260]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1092
diff
changeset
|
66 if (visible) { |
1 | 67 text2[j++] = text2[i]; |
68 } | |
69 } | |
70 text2[j] = '\0'; | |
71 return text2; | |
72 } | |
73 | |
3630 | 74 struct g_url *parse_url(char *url) |
1 | 75 { |
5512 | 76 struct g_url *test = g_new0(struct g_url, 1); |
1 | 77 char scan_info[255]; |
78 char port[5]; | |
79 int f; | |
5501
36d2c875a822
[gaim-migrate @ 5900]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
5211
diff
changeset
|
80 char* turl; |
36d2c875a822
[gaim-migrate @ 5900]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
5211
diff
changeset
|
81 /* hyphen at end includes it in control set */ |
36d2c875a822
[gaim-migrate @ 5900]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
5211
diff
changeset
|
82 char addr_ctrl[] = "A-Za-z0-9.-"; |
36d2c875a822
[gaim-migrate @ 5900]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
5211
diff
changeset
|
83 char port_ctrl[] = "0-9"; |
6516 | 84 char page_ctrl[] = "A-Za-z0-9.~_/:*!@&%%?=+^-"; |
1 | 85 |
5501
36d2c875a822
[gaim-migrate @ 5900]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
5211
diff
changeset
|
86 if((turl=strstr(url, "http://")) || (turl=strstr(url, "HTTP://"))) |
36d2c875a822
[gaim-migrate @ 5900]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
5211
diff
changeset
|
87 url=turl+=7; |
36d2c875a822
[gaim-migrate @ 5900]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
5211
diff
changeset
|
88 |
36d2c875a822
[gaim-migrate @ 5900]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
5211
diff
changeset
|
89 snprintf(scan_info, sizeof(scan_info), |
36d2c875a822
[gaim-migrate @ 5900]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
5211
diff
changeset
|
90 "%%[%s]:%%[%s]/%%[%s]", |
36d2c875a822
[gaim-migrate @ 5900]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
5211
diff
changeset
|
91 addr_ctrl, port_ctrl, page_ctrl); |
36d2c875a822
[gaim-migrate @ 5900]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
5211
diff
changeset
|
92 |
2541
8229710b343b
[gaim-migrate @ 2554]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2417
diff
changeset
|
93 f = sscanf(url, scan_info, test->address, port, test->page); |
1 | 94 if (f == 1) { |
5501
36d2c875a822
[gaim-migrate @ 5900]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
5211
diff
changeset
|
95 snprintf(scan_info, sizeof(scan_info), |
36d2c875a822
[gaim-migrate @ 5900]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
5211
diff
changeset
|
96 "%%[%s]/%%[%s]", |
36d2c875a822
[gaim-migrate @ 5900]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
5211
diff
changeset
|
97 addr_ctrl, page_ctrl); |
2541
8229710b343b
[gaim-migrate @ 2554]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2417
diff
changeset
|
98 f = sscanf(url, scan_info, test->address, test->page); |
5501
36d2c875a822
[gaim-migrate @ 5900]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
5211
diff
changeset
|
99 snprintf(port, sizeof(port), "80"); |
1 | 100 } |
5501
36d2c875a822
[gaim-migrate @ 5900]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
5211
diff
changeset
|
101 if (f == 1) |
5512 | 102 test->page[0] = '\0'; |
1 | 103 |
2541
8229710b343b
[gaim-migrate @ 2554]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2417
diff
changeset
|
104 sscanf(port, "%d", &test->port); |
1 | 105 return test; |
106 } | |
107 | |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1250
diff
changeset
|
108 struct grab_url_data { |
4322 | 109 void (* callback)(gpointer, char *, unsigned long); |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1250
diff
changeset
|
110 gpointer data; |
2541
8229710b343b
[gaim-migrate @ 2554]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2417
diff
changeset
|
111 struct g_url *website; |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1250
diff
changeset
|
112 char *url; |
2584
34812d648f72
[gaim-migrate @ 2597]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2541
diff
changeset
|
113 gboolean full; |
6516 | 114 char *user_agent; |
115 int http11; | |
2369
117e9f0950b6
[gaim-migrate @ 2382]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2090
diff
changeset
|
116 |
117e9f0950b6
[gaim-migrate @ 2382]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2090
diff
changeset
|
117 int inpa; |
117e9f0950b6
[gaim-migrate @ 2382]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2090
diff
changeset
|
118 |
117e9f0950b6
[gaim-migrate @ 2382]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2090
diff
changeset
|
119 gboolean sentreq; |
2584
34812d648f72
[gaim-migrate @ 2597]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2541
diff
changeset
|
120 gboolean newline; |
34812d648f72
[gaim-migrate @ 2597]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2541
diff
changeset
|
121 gboolean startsaving; |
2369
117e9f0950b6
[gaim-migrate @ 2382]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2090
diff
changeset
|
122 char *webdata; |
4322 | 123 unsigned long len; |
4331
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
124 unsigned long data_len; |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1250
diff
changeset
|
125 }; |
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1250
diff
changeset
|
126 |
4331
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
127 static gboolean |
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
128 parse_redirect(const char *data, size_t data_len, gint sock, |
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
129 struct grab_url_data *gunk) |
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
130 { |
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
131 gchar *s; |
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
132 |
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
133 if ((s = g_strstr_len(data, data_len, "Location: ")) != NULL) { |
6128
3de23c9ca1e4
[gaim-migrate @ 6602]
Christian Hammond <chipx86@chipx86.com>
parents:
6115
diff
changeset
|
134 gchar *new_url, *temp_url, *end; |
3de23c9ca1e4
[gaim-migrate @ 6602]
Christian Hammond <chipx86@chipx86.com>
parents:
6115
diff
changeset
|
135 gboolean full; |
4331
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
136 int len; |
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
137 |
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
138 s += strlen("Location: "); |
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
139 end = strchr(s, '\r'); |
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
140 |
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
141 /* Just in case :) */ |
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
142 if (end == NULL) |
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
143 end = strchr(s, '\n'); |
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
144 |
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
145 len = end - s; |
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
146 |
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
147 new_url = g_malloc(len + 1); |
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
148 strncpy(new_url, s, len); |
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
149 new_url[len] = '\0'; |
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
150 |
6128
3de23c9ca1e4
[gaim-migrate @ 6602]
Christian Hammond <chipx86@chipx86.com>
parents:
6115
diff
changeset
|
151 full = gunk->full; |
3de23c9ca1e4
[gaim-migrate @ 6602]
Christian Hammond <chipx86@chipx86.com>
parents:
6115
diff
changeset
|
152 |
3de23c9ca1e4
[gaim-migrate @ 6602]
Christian Hammond <chipx86@chipx86.com>
parents:
6115
diff
changeset
|
153 if (*new_url == '/' || g_strstr_len(new_url, len, "://") == NULL) { |
3de23c9ca1e4
[gaim-migrate @ 6602]
Christian Hammond <chipx86@chipx86.com>
parents:
6115
diff
changeset
|
154 temp_url = new_url; |
3de23c9ca1e4
[gaim-migrate @ 6602]
Christian Hammond <chipx86@chipx86.com>
parents:
6115
diff
changeset
|
155 |
3de23c9ca1e4
[gaim-migrate @ 6602]
Christian Hammond <chipx86@chipx86.com>
parents:
6115
diff
changeset
|
156 new_url = g_strdup_printf("%s:%d%s", gunk->website->address, |
3de23c9ca1e4
[gaim-migrate @ 6602]
Christian Hammond <chipx86@chipx86.com>
parents:
6115
diff
changeset
|
157 gunk->website->port, temp_url); |
3de23c9ca1e4
[gaim-migrate @ 6602]
Christian Hammond <chipx86@chipx86.com>
parents:
6115
diff
changeset
|
158 |
3de23c9ca1e4
[gaim-migrate @ 6602]
Christian Hammond <chipx86@chipx86.com>
parents:
6115
diff
changeset
|
159 g_free(temp_url); |
3de23c9ca1e4
[gaim-migrate @ 6602]
Christian Hammond <chipx86@chipx86.com>
parents:
6115
diff
changeset
|
160 |
3de23c9ca1e4
[gaim-migrate @ 6602]
Christian Hammond <chipx86@chipx86.com>
parents:
6115
diff
changeset
|
161 full = FALSE; |
3de23c9ca1e4
[gaim-migrate @ 6602]
Christian Hammond <chipx86@chipx86.com>
parents:
6115
diff
changeset
|
162 } |
3de23c9ca1e4
[gaim-migrate @ 6602]
Christian Hammond <chipx86@chipx86.com>
parents:
6115
diff
changeset
|
163 |
4331
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
164 /* Close the existing stuff. */ |
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
165 gaim_input_remove(gunk->inpa); |
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
166 close(sock); |
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
167 |
6128
3de23c9ca1e4
[gaim-migrate @ 6602]
Christian Hammond <chipx86@chipx86.com>
parents:
6115
diff
changeset
|
168 gaim_debug(GAIM_DEBUG_INFO, "grab_url", |
3de23c9ca1e4
[gaim-migrate @ 6602]
Christian Hammond <chipx86@chipx86.com>
parents:
6115
diff
changeset
|
169 "Redirecting to %s\n", new_url); |
3de23c9ca1e4
[gaim-migrate @ 6602]
Christian Hammond <chipx86@chipx86.com>
parents:
6115
diff
changeset
|
170 |
4331
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
171 /* Try again, with this new location. */ |
6516 | 172 grab_url(new_url, full, gunk->callback, gunk->data, gunk->user_agent, gunk->http11); |
4331
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
173 |
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
174 /* Free up. */ |
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
175 g_free(new_url); |
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
176 g_free(gunk->webdata); |
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
177 g_free(gunk->website); |
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
178 g_free(gunk->url); |
6516 | 179 g_free(gunk->user_agent); |
4331
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
180 g_free(gunk); |
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
181 |
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
182 return TRUE; |
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
183 } |
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
184 |
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
185 return FALSE; |
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
186 } |
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
187 |
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
188 static size_t |
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
189 parse_content_len(const char *data, size_t data_len) |
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
190 { |
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
191 size_t content_len = 0; |
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
192 |
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
193 sscanf(data, "Content-Length: %d", &content_len); |
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
194 |
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
195 return content_len; |
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
196 } |
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
197 |
2369
117e9f0950b6
[gaim-migrate @ 2382]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2090
diff
changeset
|
198 static void grab_url_callback(gpointer dat, gint sock, GaimInputCondition cond) |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1250
diff
changeset
|
199 { |
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1250
diff
changeset
|
200 struct grab_url_data *gunk = dat; |
1 | 201 char data; |
202 | |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1250
diff
changeset
|
203 if (sock == -1) { |
4322 | 204 gunk->callback(gunk->data, NULL, 0); |
2541
8229710b343b
[gaim-migrate @ 2554]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2417
diff
changeset
|
205 g_free(gunk->website); |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1250
diff
changeset
|
206 g_free(gunk->url); |
6516 | 207 g_free(gunk->user_agent); |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1250
diff
changeset
|
208 g_free(gunk); |
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1250
diff
changeset
|
209 return; |
1087
56c7ceb986a8
[gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
691
diff
changeset
|
210 } |
1 | 211 |
2369
117e9f0950b6
[gaim-migrate @ 2382]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2090
diff
changeset
|
212 if (!gunk->sentreq) { |
6516 | 213 char buf[1024]; |
3717
988485669631
[gaim-migrate @ 3850]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
3630
diff
changeset
|
214 |
6516 | 215 if(gunk->user_agent) { |
216 if(gunk->http11) | |
217 g_snprintf(buf, sizeof(buf), "GET %s%s HTTP/1.1\r\nUser-Agent: \"%s\"\r\nHost: %s\r\n\r\n", gunk->full ? "" : "/", | |
218 gunk->full ? gunk->url : gunk->website->page, gunk->user_agent, gunk->website->address); | |
219 else | |
220 g_snprintf(buf, sizeof(buf), "GET %s%s HTTP/1.0\r\nUser-Agent: \"%s\"\r\n\r\n", gunk->full ? "" : "/", | |
221 gunk->full ? gunk->url : gunk->website->page, gunk->user_agent); | |
222 } | |
223 else { | |
224 if(gunk->http11) | |
225 g_snprintf(buf, sizeof(buf), "GET %s%s HTTP/1.1\r\nHost: %s\r\n\r\n", gunk->full ? "" : "/", | |
226 gunk->full ? gunk->url : gunk->website->page, gunk->website->address); | |
227 else | |
228 g_snprintf(buf, sizeof(buf), "GET %s%s HTTP/1.0\r\n\r\n", gunk->full ? "" : "/", | |
229 gunk->full ? gunk->url : gunk->website->page); | |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
5176
diff
changeset
|
230 |
6516 | 231 } |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
5176
diff
changeset
|
232 gaim_debug(GAIM_DEBUG_MISC, "grab_url_callback", |
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
5176
diff
changeset
|
233 "Request: %s\n", buf); |
3717
988485669631
[gaim-migrate @ 3850]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
3630
diff
changeset
|
234 |
2369
117e9f0950b6
[gaim-migrate @ 2382]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2090
diff
changeset
|
235 write(sock, buf, strlen(buf)); |
117e9f0950b6
[gaim-migrate @ 2382]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2090
diff
changeset
|
236 fcntl(sock, F_SETFL, O_NONBLOCK); |
117e9f0950b6
[gaim-migrate @ 2382]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2090
diff
changeset
|
237 gunk->sentreq = TRUE; |
117e9f0950b6
[gaim-migrate @ 2382]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2090
diff
changeset
|
238 gunk->inpa = gaim_input_add(sock, GAIM_INPUT_READ, grab_url_callback, dat); |
4331
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
239 gunk->data_len = 4096; |
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
240 gunk->webdata = g_malloc(gunk->data_len); |
2369
117e9f0950b6
[gaim-migrate @ 2382]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2090
diff
changeset
|
241 return; |
117e9f0950b6
[gaim-migrate @ 2382]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2090
diff
changeset
|
242 } |
1 | 243 |
2369
117e9f0950b6
[gaim-migrate @ 2382]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2090
diff
changeset
|
244 if (read(sock, &data, 1) > 0 || errno == EWOULDBLOCK) { |
278
29e1669b006b
[gaim-migrate @ 288]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
268
diff
changeset
|
245 if (errno == EWOULDBLOCK) { |
29e1669b006b
[gaim-migrate @ 288]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
268
diff
changeset
|
246 errno = 0; |
2369
117e9f0950b6
[gaim-migrate @ 2382]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2090
diff
changeset
|
247 return; |
117e9f0950b6
[gaim-migrate @ 2382]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2090
diff
changeset
|
248 } |
4331
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
249 |
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
250 gunk->len++; |
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
251 |
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
252 if (gunk->len == gunk->data_len + 1) { |
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
253 gunk->data_len += (gunk->data_len) / 2; |
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
254 |
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
255 gunk->webdata = g_realloc(gunk->webdata, gunk->data_len); |
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
256 } |
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
257 |
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
258 gunk->webdata[gunk->len - 1] = data; |
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
259 |
2584
34812d648f72
[gaim-migrate @ 2597]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2541
diff
changeset
|
260 if (!gunk->startsaving) { |
34812d648f72
[gaim-migrate @ 2597]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2541
diff
changeset
|
261 if (data == '\r') |
34812d648f72
[gaim-migrate @ 2597]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2541
diff
changeset
|
262 return; |
34812d648f72
[gaim-migrate @ 2597]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2541
diff
changeset
|
263 if (data == '\n') { |
4331
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
264 if (gunk->newline) { |
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
265 size_t content_len; |
2584
34812d648f72
[gaim-migrate @ 2597]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2541
diff
changeset
|
266 gunk->startsaving = TRUE; |
4331
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
267 |
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
268 /* See if we can find a redirect. */ |
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
269 if (parse_redirect(gunk->webdata, gunk->len, sock, gunk)) |
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
270 return; |
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
271 |
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
272 /* No redirect. See if we can find a content length. */ |
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
273 content_len = parse_content_len(gunk->webdata, gunk->len); |
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
274 |
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
275 if (content_len == 0) { |
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
276 /* We'll stick with an initial 8192 */ |
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
277 content_len = 8192; |
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
278 } |
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
279 |
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
280 /* Out with the old... */ |
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
281 gunk->len = 0; |
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
282 g_free(gunk->webdata); |
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
283 gunk->webdata = NULL; |
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
284 |
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
285 /* In with the new. */ |
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
286 gunk->data_len = content_len; |
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
287 gunk->webdata = g_malloc(gunk->data_len); |
bbd7b12986a8
[gaim-migrate @ 4595]
Christian Hammond <chipx86@chipx86.com>
parents:
4322
diff
changeset
|
288 } |
2584
34812d648f72
[gaim-migrate @ 2597]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2541
diff
changeset
|
289 else |
34812d648f72
[gaim-migrate @ 2597]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2541
diff
changeset
|
290 gunk->newline = TRUE; |
34812d648f72
[gaim-migrate @ 2597]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2541
diff
changeset
|
291 return; |
34812d648f72
[gaim-migrate @ 2597]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2541
diff
changeset
|
292 } |
34812d648f72
[gaim-migrate @ 2597]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2541
diff
changeset
|
293 gunk->newline = FALSE; |
278
29e1669b006b
[gaim-migrate @ 288]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
268
diff
changeset
|
294 } |
2369
117e9f0950b6
[gaim-migrate @ 2382]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2090
diff
changeset
|
295 } else if (errno != ETIMEDOUT) { |
117e9f0950b6
[gaim-migrate @ 2382]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2090
diff
changeset
|
296 gunk->webdata = g_realloc(gunk->webdata, gunk->len + 1); |
117e9f0950b6
[gaim-migrate @ 2382]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2090
diff
changeset
|
297 gunk->webdata[gunk->len] = 0; |
1250
b5783215b245
[gaim-migrate @ 1260]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1092
diff
changeset
|
298 |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
5176
diff
changeset
|
299 gaim_debug(GAIM_DEBUG_MISC, "grab_url_callback", |
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
5176
diff
changeset
|
300 "Received: '%s'\n", gunk->webdata); |
1250
b5783215b245
[gaim-migrate @ 1260]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1092
diff
changeset
|
301 |
2369
117e9f0950b6
[gaim-migrate @ 2382]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2090
diff
changeset
|
302 gaim_input_remove(gunk->inpa); |
117e9f0950b6
[gaim-migrate @ 2382]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2090
diff
changeset
|
303 close(sock); |
4322 | 304 gunk->callback(gunk->data, gunk->webdata, gunk->len); |
2369
117e9f0950b6
[gaim-migrate @ 2382]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2090
diff
changeset
|
305 if (gunk->webdata) |
117e9f0950b6
[gaim-migrate @ 2382]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2090
diff
changeset
|
306 g_free(gunk->webdata); |
2541
8229710b343b
[gaim-migrate @ 2554]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2417
diff
changeset
|
307 g_free(gunk->website); |
2369
117e9f0950b6
[gaim-migrate @ 2382]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2090
diff
changeset
|
308 g_free(gunk->url); |
6516 | 309 g_free(gunk->user_agent); |
2369
117e9f0950b6
[gaim-migrate @ 2382]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2090
diff
changeset
|
310 g_free(gunk); |
117e9f0950b6
[gaim-migrate @ 2382]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2090
diff
changeset
|
311 } else { |
117e9f0950b6
[gaim-migrate @ 2382]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2090
diff
changeset
|
312 gaim_input_remove(gunk->inpa); |
117e9f0950b6
[gaim-migrate @ 2382]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2090
diff
changeset
|
313 close(sock); |
4322 | 314 gunk->callback(gunk->data, NULL, 0); |
2369
117e9f0950b6
[gaim-migrate @ 2382]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2090
diff
changeset
|
315 if (gunk->webdata) |
117e9f0950b6
[gaim-migrate @ 2382]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2090
diff
changeset
|
316 g_free(gunk->webdata); |
2541
8229710b343b
[gaim-migrate @ 2554]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2417
diff
changeset
|
317 g_free(gunk->website); |
2369
117e9f0950b6
[gaim-migrate @ 2382]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2090
diff
changeset
|
318 g_free(gunk->url); |
6516 | 319 g_free(gunk->user_agent); |
2369
117e9f0950b6
[gaim-migrate @ 2382]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2090
diff
changeset
|
320 g_free(gunk); |
1 | 321 } |
322 } | |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1250
diff
changeset
|
323 |
6516 | 324 void grab_url(char *url, gboolean full, void callback(gpointer, char *, unsigned long), |
325 gpointer data, char *user_agent, int http11) | |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1250
diff
changeset
|
326 { |
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1250
diff
changeset
|
327 int sock; |
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1250
diff
changeset
|
328 struct grab_url_data *gunk = g_new0(struct grab_url_data, 1); |
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1250
diff
changeset
|
329 |
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1250
diff
changeset
|
330 gunk->callback = callback; |
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1250
diff
changeset
|
331 gunk->data = data; |
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1250
diff
changeset
|
332 gunk->url = g_strdup(url); |
6516 | 333 gunk->user_agent = (user_agent) ? g_strdup(user_agent) : NULL; |
334 gunk->http11 = http11; | |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1250
diff
changeset
|
335 gunk->website = parse_url(url); |
2584
34812d648f72
[gaim-migrate @ 2597]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2541
diff
changeset
|
336 gunk->full = full; |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1250
diff
changeset
|
337 |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5512
diff
changeset
|
338 if ((sock = gaim_proxy_connect(NULL, gunk->website->address, |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5512
diff
changeset
|
339 gunk->website->port, grab_url_callback, |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5512
diff
changeset
|
340 gunk)) < 0) { |
2541
8229710b343b
[gaim-migrate @ 2554]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2417
diff
changeset
|
341 g_free(gunk->website); |
1881
a02584b98823
[gaim-migrate @ 1891]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1843
diff
changeset
|
342 g_free(gunk->url); |
6516 | 343 g_free(gunk->user_agent); |
1881
a02584b98823
[gaim-migrate @ 1891]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1843
diff
changeset
|
344 g_free(gunk); |
4322 | 345 callback(data, g_strdup(_("g003: Error opening connection.\n")), 0); |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1250
diff
changeset
|
346 } |
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1250
diff
changeset
|
347 } |
5093 | 348 |
5104 | 349 struct gaim_parse_tag { |
350 char *src_tag; | |
351 char *dest_tag; | |
352 }; | |
353 | |
5093 | 354 #define ALLOW_TAG_ALT(x, y) if(!g_ascii_strncasecmp(c, "<" x " ", strlen("<" x " "))) { \ |
5176 | 355 const char *o = c + strlen("<" x); \ |
5141 | 356 const char *p = NULL, *q = NULL, *r = NULL; \ |
5176 | 357 GString *innards = g_string_new(""); \ |
358 while(o && *o) { \ | |
5141 | 359 if(!q && (*o == '\"' || *o == '\'') ) { \ |
360 q = o; \ | |
361 } else if(q) { \ | |
362 if(*o == *q) { \ | |
5176 | 363 char *unescaped = g_strndup(q+1, o-q-1); \ |
364 char *escaped = g_markup_escape_text(unescaped, -1); \ | |
365 g_string_append_printf(innards, "%c%s%c", *q, escaped, *q); \ | |
5940 | 366 g_free(unescaped); \ |
367 g_free(escaped); \ | |
5141 | 368 q = NULL; \ |
369 } else if(*c == '\\') { \ | |
370 o++; \ | |
371 } \ | |
372 } else if(*o == '<') { \ | |
373 r = o; \ | |
374 } else if(*o == '>') { \ | |
375 p = o; \ | |
376 break; \ | |
5176 | 377 } else { \ |
378 innards = g_string_append_c(innards, *o); \ | |
5141 | 379 } \ |
380 o++; \ | |
381 } \ | |
382 if(p && !r) { \ | |
5104 | 383 if(*(p-1) != '/') { \ |
384 struct gaim_parse_tag *pt = g_new0(struct gaim_parse_tag, 1); \ | |
385 pt->src_tag = x; \ | |
386 pt->dest_tag = y; \ | |
387 tags = g_list_prepend(tags, pt); \ | |
388 } \ | |
5093 | 389 xhtml = g_string_append(xhtml, "<" y); \ |
390 c += strlen("<" x ); \ | |
5176 | 391 xhtml = g_string_append(xhtml, innards->str); \ |
392 xhtml = g_string_append_c(xhtml, '>'); \ | |
5093 | 393 c = p + 1; \ |
394 } else { \ | |
395 xhtml = g_string_append(xhtml, "<"); \ | |
5110 | 396 plain = g_string_append_c(plain, '<'); \ |
5176 | 397 c++; \ |
5093 | 398 } \ |
5176 | 399 g_string_free(innards, TRUE); \ |
5093 | 400 continue; \ |
401 } \ | |
402 if(!g_ascii_strncasecmp(c, "<" x, strlen("<" x)) && \ | |
403 (*(c+strlen("<" x)) == '>' || \ | |
404 !g_ascii_strncasecmp(c+strlen("<" x), "/>", 2))) { \ | |
405 xhtml = g_string_append(xhtml, "<" y); \ | |
406 c += strlen("<" x); \ | |
5104 | 407 if(*c != '/') { \ |
408 struct gaim_parse_tag *pt = g_new0(struct gaim_parse_tag, 1); \ | |
409 pt->src_tag = x; \ | |
410 pt->dest_tag = y; \ | |
411 tags = g_list_prepend(tags, pt); \ | |
5110 | 412 xhtml = g_string_append_c(xhtml, '>'); \ |
413 } else { \ | |
414 xhtml = g_string_append(xhtml, "/>");\ | |
5104 | 415 } \ |
5110 | 416 c = strchr(c, '>') + 1; \ |
5093 | 417 continue; \ |
418 } | |
419 #define ALLOW_TAG(x) ALLOW_TAG_ALT(x, x) | |
420 | |
5110 | 421 void html_to_xhtml(const char *html, char **xhtml_out, char **plain_out) { |
5093 | 422 GString *xhtml = g_string_new(""); |
5110 | 423 GString *plain = g_string_new(""); |
5093 | 424 GList *tags = NULL, *tag; |
5141 | 425 const char *c = html; |
5176 | 426 |
427 while(c && *c) { | |
5141 | 428 if(*c == '<') { |
5093 | 429 if(*(c+1) == '/') { /* closing tag */ |
430 tag = tags; | |
431 while(tag) { | |
5104 | 432 struct gaim_parse_tag *pt = tag->data; |
433 if(!g_ascii_strncasecmp((c+2), pt->src_tag, strlen(pt->src_tag)) && *(c+strlen(pt->src_tag)+2) == '>') { | |
434 c += strlen(pt->src_tag) + 3; | |
5093 | 435 break; |
436 } | |
437 tag = tag->next; | |
438 } | |
439 if(tag) { | |
440 while(tags) { | |
5104 | 441 struct gaim_parse_tag *pt = tags->data; |
442 g_string_append_printf(xhtml, "</%s>", pt->dest_tag); | |
5093 | 443 if(tags == tag) |
444 break; | |
5104 | 445 tags = g_list_remove(tags, pt); |
446 g_free(pt); | |
5093 | 447 } |
5104 | 448 g_free(tag->data); |
5093 | 449 tags = g_list_remove(tags, tag->data); |
450 } else { | |
451 /* we tried to close a tag we never opened! escape it | |
452 * and move on */ | |
453 xhtml = g_string_append(xhtml, "<"); | |
5110 | 454 plain = g_string_append_c(plain, '<'); |
5093 | 455 c++; |
456 } | |
457 } else { /* opening tag */ | |
458 ALLOW_TAG("a"); | |
5101 | 459 ALLOW_TAG_ALT("b", "strong"); |
5093 | 460 ALLOW_TAG("blockquote"); |
5101 | 461 ALLOW_TAG_ALT("bold", "strong"); |
5093 | 462 ALLOW_TAG("cite"); |
463 ALLOW_TAG("div"); | |
464 ALLOW_TAG("em"); | |
465 ALLOW_TAG("h1"); | |
466 ALLOW_TAG("h2"); | |
467 ALLOW_TAG("h3"); | |
468 ALLOW_TAG("h4"); | |
469 ALLOW_TAG("h5"); | |
470 ALLOW_TAG("h6"); | |
471 ALLOW_TAG("html"); | |
5101 | 472 ALLOW_TAG_ALT("i", "em"); |
473 ALLOW_TAG_ALT("italic", "em"); | |
5093 | 474 ALLOW_TAG("li"); |
475 ALLOW_TAG("ol"); | |
476 ALLOW_TAG("p"); | |
477 ALLOW_TAG("pre"); | |
478 ALLOW_TAG("q"); | |
479 ALLOW_TAG("span"); | |
480 ALLOW_TAG("strong"); | |
481 ALLOW_TAG("ul"); | |
482 | |
5174 | 483 /* we skip <HR> because it's not legal in XHTML-IM. However, |
484 * we still want to send something sensible, so we put a | |
485 * linebreak in its place. <BR> also needs special handling | |
486 * because putting a </BR> to close it would just be dumb. */ | |
487 if((!g_ascii_strncasecmp(c, "<br", 3) | |
488 || !g_ascii_strncasecmp(c, "<hr", 3)) | |
489 && (*(c+3) == '>' || | |
490 !g_ascii_strncasecmp(c+3, "/>", 2) || | |
491 !g_ascii_strncasecmp(c+3, " />", 3))) { | |
492 c = strchr(c, '>') + 1; | |
493 xhtml = g_string_append(xhtml, "<br/>"); | |
494 if(*c != '\n') | |
495 plain = g_string_append_c(plain, '\n'); | |
496 continue; | |
497 } | |
498 if(!g_ascii_strncasecmp(c, "<u>", 3) || !g_ascii_strncasecmp(c, "<underline>", strlen("<underline>"))) { | |
5104 | 499 struct gaim_parse_tag *pt = g_new0(struct gaim_parse_tag, 1); |
500 pt->src_tag = *(c+2) == '>' ? "u" : "underline"; | |
501 pt->dest_tag = "span"; | |
502 tags = g_list_prepend(tags, pt); | |
503 c = strchr(c, '>') + 1; | |
504 xhtml = g_string_append(xhtml, "<span style='text-decoration: underline;'>"); | |
505 continue; | |
506 } | |
5174 | 507 if(!g_ascii_strncasecmp(c, "<s>", 3) || !g_ascii_strncasecmp(c, "<strike>", strlen("<strike>"))) { |
5104 | 508 struct gaim_parse_tag *pt = g_new0(struct gaim_parse_tag, 1); |
509 pt->src_tag = *(c+2) == '>' ? "s" : "strike"; | |
510 pt->dest_tag = "span"; | |
511 tags = g_list_prepend(tags, pt); | |
512 c = strchr(c, '>') + 1; | |
513 xhtml = g_string_append(xhtml, "<span style='text-decoration: line-through;'>"); | |
514 continue; | |
515 } | |
516 if(!g_ascii_strncasecmp(c, "<sub>", 5)) { | |
517 struct gaim_parse_tag *pt = g_new0(struct gaim_parse_tag, 1); | |
518 pt->src_tag = "sub"; | |
519 pt->dest_tag = "span"; | |
520 tags = g_list_prepend(tags, pt); | |
521 c = strchr(c, '>') + 1; | |
522 xhtml = g_string_append(xhtml, "<span style='vertical-align:sub;'>"); | |
523 continue; | |
524 } | |
525 if(!g_ascii_strncasecmp(c, "<sup>", 5)) { | |
526 struct gaim_parse_tag *pt = g_new0(struct gaim_parse_tag, 1); | |
527 pt->src_tag = "sup"; | |
528 pt->dest_tag = "span"; | |
529 tags = g_list_prepend(tags, pt); | |
530 c = strchr(c, '>') + 1; | |
531 xhtml = g_string_append(xhtml, "<span style='vertical-align:super;'>"); | |
532 continue; | |
533 } | |
5107 | 534 if(!g_ascii_strncasecmp(c, "<font", 5) && (*(c+5) == '>' || *(c+5) == ' ')) { |
535 const char *p = c; | |
536 GString *style = g_string_new(""); | |
537 struct gaim_parse_tag *pt; | |
538 while(*p && *p != '>') { | |
539 if(!g_ascii_strncasecmp(p, "color=", strlen("color="))) { | |
540 const char *q = p + strlen("color="); | |
541 GString *color = g_string_new(""); | |
542 if(*q == '\'' || *q == '\"') | |
543 q++; | |
544 while(*q && *q != '\"' && *q != '\'' && *q != ' ') { | |
545 color = g_string_append_c(color, *q); | |
546 q++; | |
547 } | |
548 g_string_append_printf(style, "color: %s; ", color->str); | |
549 g_string_free(color, TRUE); | |
550 p = q; | |
551 } else if(!g_ascii_strncasecmp(p, "face=", strlen("face="))) { | |
552 const char *q = p + strlen("face="); | |
553 gboolean space_allowed = FALSE; | |
554 GString *face = g_string_new(""); | |
555 if(*q == '\'' || *q == '\"') { | |
556 space_allowed = TRUE; | |
557 q++; | |
558 } | |
559 while(*q && *q != '\"' && *q != '\'' && (space_allowed || *q != ' ')) { | |
560 face = g_string_append_c(face, *q); | |
561 q++; | |
562 } | |
563 g_string_append_printf(style, "font-family: %s; ", face->str); | |
564 g_string_free(face, TRUE); | |
565 p = q; | |
566 } else if(!g_ascii_strncasecmp(p, "size=", strlen("size="))) { | |
567 const char *q = p + strlen("size="); | |
568 int sz; | |
569 const char *size = "medium"; | |
570 if(*q == '\'' || *q == '\"') | |
571 q++; | |
572 sz = atoi(q); | |
573 if(sz < 3) | |
574 size = "smaller"; | |
575 else if(sz > 3) | |
576 size = "larger"; | |
577 g_string_append_printf(style, "font-size: %s; ", size); | |
578 p = q; | |
579 } | |
580 p++; | |
581 } | |
582 c = strchr(c, '>') + 1; | |
583 pt = g_new0(struct gaim_parse_tag, 1); | |
584 pt->src_tag = "font"; | |
585 pt->dest_tag = "span"; | |
586 tags = g_list_prepend(tags, pt); | |
587 xhtml = g_string_append(xhtml, "<span"); | |
588 if(style->len) | |
589 g_string_append_printf(xhtml, " style='%s'", style->str); | |
590 xhtml = g_string_append_c(xhtml, '>'); | |
591 g_string_free(style, TRUE); | |
592 continue; | |
593 } | |
594 if(!g_ascii_strncasecmp(c, "<body ", 6)) { | |
595 const char *p = c; | |
596 gboolean did_something = FALSE; | |
597 while(*p && *p != '>') { | |
598 if(!g_ascii_strncasecmp(p, "bgcolor=", strlen("bgcolor="))) { | |
599 const char *q = p + strlen("bgcolor="); | |
600 struct gaim_parse_tag *pt = g_new0(struct gaim_parse_tag, 1); | |
601 GString *color = g_string_new(""); | |
602 if(*q == '\'' || *q == '\"') | |
603 q++; | |
604 while(*q && *q != '\"' && *q != '\'' && *q != ' ') { | |
605 color = g_string_append_c(color, *q); | |
606 q++; | |
607 } | |
608 g_string_append_printf(xhtml, "<span style='background: %s;'>", color->str); | |
609 g_string_free(color, TRUE); | |
610 c = strchr(c, '>') + 1; | |
611 pt->src_tag = "body"; | |
612 pt->dest_tag = "span"; | |
613 tags = g_list_prepend(tags, pt); | |
614 did_something = TRUE; | |
615 break; | |
616 } | |
617 p++; | |
618 } | |
619 if(did_something) continue; | |
620 } | |
621 /* this has to come after the special case for bgcolor */ | |
622 ALLOW_TAG("body"); | |
5093 | 623 if(!g_ascii_strncasecmp(c, "<!--", strlen("<!--"))) { |
624 char *p = strstr(c + strlen("<!--"), "-->"); | |
625 if(p) { | |
626 xhtml = g_string_append(xhtml, "<!--"); | |
627 c += strlen("<!--"); | |
628 continue; | |
629 } | |
630 } | |
631 | |
632 xhtml = g_string_append(xhtml, "<"); | |
5110 | 633 plain = g_string_append_c(plain, '<'); |
5093 | 634 c++; |
635 } | |
636 } else { | |
637 xhtml = g_string_append_c(xhtml, *c); | |
5110 | 638 plain = g_string_append_c(plain, *c); |
5093 | 639 c++; |
640 } | |
641 } | |
642 tag = tags; | |
643 while(tag) { | |
644 g_string_append_printf(xhtml, "</%s>", (char *)tag->data); | |
645 tag = tag->next; | |
646 } | |
647 g_list_free(tags); | |
5110 | 648 if(xhtml_out) |
649 *xhtml_out = g_strdup(xhtml->str); | |
650 if(plain_out) | |
651 *plain_out = g_strdup(plain->str); | |
5093 | 652 g_string_free(xhtml, TRUE); |
5110 | 653 g_string_free(plain, TRUE); |
5093 | 654 } |
6514 | 655 |
656 int info_extract_field(char *original, char *add_to, char *start_tok, | |
657 int skip, char *end_tok, char check_value, char *no_value_tok, | |
658 char *display_name, int islink, char *link_prefix) | |
659 { | |
660 char *p, *q; | |
661 char buf[1024]; | |
662 if (!original || !add_to || !start_tok || | |
663 !end_tok || !display_name) | |
664 return 0; | |
665 p = strstr(original, start_tok); | |
666 if (p) { | |
667 p += strlen(start_tok) + skip; | |
668 if (!check_value || (*p != check_value)) { | |
669 q = strstr(p, end_tok); | |
670 if (q && (!no_value_tok || | |
671 (no_value_tok && strncmp(p, no_value_tok, strlen(no_value_tok))))) { | |
672 strcat(add_to, "<b>"); | |
673 strcat(add_to, display_name); | |
674 strcat(add_to, ":</b> "); | |
675 if (islink) { | |
676 strcat(add_to, "<br><a href=\""); | |
677 memcpy(buf, p, q-p); | |
678 buf[q-p] = '\0'; | |
679 if (link_prefix) | |
680 strcat(add_to, link_prefix); | |
681 strcat(add_to, buf); | |
682 strcat(add_to, "\">"); | |
683 if (link_prefix) | |
684 strcat(add_to, link_prefix); | |
685 strcat(add_to, buf); | |
686 strcat(add_to, "</a>"); | |
687 } else { | |
688 memcpy(buf, p, q-p); | |
689 buf[q-p] = '\0'; | |
690 strcat(add_to, buf); | |
691 } | |
692 strcat(add_to, "<br>\n"); | |
693 return 1; | |
694 } else | |
695 return 0; | |
696 } else | |
697 return 0; | |
698 } else | |
699 return 0; | |
700 } |