diff --git a/4chan_x.user.js b/4chan_x.user.js index 7b5c6e951..f2ecdd12b 100644 --- a/4chan_x.user.js +++ b/4chan_x.user.js @@ -1829,37 +1829,45 @@ } }, post: function(data) { - var boundary, callbacks, form, name, opts, parts, toUTF8, url, val; + var boundary, callbacks, form, i, name, opts, parts, toBin, url, val; url = "http://sys.4chan.org/" + data.board + "/post"; delete data.board; delete data.qr; if (engine === 'gecko' && data.upfile) { - toUTF8 = function(val) { - var c, n, utf, _ref; - utf = ''; - for (n = 0, _ref = val.length - 1; 0 <= _ref ? n <= _ref : n >= _ref; 0 <= _ref ? n++ : n--) { - c = val.charCodeAt(n); - if (c < 128) { - utf += String.fromCharCode(c); - } else if ((127 < c && c < 2048)) { - utf += String.fromCharCode((c >> 6) | 192); - utf += String.fromCharCode((c & 63) | 128); + if (!data.binary) { + toBin = function(data, name, val) { + var bb, r; + bb = new MozBlobBuilder(); + bb.append(val); + r = new FileReader(); + r.onload = function() { + data[name] = r.result; + if (!--i) return qr.message.post(data); + }; + return r.readAsBinaryString(bb.getBlob('text/plain')); + }; + i = Object.keys(data).length; + for (name in data) { + val = data[name]; + if (typeof val === 'object') { + toBin(data.upfile, 'name', data.upfile.name); } else { - utf += String.fromCharCode((c >> 12) | 224); - utf += String.fromCharCode(((c >> 6) & 63) | 128); - utf += String.fromCharCode((c & 63) | 128); + toBin(data, name, String(val)); } } - return utf; - }; + data.board = url.split('/')[3]; + data.binary = true; + return; + } + delete data.binary; boundary = '-------------SMCD' + Date.now(); parts = []; - parts.push('Content-Disposition: form-data; name="upfile"; filename="' + toUTF8(data.upfile.name) + '"\r\n' + 'Content-Type: ' + data.upfile.type + '\r\n\r\n' + data.upfile.buffer + '\r\n'); + parts.push('Content-Disposition: form-data; name="upfile"; filename="' + data.upfile.name + '"\r\n' + 'Content-Type: ' + data.upfile.type + '\r\n\r\n' + data.upfile.buffer + '\r\n'); delete data.upfile; for (name in data) { val = data[name]; if (val) { - parts.push('Content-Disposition: form-data; name="' + name + '"\r\n\r\n' + toUTF8(String(val)) + '\r\n'); + parts.push('Content-Disposition: form-data; name="' + name + '"\r\n\r\n' + val + '\r\n'); } } form = '--' + boundary + '\r\n' + parts.join('--' + boundary + '\r\n') + '--' + boundary + '--\r\n'; diff --git a/script.coffee b/script.coffee index c50f10967..076570f14 100644 --- a/script.coffee +++ b/script.coffee @@ -1403,28 +1403,36 @@ qr = # File with filename upload fix from desuwa if engine is 'gecko' and data.upfile - toUTF8 = (val) -> - utf = '' - for n in [0..val.length-1] - c = val.charCodeAt n - if c < 128 - utf += String.fromCharCode c - else if 127 < c < 2048 - utf += String.fromCharCode (c >> 6) | 192 - utf += String.fromCharCode (c & 63) | 128 + # All of this is fucking retarded. + unless data.binary + toBin = (data, name, val) -> + bb = new MozBlobBuilder() + bb.append val + r = new FileReader() + r.onload = -> + data[name] = r.result + unless --i + qr.message.post data + r.readAsBinaryString bb.getBlob 'text/plain' + i = Object.keys(data).length + for name, val of data + if typeof val is 'object' # File. toBin the filename. + toBin data.upfile, 'name', data.upfile.name else - utf += String.fromCharCode (c >> 12) | 224 - utf += String.fromCharCode ((c >> 6) & 63) | 128 - utf += String.fromCharCode (c & 63) | 128 - utf + toBin data, name, String(val) + data.board = url.split('/')[3] + data.binary = true + return + + delete data.binary boundary = '-------------SMCD' + Date.now(); parts = [] - parts.push 'Content-Disposition: form-data; name="upfile"; filename="' + toUTF8(data.upfile.name) + '"\r\n' + 'Content-Type: ' + data.upfile.type + '\r\n\r\n' + data.upfile.buffer + '\r\n' + parts.push 'Content-Disposition: form-data; name="upfile"; filename="' + data.upfile.name + '"\r\n' + 'Content-Type: ' + data.upfile.type + '\r\n\r\n' + data.upfile.buffer + '\r\n' delete data.upfile for name, val of data - parts.push 'Content-Disposition: form-data; name="' + name + '"\r\n\r\n' + toUTF8(String val) + '\r\n' if val + parts.push 'Content-Disposition: form-data; name="' + name + '"\r\n\r\n' + val + '\r\n' if val form = '--' + boundary + '\r\n' + parts.join('--' + boundary + '\r\n') + '--' + boundary + '--\r\n' else