if (typeof(JS_LIB_LOADED)=='boolean')
{
const JS_MULTIPARTREQUEST_FILE = "multipartRequest.js";
const JS_MULTIPARTREQUEST_LOADED = true;
const boundary = "--i-N-5-4-N-3-k-4-n-3-------------314159265358979323846";
const delimiter = "\r\n--"+boundary+"\r\n" ;
const close_delim = "\r\n--"+boundary+"--" ;
// accepts several parameters, which are placed in the body
// of the request
function
Parts () { this._array = new Array; }
Parts.prototype =
{
_iterind: 0,
put: function (part)
{
this._array.push(part);
},
find: function (type)
{
var list = new Parts;
this.resetIterator();
while(this.hasMoreElements())
{
var param = this.getNext();
if (param.type == type) list.put(param);
}
return list;
},
// iterator
resetIterator: function () { this._iterind = 0; },
hasMoreElements: function ()
{
if (this._iterind < this._array.length - 1) return true;
else return false;
},
next: function () { return this._array[_iterind++]; }
}
function MultipartRequest (baseuri)
{
this.baseu = baseuri;
this.parts = new Parts;
}
MultipartRequest.prototype =
{
baseu: null,
method: "POST",
parts: null,
put: function (part)
{
this.parts.put(part);
return this;
},
getRequestUri: function ()
{
var uri = this.baseu;
uri +="?";
while (this.parts.hasMoreElements())
{
var part = this.parts.getNext();
var params = part._getRequestUriParams();
if (params == null) continue;
params.resetIterator();
while (params.hasMoreElements())
{
var head = params.getNext();
uri += head.key +"="+head.value+"&";
}
}
uri = uri.slice(0,-1); //remove the last & or last ?
return uri;
},
getRequestMethod: function () { return this.method; },
setRequestHeaders: function (xhr)
{
while (this.parts.hasMoreElements())
{
var part = this.parts.getNext();
if (typeof(part) == "URLParameterPart") {
var phead = part._getRequestHeaders();
if (params == null) continue;
phead.resetIterator();
while (phead.hasMoreElements())
{
var head = phead.getNext();
xhr.setRequestHeader(head.key,head.value);
}
}
}
xhr.setRequestHeader("Content-type","multipart/form-data; boundary="+boundary);
},
getBody: function ()
{
var delimstrm = jslibCreateInstance("@mozilla.org/io/string-input-stream;1",
"nsIStringInputStream");
delimstrm.setData(delimiter,-1);
var multiplexstrm =
jslibCreateInstance("@mozilla.org/io/multiplex-input-stream;1",
"nsIMultiplexInputStream");
multiplexstrm.appendStream(delimstrm);
this.parts.resetIterator();
// for each part
while (this.parts.hasMoreElements())
{
var part = this.parts.getNext();
var mimestrm =
jslibCreateInstance("@mozilla.org/network/mime-input-stream;1",
"nsIMIMEInputStream");
mimestrm.addContentLength = true;
var body = part._getBody();
if ( body == null ) continue;
var phead = part._getRequestHeaders();
phead.resetIterator();
while (phead.hasMoreElements())
{
var head = phead.getNext();
mimestrm.addHeader(head.key,head.value);
}
mimestrm.setData(body);
multiplexstrm.appendStream(mimestrm);
// is it necessary to create a new stream ?
// leave it in anyway
delimstrm = jslibCreateInstance("@mozilla.org/io/string-input-stream;1",
"nsIStringInputStream");
delimstrm.setData(delimiter,-1);
multiplexstrm.appendStream(delimstrm);
}
var cdelimstrm = jslibCreateInstance("@mozilla.org/io/string-input-stream;1",
"nsIStringInputStream");
cdelimstrm.setData(close_delim,-1);
multiplexstrm.appendStream(cdelimstrm);
return multiplexstrm;
}
}
jslibLoadMsg(JS_MULTIPARTREQUEST_FILE);
} else { dump("Load Failure: multipartRequest.js\n"); }