00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00025 #include "platform.h"
00026 #include "structures.h"
00027 #include "internal.h"
00028 #include "compression.h"
00029
00030
00031 static const unsigned char
00032 spdyf_zlib_dictionary[] = {
00033 0x00, 0x00, 0x00, 0x07, 0x6f, 0x70, 0x74, 0x69,
00034 0x6f, 0x6e, 0x73, 0x00, 0x00, 0x00, 0x04, 0x68,
00035 0x65, 0x61, 0x64, 0x00, 0x00, 0x00, 0x04, 0x70,
00036 0x6f, 0x73, 0x74, 0x00, 0x00, 0x00, 0x03, 0x70,
00037 0x75, 0x74, 0x00, 0x00, 0x00, 0x06, 0x64, 0x65,
00038 0x6c, 0x65, 0x74, 0x65, 0x00, 0x00, 0x00, 0x05,
00039 0x74, 0x72, 0x61, 0x63, 0x65, 0x00, 0x00, 0x00,
00040 0x06, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x00,
00041 0x00, 0x00, 0x0e, 0x61, 0x63, 0x63, 0x65, 0x70,
00042 0x74, 0x2d, 0x63, 0x68, 0x61, 0x72, 0x73, 0x65,
00043 0x74, 0x00, 0x00, 0x00, 0x0f, 0x61, 0x63, 0x63,
00044 0x65, 0x70, 0x74, 0x2d, 0x65, 0x6e, 0x63, 0x6f,
00045 0x64, 0x69, 0x6e, 0x67, 0x00, 0x00, 0x00, 0x0f,
00046 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x2d, 0x6c,
00047 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x00,
00048 0x00, 0x00, 0x0d, 0x61, 0x63, 0x63, 0x65, 0x70,
00049 0x74, 0x2d, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x73,
00050 0x00, 0x00, 0x00, 0x03, 0x61, 0x67, 0x65, 0x00,
00051 0x00, 0x00, 0x05, 0x61, 0x6c, 0x6c, 0x6f, 0x77,
00052 0x00, 0x00, 0x00, 0x0d, 0x61, 0x75, 0x74, 0x68,
00053 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f,
00054 0x6e, 0x00, 0x00, 0x00, 0x0d, 0x63, 0x61, 0x63,
00055 0x68, 0x65, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72,
00056 0x6f, 0x6c, 0x00, 0x00, 0x00, 0x0a, 0x63, 0x6f,
00057 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e,
00058 0x00, 0x00, 0x00, 0x0c, 0x63, 0x6f, 0x6e, 0x74,
00059 0x65, 0x6e, 0x74, 0x2d, 0x62, 0x61, 0x73, 0x65,
00060 0x00, 0x00, 0x00, 0x10, 0x63, 0x6f, 0x6e, 0x74,
00061 0x65, 0x6e, 0x74, 0x2d, 0x65, 0x6e, 0x63, 0x6f,
00062 0x64, 0x69, 0x6e, 0x67, 0x00, 0x00, 0x00, 0x10,
00063 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d,
00064 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65,
00065 0x00, 0x00, 0x00, 0x0e, 0x63, 0x6f, 0x6e, 0x74,
00066 0x65, 0x6e, 0x74, 0x2d, 0x6c, 0x65, 0x6e, 0x67,
00067 0x74, 0x68, 0x00, 0x00, 0x00, 0x10, 0x63, 0x6f,
00068 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x6c, 0x6f,
00069 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x00,
00070 0x00, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e,
00071 0x74, 0x2d, 0x6d, 0x64, 0x35, 0x00, 0x00, 0x00,
00072 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,
00073 0x2d, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x00, 0x00,
00074 0x00, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e,
00075 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x00, 0x00,
00076 0x00, 0x04, 0x64, 0x61, 0x74, 0x65, 0x00, 0x00,
00077 0x00, 0x04, 0x65, 0x74, 0x61, 0x67, 0x00, 0x00,
00078 0x00, 0x06, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74,
00079 0x00, 0x00, 0x00, 0x07, 0x65, 0x78, 0x70, 0x69,
00080 0x72, 0x65, 0x73, 0x00, 0x00, 0x00, 0x04, 0x66,
00081 0x72, 0x6f, 0x6d, 0x00, 0x00, 0x00, 0x04, 0x68,
00082 0x6f, 0x73, 0x74, 0x00, 0x00, 0x00, 0x08, 0x69,
00083 0x66, 0x2d, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x00,
00084 0x00, 0x00, 0x11, 0x69, 0x66, 0x2d, 0x6d, 0x6f,
00085 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x2d, 0x73,
00086 0x69, 0x6e, 0x63, 0x65, 0x00, 0x00, 0x00, 0x0d,
00087 0x69, 0x66, 0x2d, 0x6e, 0x6f, 0x6e, 0x65, 0x2d,
00088 0x6d, 0x61, 0x74, 0x63, 0x68, 0x00, 0x00, 0x00,
00089 0x08, 0x69, 0x66, 0x2d, 0x72, 0x61, 0x6e, 0x67,
00090 0x65, 0x00, 0x00, 0x00, 0x13, 0x69, 0x66, 0x2d,
00091 0x75, 0x6e, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69,
00092 0x65, 0x64, 0x2d, 0x73, 0x69, 0x6e, 0x63, 0x65,
00093 0x00, 0x00, 0x00, 0x0d, 0x6c, 0x61, 0x73, 0x74,
00094 0x2d, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65,
00095 0x64, 0x00, 0x00, 0x00, 0x08, 0x6c, 0x6f, 0x63,
00096 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x00, 0x00,
00097 0x0c, 0x6d, 0x61, 0x78, 0x2d, 0x66, 0x6f, 0x72,
00098 0x77, 0x61, 0x72, 0x64, 0x73, 0x00, 0x00, 0x00,
00099 0x06, 0x70, 0x72, 0x61, 0x67, 0x6d, 0x61, 0x00,
00100 0x00, 0x00, 0x12, 0x70, 0x72, 0x6f, 0x78, 0x79,
00101 0x2d, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74,
00102 0x69, 0x63, 0x61, 0x74, 0x65, 0x00, 0x00, 0x00,
00103 0x13, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2d, 0x61,
00104 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61,
00105 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x00, 0x00, 0x05,
00106 0x72, 0x61, 0x6e, 0x67, 0x65, 0x00, 0x00, 0x00,
00107 0x07, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x72,
00108 0x00, 0x00, 0x00, 0x0b, 0x72, 0x65, 0x74, 0x72,
00109 0x79, 0x2d, 0x61, 0x66, 0x74, 0x65, 0x72, 0x00,
00110 0x00, 0x00, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65,
00111 0x72, 0x00, 0x00, 0x00, 0x02, 0x74, 0x65, 0x00,
00112 0x00, 0x00, 0x07, 0x74, 0x72, 0x61, 0x69, 0x6c,
00113 0x65, 0x72, 0x00, 0x00, 0x00, 0x11, 0x74, 0x72,
00114 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x2d, 0x65,
00115 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x00,
00116 0x00, 0x00, 0x07, 0x75, 0x70, 0x67, 0x72, 0x61,
00117 0x64, 0x65, 0x00, 0x00, 0x00, 0x0a, 0x75, 0x73,
00118 0x65, 0x72, 0x2d, 0x61, 0x67, 0x65, 0x6e, 0x74,
00119 0x00, 0x00, 0x00, 0x04, 0x76, 0x61, 0x72, 0x79,
00120 0x00, 0x00, 0x00, 0x03, 0x76, 0x69, 0x61, 0x00,
00121 0x00, 0x00, 0x07, 0x77, 0x61, 0x72, 0x6e, 0x69,
00122 0x6e, 0x67, 0x00, 0x00, 0x00, 0x10, 0x77, 0x77,
00123 0x77, 0x2d, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e,
00124 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x00, 0x00,
00125 0x00, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64,
00126 0x00, 0x00, 0x00, 0x03, 0x67, 0x65, 0x74, 0x00,
00127 0x00, 0x00, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75,
00128 0x73, 0x00, 0x00, 0x00, 0x06, 0x32, 0x30, 0x30,
00129 0x20, 0x4f, 0x4b, 0x00, 0x00, 0x00, 0x07, 0x76,
00130 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x00, 0x00,
00131 0x00, 0x08, 0x48, 0x54, 0x54, 0x50, 0x2f, 0x31,
00132 0x2e, 0x31, 0x00, 0x00, 0x00, 0x03, 0x75, 0x72,
00133 0x6c, 0x00, 0x00, 0x00, 0x06, 0x70, 0x75, 0x62,
00134 0x6c, 0x69, 0x63, 0x00, 0x00, 0x00, 0x0a, 0x73,
00135 0x65, 0x74, 0x2d, 0x63, 0x6f, 0x6f, 0x6b, 0x69,
00136 0x65, 0x00, 0x00, 0x00, 0x0a, 0x6b, 0x65, 0x65,
00137 0x70, 0x2d, 0x61, 0x6c, 0x69, 0x76, 0x65, 0x00,
00138 0x00, 0x00, 0x06, 0x6f, 0x72, 0x69, 0x67, 0x69,
00139 0x6e, 0x31, 0x30, 0x30, 0x31, 0x30, 0x31, 0x32,
00140 0x30, 0x31, 0x32, 0x30, 0x32, 0x32, 0x30, 0x35,
00141 0x32, 0x30, 0x36, 0x33, 0x30, 0x30, 0x33, 0x30,
00142 0x32, 0x33, 0x30, 0x33, 0x33, 0x30, 0x34, 0x33,
00143 0x30, 0x35, 0x33, 0x30, 0x36, 0x33, 0x30, 0x37,
00144 0x34, 0x30, 0x32, 0x34, 0x30, 0x35, 0x34, 0x30,
00145 0x36, 0x34, 0x30, 0x37, 0x34, 0x30, 0x38, 0x34,
00146 0x30, 0x39, 0x34, 0x31, 0x30, 0x34, 0x31, 0x31,
00147 0x34, 0x31, 0x32, 0x34, 0x31, 0x33, 0x34, 0x31,
00148 0x34, 0x34, 0x31, 0x35, 0x34, 0x31, 0x36, 0x34,
00149 0x31, 0x37, 0x35, 0x30, 0x32, 0x35, 0x30, 0x34,
00150 0x35, 0x30, 0x35, 0x32, 0x30, 0x33, 0x20, 0x4e,
00151 0x6f, 0x6e, 0x2d, 0x41, 0x75, 0x74, 0x68, 0x6f,
00152 0x72, 0x69, 0x74, 0x61, 0x74, 0x69, 0x76, 0x65,
00153 0x20, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61,
00154 0x74, 0x69, 0x6f, 0x6e, 0x32, 0x30, 0x34, 0x20,
00155 0x4e, 0x6f, 0x20, 0x43, 0x6f, 0x6e, 0x74, 0x65,
00156 0x6e, 0x74, 0x33, 0x30, 0x31, 0x20, 0x4d, 0x6f,
00157 0x76, 0x65, 0x64, 0x20, 0x50, 0x65, 0x72, 0x6d,
00158 0x61, 0x6e, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x34,
00159 0x30, 0x30, 0x20, 0x42, 0x61, 0x64, 0x20, 0x52,
00160 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x34, 0x30,
00161 0x31, 0x20, 0x55, 0x6e, 0x61, 0x75, 0x74, 0x68,
00162 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x34, 0x30,
00163 0x33, 0x20, 0x46, 0x6f, 0x72, 0x62, 0x69, 0x64,
00164 0x64, 0x65, 0x6e, 0x34, 0x30, 0x34, 0x20, 0x4e,
00165 0x6f, 0x74, 0x20, 0x46, 0x6f, 0x75, 0x6e, 0x64,
00166 0x35, 0x30, 0x30, 0x20, 0x49, 0x6e, 0x74, 0x65,
00167 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x53, 0x65, 0x72,
00168 0x76, 0x65, 0x72, 0x20, 0x45, 0x72, 0x72, 0x6f,
00169 0x72, 0x35, 0x30, 0x31, 0x20, 0x4e, 0x6f, 0x74,
00170 0x20, 0x49, 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65,
00171 0x6e, 0x74, 0x65, 0x64, 0x35, 0x30, 0x33, 0x20,
00172 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x20,
00173 0x55, 0x6e, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61,
00174 0x62, 0x6c, 0x65, 0x4a, 0x61, 0x6e, 0x20, 0x46,
00175 0x65, 0x62, 0x20, 0x4d, 0x61, 0x72, 0x20, 0x41,
00176 0x70, 0x72, 0x20, 0x4d, 0x61, 0x79, 0x20, 0x4a,
00177 0x75, 0x6e, 0x20, 0x4a, 0x75, 0x6c, 0x20, 0x41,
00178 0x75, 0x67, 0x20, 0x53, 0x65, 0x70, 0x74, 0x20,
00179 0x4f, 0x63, 0x74, 0x20, 0x4e, 0x6f, 0x76, 0x20,
00180 0x44, 0x65, 0x63, 0x20, 0x30, 0x30, 0x3a, 0x30,
00181 0x30, 0x3a, 0x30, 0x30, 0x20, 0x4d, 0x6f, 0x6e,
00182 0x2c, 0x20, 0x54, 0x75, 0x65, 0x2c, 0x20, 0x57,
00183 0x65, 0x64, 0x2c, 0x20, 0x54, 0x68, 0x75, 0x2c,
00184 0x20, 0x46, 0x72, 0x69, 0x2c, 0x20, 0x53, 0x61,
00185 0x74, 0x2c, 0x20, 0x53, 0x75, 0x6e, 0x2c, 0x20,
00186 0x47, 0x4d, 0x54, 0x63, 0x68, 0x75, 0x6e, 0x6b,
00187 0x65, 0x64, 0x2c, 0x74, 0x65, 0x78, 0x74, 0x2f,
00188 0x68, 0x74, 0x6d, 0x6c, 0x2c, 0x69, 0x6d, 0x61,
00189 0x67, 0x65, 0x2f, 0x70, 0x6e, 0x67, 0x2c, 0x69,
00190 0x6d, 0x61, 0x67, 0x65, 0x2f, 0x6a, 0x70, 0x67,
00191 0x2c, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2f, 0x67,
00192 0x69, 0x66, 0x2c, 0x61, 0x70, 0x70, 0x6c, 0x69,
00193 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x78,
00194 0x6d, 0x6c, 0x2c, 0x61, 0x70, 0x70, 0x6c, 0x69,
00195 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x78,
00196 0x68, 0x74, 0x6d, 0x6c, 0x2b, 0x78, 0x6d, 0x6c,
00197 0x2c, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x70, 0x6c,
00198 0x61, 0x69, 0x6e, 0x2c, 0x74, 0x65, 0x78, 0x74,
00199 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x73, 0x63, 0x72,
00200 0x69, 0x70, 0x74, 0x2c, 0x70, 0x75, 0x62, 0x6c,
00201 0x69, 0x63, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74,
00202 0x65, 0x6d, 0x61, 0x78, 0x2d, 0x61, 0x67, 0x65,
00203 0x3d, 0x67, 0x7a, 0x69, 0x70, 0x2c, 0x64, 0x65,
00204 0x66, 0x6c, 0x61, 0x74, 0x65, 0x2c, 0x73, 0x64,
00205 0x63, 0x68, 0x63, 0x68, 0x61, 0x72, 0x73, 0x65,
00206 0x74, 0x3d, 0x75, 0x74, 0x66, 0x2d, 0x38, 0x63,
00207 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x3d, 0x69,
00208 0x73, 0x6f, 0x2d, 0x38, 0x38, 0x35, 0x39, 0x2d,
00209 0x31, 0x2c, 0x75, 0x74, 0x66, 0x2d, 0x2c, 0x2a,
00210 0x2c, 0x65, 0x6e, 0x71, 0x3d, 0x30, 0x2e
00211 };
00212
00213
00214 int
00215 SPDYF_zlib_deflate_init(z_stream *strm)
00216 {
00217 int ret;
00218
00219 strm->zalloc = Z_NULL;
00220 strm->zfree = Z_NULL;
00221 strm->opaque = Z_NULL;
00222
00223
00224 ret = deflateInit(strm, Z_DEFAULT_COMPRESSION);
00225 if(ret != Z_OK)
00226 {
00227 SPDYF_DEBUG("deflate init");
00228 return SPDY_NO;
00229 }
00230 ret = deflateSetDictionary(strm,
00231 spdyf_zlib_dictionary,
00232 sizeof(spdyf_zlib_dictionary));
00233 if(ret != Z_OK)
00234 {
00235 SPDYF_DEBUG("deflate set dict");
00236 deflateEnd(strm);
00237 return SPDY_NO;
00238 }
00239 return SPDY_YES;
00240 }
00241
00242
00243 void
00244 SPDYF_zlib_deflate_end(z_stream *strm)
00245 {
00246 deflateEnd(strm);
00247 }
00248
00249 int
00250 SPDYF_zlib_deflate(z_stream *strm,
00251 const void *src,
00252 size_t src_size,
00253 size_t *data_used,
00254 void **dest,
00255 size_t *dest_size)
00256 {
00257 int ret;
00258 int flush;
00259 unsigned int have;
00260 Bytef out[SPDYF_ZLIB_CHUNK];
00261
00262 *dest = NULL;
00263 *dest_size = 0;
00264
00265 do
00266 {
00267
00268 if(src_size > SPDYF_ZLIB_CHUNK)
00269 {
00270 strm->avail_in = SPDYF_ZLIB_CHUNK;
00271 src_size -= SPDYF_ZLIB_CHUNK;
00272
00273
00274
00275 flush = Z_NO_FLUSH;
00276 }
00277 else
00278 {
00279 strm->avail_in = src_size;
00280 flush = Z_SYNC_FLUSH;
00281 }
00282 *data_used += strm->avail_in;
00283
00284 strm->next_in = (Bytef *)src;
00285
00286
00287 do
00288 {
00289 strm->avail_out = SPDYF_ZLIB_CHUNK;
00290 strm->next_out = out;
00291
00292
00293
00294 ret = deflate(strm, flush);
00295 have = SPDYF_ZLIB_CHUNK - strm->avail_out;
00296
00297
00298 *dest_size += have;
00299 *dest = realloc(*dest, *dest_size);
00300 if(!*dest)
00301 {
00302 SPDYF_DEBUG("realloc data for result");
00303 deflateEnd(strm);
00304 return SPDY_NO;
00305 }
00306 memcpy((*dest) + ((*dest_size) - have), out, have);
00307 }
00308 while(strm->avail_out == 0);
00309
00310
00311 SPDYF_ASSERT(strm->avail_in == 0,"compressing bug");
00312 }
00313 while(flush != Z_SYNC_FLUSH);
00314
00315 return Z_OK == ret ? SPDY_YES : SPDY_NO;
00316 }
00317
00318
00319 int
00320 SPDYF_zlib_inflate_init(z_stream *strm)
00321 {
00322 int ret;
00323
00324 strm->zalloc = Z_NULL;
00325 strm->zfree = Z_NULL;
00326 strm->opaque = Z_NULL;
00327 strm->avail_in = 0;
00328 strm->next_in = Z_NULL;
00329
00330
00331
00332 ret = inflateInit2(strm, 15);
00333 if(ret != Z_OK)
00334 {
00335 SPDYF_DEBUG("Cannot inflateInit2 the stream");
00336 return SPDY_NO;
00337 }
00338 return SPDY_YES;
00339 }
00340
00341
00342 void
00343 SPDYF_zlib_inflate_end(z_stream *strm)
00344 {
00345 inflateEnd(strm);
00346 }
00347
00348
00349 int
00350 SPDYF_zlib_inflate(z_stream *strm,
00351 const void *src,
00352 size_t src_size,
00353 void **dest,
00354 size_t *dest_size)
00355 {
00356 int ret = Z_OK;
00357 uint32_t have;
00358 Bytef out[SPDYF_ZLIB_CHUNK];
00359
00360 *dest = NULL;
00361 *dest_size = 0;
00362
00363
00364 do
00365 {
00366 if(src_size > SPDYF_ZLIB_CHUNK)
00367 {
00368 strm->avail_in = SPDYF_ZLIB_CHUNK;
00369 src_size -= SPDYF_ZLIB_CHUNK;
00370 }
00371 else
00372 {
00373 strm->avail_in = src_size;
00374 src_size = 0;
00375 }
00376
00377 if(strm->avail_in == 0){
00378
00379 break;
00380 }
00381
00382 strm->next_in = (Bytef *) src;
00383
00384 do {
00385 strm->avail_out = SPDYF_ZLIB_CHUNK;
00386 strm->next_out = out;
00387 ret = inflate(strm, Z_SYNC_FLUSH);
00388
00389 switch (ret)
00390 {
00391 case Z_STREAM_ERROR:
00392 SPDYF_DEBUG("Error on inflate");
00393
00394 return SPDY_NO;
00395
00396 case Z_NEED_DICT:
00397 ret = inflateSetDictionary(strm,
00398 spdyf_zlib_dictionary,
00399 sizeof(spdyf_zlib_dictionary));
00400 if(ret != Z_OK)
00401 {
00402 SPDYF_DEBUG("Error on inflateSetDictionary");
00403 inflateEnd(strm);
00404 return SPDY_NO;
00405 }
00406 ret = inflate(strm, Z_SYNC_FLUSH);
00407 if(Z_STREAM_ERROR == ret)
00408 {
00409 SPDYF_DEBUG("Error on inflate");
00410 return SPDY_NO;
00411 }
00412 break;
00413
00414 case Z_DATA_ERROR:
00415 SPDYF_DEBUG("Z_DATA_ERROR");
00416 inflateEnd(strm);
00417 return SPDY_NO;
00418
00419 case Z_MEM_ERROR:
00420 SPDYF_DEBUG("Z_MEM_ERROR");
00421 inflateEnd(strm);
00422 return SPDY_NO;
00423 }
00424 have = SPDYF_ZLIB_CHUNK - strm->avail_out;
00425 *dest_size += have;
00426
00427 *dest = realloc(*dest, *dest_size);
00428 if(!*dest)
00429 {
00430 SPDYF_DEBUG("Cannot realloc memory");
00431 inflateEnd(strm);
00432 return SPDY_NO;
00433 }
00434 memcpy((*dest) + ((*dest_size) - have), out, have);
00435 }
00436 while (0 == strm->avail_out);
00437 }
00438 while (Z_STREAM_END != ret);
00439
00440 return Z_OK == ret || Z_STREAM_END == ret ? SPDY_YES : SPDY_NO;
00441 }