From dab9da28f15e85bd4845be15c3c98b740b9d3515 Mon Sep 17 00:00:00 2001 From: MURAOKA Daisuke Date: Tue, 18 May 2010 15:56:38 +0900 Subject: [PATCH 1/3] support for POST request that docomo UID parameter is included in URI --- src/components/msimModifyHeaders.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/msimModifyHeaders.js b/src/components/msimModifyHeaders.js index 5ead77c..98e25da 100644 --- a/src/components/msimModifyHeaders.js +++ b/src/components/msimModifyHeaders.js @@ -307,7 +307,8 @@ function rewriteURI(subject, url) { subject.cancel(Cr.NS_ERROR_FAILURE); var webNav = subject.notificationCallbacks .getInterface(Ci.nsIWebNavigation); - webNav.loadURI(url, Ci.nsIWebNavigation.LOAD_FLAGS_NONE, null, null, null); + var uploadStream = subject.QueryInterface(Ci.nsIUploadChannel).uploadStream; + webNav.loadURI(url, Ci.nsIWebNavigation.LOAD_FLAGS_NONE, null, uploadStream, null); //webNav.loadURI(url, subject.loadFlags, null, null, null); } } From d473ab290268c421ec0b3ff0ebf399d535126034 Mon Sep 17 00:00:00 2001 From: MURAOKA Daisuke Date: Mon, 24 May 2010 13:21:03 +0900 Subject: [PATCH 2/3] change implementation of sending uid and open iarea in POST request --- src/chrome/content/contentHandler/docomo.js | 28 +----- src/components/msimModifyHeaders.js | 98 ++++++++++++++++++++- 2 files changed, 95 insertions(+), 31 deletions(-) diff --git a/src/chrome/content/contentHandler/docomo.js b/src/chrome/content/contentHandler/docomo.js index 7475574..2c06365 100644 --- a/src/chrome/content/contentHandler/docomo.js +++ b/src/chrome/content/contentHandler/docomo.js @@ -70,9 +70,6 @@ firemobilesimulator.contentHandler.docomo = { ndDocument.addEventListener("keypress", firemobilesimulator.contentHandler.common.createAccessKeyFunction(["accesskey"]), false); // formのUTN送信 - // uid=NULLGWDOCOMOのPOST送信 - // オープンiエリアの場合のメソッドを強制的にGETに書き換え - // ##本当はhttp-on-modify-requestで書き換えたい## var formTags = ndDocument.getElementsByTagName("form"); for (var i = 0; i < formTags.length; i++) { var formTag = formTags[i]; @@ -88,29 +85,6 @@ firemobilesimulator.contentHandler.docomo = { dump("setlcs for form tag\n"); formTag.addEventListener("submit", setLcsFunction, false); } - - // オープンiエリアの場合のメソッドを強制的にGETに書き換え - var action = formTag.getAttribute("action"); - if (action && action == "http://w1m.docomo.ne.jp/cp/iarea") { - formTag.setAttribute("method", "GET"); - } - - // uid=NULLGWDOCOMOのPOST送信 - var method = formTag.getAttribute("method"); - if (method && method.toUpperCase() == "POST") { - var inputTags = formTag.getElementsByTagName("input"); - for (var j = 0; j < inputTags.length; j++) { - var inputTag = inputTags[j]; - var key = inputTag.getAttribute("name"); - var value = inputTag.value; - if (key && value && key.toUpperCase() == "UID" - && value.toUpperCase() == "NULLGWDOCOMO") { - dump("replace uid\n"); - var uid = firemobilesimulator.common.carrier.getId(firemobilesimulator.common.carrier.idType.DOCOMO_UID,deviceId); - inputTag.value = uid; - } - } - } } } -}; \ No newline at end of file +}; diff --git a/src/components/msimModifyHeaders.js b/src/components/msimModifyHeaders.js index 98e25da..f685d1c 100644 --- a/src/components/msimModifyHeaders.js +++ b/src/components/msimModifyHeaders.js @@ -75,6 +75,7 @@ myHTTPListener.prototype = { var rewriteFlag = false; var as = uri.asciiSpec; var qs = ""; + var ps = null; var uid = firemobilesimulator.common.carrier.getId(firemobilesimulator.common.carrier.idType.DOCOMO_UID,id); var ser = firemobilesimulator.common.carrier.getId(firemobilesimulator.common.carrier.idType.DOCOMO_SER,id); @@ -131,6 +132,53 @@ myHTTPListener.prototype = { as = parts[0] + "?" + qs; } + // POSTパラメータ解析&UID送信 + if (httpChannel.requestMethod == "POST") { + var uploadChannel = subject.QueryInterface(Ci.nsIUploadChannel); + + if (uploadChannel.uploadStream != null) { + var seekable = uploadChannel.uploadStream; + seekable.QueryInterface(Ci.nsISeekableStream); + var stream = Components.classes["@mozilla.org/scriptableinputstream;1"].createInstance(Ci.nsIScriptableInputStream); + stream.init(uploadChannel.uploadStream); + + var valid = false; + for (var line = processLine(stream); line; line = processLine(stream)) { + var header = line.match(/^([^:]+):\s?(.*)/); + + if (header == null) + continue; + + if (header[1].toLowerCase() == "content-type" && header[2].toLowerCase() == "application/x-www-form-urlencoded") + valid = true; + } + + if (valid) { + var postParams = stream.read(stream.available()); + //dump("[msim]POST parameter: "+postParams+"\n"); + + var values = postParams.split("&"); + + if (uri.scheme != "https") { + // HTTPSではUID送信とiモードID送信は行わない + + values = values.map(function(value) { + //dump("[msim]value: "+value+"\n"); + if (value.toUpperCase() == "UID=NULLGWDOCOMO") { + dump("[msim]send uid:"+uid+" for docomo.\n"); + value = value.substr(0, 3) + "=" + uid; + rewriteFlag = true; + } + return value; + }); + } + ps = values.join("&"); + //dump("[msim]replace POST parameter: "+ps+"\n"); + } + seekable.seek(0, 0); + } + } + var lcsFlag = firemobilesimulator.common.pref .getBoolPref("msim.temp.lcsflag"); if (true == lcsFlag) { @@ -167,7 +215,12 @@ myHTTPListener.prototype = { } if (uri.host == "w1m.docomo.ne.jp") { - var param = qs ? "?" + qs : ""; + var param = ""; + if (httpChannel.requestMethod == "GET") { + param = qs ? "?" + qs : ""; + } else if (httpChannel.requestMethod == "POST") { + param = ps ? "?" + ps : ""; + } var path = uri.path.split("?", 2)[0]; if (path == "/cp/iarea") { // オープンiエリア対応 @@ -179,7 +232,7 @@ myHTTPListener.prototype = { } else if (rewriteFlag) { dump("[msim]rewrite for DoCoMo\n"); //dump("[msim]rewrite for docomo\n"); - rewriteURI(subject, as); + rewriteURI(subject, as, ps); } } else if (carrier == "SB") { var type = firemobilesimulator.common.pref.copyUnicharPref("msim.devicelist."+id+".type1"); @@ -299,7 +352,7 @@ function NSGetModule(compMgr, fileSpec) { return myModule; } -function rewriteURI(subject, url) { +function rewriteURI(subject, url, postStr) { var documentLoad = subject.loadFlags & (1<<16); //TODO: の指定などでrewriteする場合に対応要 if (documentLoad) { @@ -307,8 +360,45 @@ function rewriteURI(subject, url) { subject.cancel(Cr.NS_ERROR_FAILURE); var webNav = subject.notificationCallbacks .getInterface(Ci.nsIWebNavigation); - var uploadStream = subject.QueryInterface(Ci.nsIUploadChannel).uploadStream; + var uploadChannel = subject.QueryInterface(Ci.nsIUploadChannel); + var uploadStream = uploadChannel.uploadStream; + if (postStr != null) { + if (uploadStream instanceof Ci.nsIMIMEInputStream){ + //dump("[msim]uploadStream is nsIMIMEInputStream\n"); + var inputStream = Cc["@mozilla.org/io/string-input-stream;1"].createInstance(Ci.nsIStringInputStream); + inputStream.setData(postStr, postStr.length); + + inputStream.QueryInterface(Ci.nsISeekableStream); + inputStream.seek(0, 0); + inputStream.QueryInterface(Ci.nsIInputStream); + uploadStream.setData(inputStream); + } else if (uploadStream instanceof Ci.nsIStringInputStream) { + //dump("[msim]uploadStream is nsIStringInputStream\n"); + var contentType = "Content-Type: application/x-www-form-urlencoded\r\n"; + var contentLength = "Content-Length: " + postStr.length + "\r\n"; + uploadStream.setData(contentType + contentLength + "\r\n" + postStr, contentType.length + contentLength.length + 2 + postStr.length); + } + //dump("[msim]set upload stream: "+postStr+"\n"); + } + webNav.loadURI(url, Ci.nsIWebNavigation.LOAD_FLAGS_NONE, null, uploadStream, null); //webNav.loadURI(url, subject.loadFlags, null, null, null); } } + +function processLine(stream) { + var line = ""; + var size = stream.available(); + + for (var i = 0; i < size; i++) { + var c = stream.read(1); + + if (c == '\n') + break; + + if (c != '\r') + line += c; + } + + return line; +} From 771d6719047025488e8de6978c013d060cfe1555 Mon Sep 17 00:00:00 2001 From: Koji Ando Date: Thu, 2 Aug 2012 01:46:57 +0900 Subject: [PATCH 3/3] replace tabs into 2 spaces. --- src/chrome/content/contentHandler/docomo.js | 130 ++++++++++---------- 1 file changed, 65 insertions(+), 65 deletions(-) diff --git a/src/chrome/content/contentHandler/docomo.js b/src/chrome/content/contentHandler/docomo.js index 2c06365..9485cf3 100644 --- a/src/chrome/content/contentHandler/docomo.js +++ b/src/chrome/content/contentHandler/docomo.js @@ -19,72 +19,72 @@ var firemobilesimulator; if (!firemobilesimulator) - firemobilesimulator = {}; + firemobilesimulator = {}; if (!firemobilesimulator.contentHandler) - firemobilesimulator.contentHandler = {}; + firemobilesimulator.contentHandler = {}; firemobilesimulator.contentHandler.docomo = { - filter : function (ndDocument, deviceId) { - firemobilesimulator.contentHandler.common.filter(ndDocument, deviceId); - var setUtnFunction = function(e) { - dump("[msim]click utn\n"); - if (true == confirm(firemobilesimulator.overlay.strings - .getString("msim_utnConfirmation"))) { - firemobilesimulator.common.pref.setBoolPref("msim.temp.utnflag", - true); - } - return true; - }; - - var setLcsFunction = function(e) { - dump("[msim]click lcs\n"); - if (true == confirm(firemobilesimulator.overlay.strings - .getString("msim_lcsConfirmation"))) { - firemobilesimulator.common.pref.setBoolPref("msim.temp.lcsflag", - true); - return true; - } else { - return false; - } - }; - - firemobilesimulator.common.pref.setBoolPref("msim.temp.utnflag", false); - firemobilesimulator.common.pref.setBoolPref("msim.temp.lcsflag", false); - - var anchorTags = ndDocument.getElementsByTagName("a"); - for (var i = 0; i < anchorTags.length; i++) { - var anchorTag = anchorTags[i]; - var utn = anchorTag.getAttribute("utn"); - if (null != utn) { - anchorTag.addEventListener("click", setUtnFunction, false); - } - - var lcs = anchorTag.getAttribute("lcs"); - if (null != lcs) { - dump("setlcs for a tag\n"); - anchorTag.addEventListener("click", setLcsFunction, false); - } - } - - // accesskey対応 - ndDocument.addEventListener("keypress", firemobilesimulator.contentHandler.common.createAccessKeyFunction(["accesskey"]), false); - - // formのUTN送信 - var formTags = ndDocument.getElementsByTagName("form"); - for (var i = 0; i < formTags.length; i++) { - var formTag = formTags[i]; - - // UTNセット - var utn = formTag.getAttribute("utn"); - if (null != utn) { - formTag.addEventListener("submit", setUtnFunction, false); - } - - var lcs = formTag.getAttribute("lcs"); - if (null != lcs) { - dump("setlcs for form tag\n"); - formTag.addEventListener("submit", setLcsFunction, false); - } - } - } + filter : function (ndDocument, deviceId) { + firemobilesimulator.contentHandler.common.filter(ndDocument, deviceId); + var setUtnFunction = function(e) { + dump("[msim]click utn\n"); + if (true == confirm(firemobilesimulator.overlay.strings + .getString("msim_utnConfirmation"))) { + firemobilesimulator.common.pref.setBoolPref("msim.temp.utnflag", + true); + } + return true; + }; + + var setLcsFunction = function(e) { + dump("[msim]click lcs\n"); + if (true == confirm(firemobilesimulator.overlay.strings + .getString("msim_lcsConfirmation"))) { + firemobilesimulator.common.pref.setBoolPref("msim.temp.lcsflag", + true); + return true; + } else { + return false; + } + }; + + firemobilesimulator.common.pref.setBoolPref("msim.temp.utnflag", false); + firemobilesimulator.common.pref.setBoolPref("msim.temp.lcsflag", false); + + var anchorTags = ndDocument.getElementsByTagName("a"); + for (var i = 0; i < anchorTags.length; i++) { + var anchorTag = anchorTags[i]; + var utn = anchorTag.getAttribute("utn"); + if (null != utn) { + anchorTag.addEventListener("click", setUtnFunction, false); + } + + var lcs = anchorTag.getAttribute("lcs"); + if (null != lcs) { + dump("setlcs for a tag\n"); + anchorTag.addEventListener("click", setLcsFunction, false); + } + } + + // accesskey対応 + ndDocument.addEventListener("keypress", firemobilesimulator.contentHandler.common.createAccessKeyFunction(["accesskey"]), false); + + // formのUTN送信 + var formTags = ndDocument.getElementsByTagName("form"); + for (var i = 0; i < formTags.length; i++) { + var formTag = formTags[i]; + + // UTNセット + var utn = formTag.getAttribute("utn"); + if (null != utn) { + formTag.addEventListener("submit", setUtnFunction, false); + } + + var lcs = formTag.getAttribute("lcs"); + if (null != lcs) { + dump("setlcs for form tag\n"); + formTag.addEventListener("submit", setLcsFunction, false); + } + } + } };