Welcome to mirror list, hosted at ThFree Co, Russian Federation.

09-revert-http-zlib.patch « patches - github.com/dequis/purple-facebook.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 90e49fd6dc881a5d7182eca49a9402224b80601c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
diff -Naur a/libpurple/http.c b/libpurple/http.c
--- a/libpurple/http.c
+++ b/libpurple/http.c
@@ -29,6 +29,11 @@
 #include "proxy.h"
 #include "purple-socket.h"
 
+#include <zlib.h>
+#ifndef z_const
+#define z_const
+#endif
+
 #define PURPLE_HTTP_URL_CREDENTIALS_CHARS "a-z0-9.,~_/*!&%?=+\\^-"
 #define PURPLE_HTTP_MAX_RECV_BUFFER_LEN 10240
 #define PURPLE_HTTP_MAX_READ_BUFFER_LEN 10240
@@ -212,7 +217,7 @@
 struct _PurpleHttpGzStream
 {
 	gboolean failed;
-	GZlibDecompressor *decompressor;
+	z_stream zs;
 	gsize max_output;
 	gsize decompressed;
 	GString *pending;
@@ -360,14 +365,19 @@
 purple_http_gz_new(gsize max_output, gboolean is_deflate)
 {
 	PurpleHttpGzStream *gzs = g_new0(PurpleHttpGzStream, 1);
-	GZlibCompressorFormat format;
+	int windowBits;
 
 	if (is_deflate)
-		format = G_ZLIB_COMPRESSOR_FORMAT_RAW;
+		windowBits = -MAX_WBITS;
 	else /* is gzip */
-		format = G_ZLIB_COMPRESSOR_FORMAT_GZIP;
+		windowBits = MAX_WBITS + 32;
+
+	if (inflateInit2(&gzs->zs, windowBits) != Z_OK) {
+		purple_debug_error("http", "Cannot initialize zlib stream\n");
+		g_free(gzs);
+		return NULL;
+	}
 
-	gzs->decompressor = g_zlib_decompressor_new(format);
 	gzs->max_output = max_output;
 
 	return gzs;
@@ -379,6 +389,7 @@
 	const gchar *compressed_buff;
 	gsize compressed_len;
 	GString *ret;
+	z_stream *zs;
 
 	g_return_val_if_fail(gzs != NULL, NULL);
 	g_return_val_if_fail(buf != NULL, NULL);
@@ -386,6 +397,8 @@
 	if (gzs->failed)
 		return NULL;
 
+	zs = &gzs->zs;
+
 	if (gzs->pending) {
 		g_string_append_len(gzs->pending, buf, len);
 		compressed_buff = gzs->pending->str;
@@ -395,26 +408,22 @@
 		compressed_len = len;
 	}
 
+	zs->next_in = (z_const Bytef*)compressed_buff;
+	zs->avail_in = compressed_len;
+
 	ret = g_string_new(NULL);
-	while (compressed_len > 0) {
-		GConverterResult gzres;
+	while (zs->avail_in > 0) {
+		int gzres;
 		gchar decompressed_buff[PURPLE_HTTP_GZ_BUFF_LEN];
-		gsize decompressed_len = 0;
-		gsize bytes_read = 0;
-		GError *error = NULL;
-
-		gzres = g_converter_convert(G_CONVERTER(gzs->decompressor),
-			       compressed_buff, compressed_len,
-		       	       decompressed_buff, sizeof(decompressed_buff),
-			       G_CONVERTER_NO_FLAGS,
-			       &bytes_read,
-			       &decompressed_len,
-			       &error);
+		gsize decompressed_len;
 
-		compressed_buff += bytes_read;
-		compressed_len -= bytes_read;
+		zs->next_out = (Bytef*)decompressed_buff;
+		zs->avail_out = sizeof(decompressed_buff);
+		decompressed_len = zs->avail_out = sizeof(decompressed_buff);
+		gzres = inflate(zs, Z_FULL_FLUSH);
+		decompressed_len -= zs->avail_out;
 
-		if (gzres == G_CONVERTER_CONVERTED || G_CONVERTER_FINISHED) {
+		if (gzres == Z_OK || gzres == Z_STREAM_END) {
 			if (decompressed_len == 0)
 				break;
 			if (gzs->decompressed + decompressed_len >=
@@ -424,18 +433,17 @@
 					" decompressed data is reached\n");
 				decompressed_len = gzs->max_output -
 					gzs->decompressed;
-				gzres = G_CONVERTER_FINISHED;
+				gzres = Z_STREAM_END;
 			}
 			gzs->decompressed += decompressed_len;
 			g_string_append_len(ret, decompressed_buff,
 				decompressed_len);
-			if (gzres == G_CONVERTER_FINISHED)
+			if (gzres == Z_STREAM_END)
 				break;
 		} else {
 			purple_debug_error("http",
 				"Decompression failed (%d): %s\n", gzres,
-				error->message);
-			g_clear_error(&error);
+				zs->msg);
 			gzs->failed = TRUE;
 			return NULL;
 		}
@@ -446,9 +454,9 @@
 		gzs->pending = NULL;
 	}
 
-	if (compressed_len > 0) {
-		gzs->pending = g_string_new_len(compressed_buff,
-			compressed_len);
+	if (zs->avail_in > 0) {
+		gzs->pending = g_string_new_len((gchar*)zs->next_in,
+			zs->avail_in);
 	}
 
 	return ret;
@@ -459,7 +467,7 @@
 {
 	if (gzs == NULL)
 		return;
-	g_object_unref(gzs->decompressor);
+	inflateEnd(&gzs->zs);
 	if (gzs->pending)
 		g_string_free(gzs->pending, TRUE);
 	g_free(gzs);