From ed62f1d8f05b8d6bb3d73f93c518a4ebb675d736 Mon Sep 17 00:00:00 2001 From: hmm Date: Fri, 5 Sep 2014 14:11:21 +0800 Subject: [PATCH 1/3] =?UTF-8?q?1=E3=80=82script=20name=20can't=20be=20null?= =?UTF-8?q?=202.get=20the=20charset=20from=20html=203.close=20record=20ser?= =?UTF-8?q?ver=20when=20web=20page=20closed?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../httpcapture/generator/ResponseHeader.java | 10 ++++ .../httpcapture/generator/ResponseParser.java | 47 +++++++++++++++---- Bench4Q-Web/src/main/webapp/script.jsp | 4 +- .../script/RecordScript/RecordScriptServer.js | 6 +++ .../script/RecordScript/RecordScriptUI.js | 7 ++- .../script/scriptManager/submitScript.js | 2 +- 6 files changed, 62 insertions(+), 14 deletions(-) diff --git a/Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/generator/ResponseHeader.java b/Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/generator/ResponseHeader.java index 567e527c..bce7d1fb 100644 --- a/Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/generator/ResponseHeader.java +++ b/Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/generator/ResponseHeader.java @@ -1,5 +1,6 @@ package org.bench4q.recorder.httpcapture.generator; +import java.nio.charset.Charset; import java.util.HashMap; public class ResponseHeader { @@ -18,6 +19,7 @@ public class ResponseHeader { private String contentEncoding; private int contentLength; private String transferEncoding; + private Charset contentCharset; public int getRespCode() { return respCode; @@ -81,4 +83,12 @@ public class ResponseHeader { public void setTransferEncoding(String transferEncoding) { this.transferEncoding = transferEncoding; } + + public Charset getContentCharset() { + return contentCharset; + } + + public void setContentCharset(Charset charset) { + this.contentCharset = charset; + } } diff --git a/Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/generator/ResponseParser.java b/Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/generator/ResponseParser.java index 1abd5026..af2d6b02 100644 --- a/Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/generator/ResponseParser.java +++ b/Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/generator/ResponseParser.java @@ -7,6 +7,7 @@ import java.nio.charset.Charset; import org.apache.log4j.Logger; import org.bench4q.recorder.httpcapture.ResponseModel; +import org.jsoup.Jsoup; public class ResponseParser { private Logger logger = Logger.getLogger(ResponseParser.class); @@ -80,7 +81,7 @@ public class ResponseParser { } private String parseContentType(HttpURLConnection httpURLConnection) { - + String ret = null; String value = httpURLConnection.getHeaderField("Content-Type"); int pos; @@ -96,14 +97,11 @@ public class ResponseParser { return ret; } - private String parseTransferEncoding(HttpURLConnection httpURLConnection) { - + return httpURLConnection.getHeaderField("Transfer-Encoding"); } - - private void parseResponseBody() { ContentDecoder contentDecoder = ContentDecoder.createDecoder(this .getResponseHeader().getContentEncoding()); @@ -119,25 +117,54 @@ public class ResponseParser { try { charset = Charset.forName(this.getResponseHeader().getCharset()); } catch (Exception e) { - charset = Charset.forName("utf-8"); + charset = getCharsetFromContent(contentBodyAfterDecoded); + if(charset == null){ + charset = Charset.forName("utf-8"); + } + this.getResponseHeader().setContentCharset(charset); logger.error(e, e); } this.setResponseBody(new String(contentBodyAfterDecoded, charset)); } - - public byte[] encodeCoent(String responseBody){ + + private Charset getCharsetFromContent(byte[] content) { + String contentString = new String(content, + Charset.forName("iso-8859-1")).toLowerCase(); + int pos = contentString.indexOf("charset="); + if (pos == -1) + return null; + pos += 8; + char tempChar = contentString.charAt(pos); + StringBuilder sBuilder = new StringBuilder(); + if (tempChar == '"') { + pos++; + } + while ((tempChar = contentString.charAt(pos)) != '"') { + sBuilder.append(tempChar); + pos++; + } + try { + return Charset.forName(sBuilder.toString()); + } catch (Exception e) { + return null; + } + } + + public byte[] encodeCoent(String responseBody) { ContentEncoder contentEncoder = ContentEncoder.createEncoder(this .getResponseHeader().getContentEncoding()); Charset charset = null; try { charset = Charset.forName(this.getResponseHeader().getCharset()); } catch (Exception e) { - charset = Charset.forName("utf-8"); + charset = this.getResponseHeader().getContentCharset(); + if(charset == null) + charset = Charset.forName("utf-8"); logger.error(e, e); } byte[] responseBytes = responseBody.getBytes(charset); responseBytes = contentEncoder.encoderContent(responseBytes); - + return responseBytes; } } diff --git a/Bench4Q-Web/src/main/webapp/script.jsp b/Bench4Q-Web/src/main/webapp/script.jsp index 8ded5155..dae8fe94 100644 --- a/Bench4Q-Web/src/main/webapp/script.jsp +++ b/Bench4Q-Web/src/main/webapp/script.jsp @@ -118,9 +118,9 @@ body { diff --git a/Bench4Q-Web/src/main/webapp/script/RecordScript/RecordScriptServer.js b/Bench4Q-Web/src/main/webapp/script/RecordScript/RecordScriptServer.js index 99f40acf..fd11022d 100644 --- a/Bench4Q-Web/src/main/webapp/script/RecordScript/RecordScriptServer.js +++ b/Bench4Q-Web/src/main/webapp/script/RecordScript/RecordScriptServer.js @@ -112,6 +112,10 @@ function testRecordProxy() { function saveScript() { var scriptName = document.getElementsByName("scriptname")[0].value; + if (scriptName == undefined || scriptName == "") { + information("need a script name!"); + return; + } $.post("saveScriptRecorded", { scriptName : scriptName, port : server.port, @@ -126,5 +130,7 @@ function saveScript() { $('#fileName').hide(); } loadScript(table, 2); + }).error(function(){ + information("failed to connect server"); }); } diff --git a/Bench4Q-Web/src/main/webapp/script/RecordScript/RecordScriptUI.js b/Bench4Q-Web/src/main/webapp/script/RecordScript/RecordScriptUI.js index 9a91300d..c018059d 100644 --- a/Bench4Q-Web/src/main/webapp/script/RecordScript/RecordScriptUI.js +++ b/Bench4Q-Web/src/main/webapp/script/RecordScript/RecordScriptUI.js @@ -2,7 +2,12 @@ $('.btn-setting').click(function(e) { e.preventDefault(); $('#myModal').modal('show'); }); - +window.onbeforeunload = function() { + if(startRecordingSuccess){ + stopRecording(); + }else if(startServerSuccess) + stopServer(); +} function dismiss(container){ $(container).modal('hide'); if(startRecordingSuccess){ diff --git a/Bench4Q-Web/src/main/webapp/script/scriptManager/submitScript.js b/Bench4Q-Web/src/main/webapp/script/scriptManager/submitScript.js index 67316d6d..39bf3940 100644 --- a/Bench4Q-Web/src/main/webapp/script/scriptManager/submitScript.js +++ b/Bench4Q-Web/src/main/webapp/script/scriptManager/submitScript.js @@ -33,7 +33,7 @@ function submitScript(pages,usePlugins,formData) { var scriptName = $("#scriptName").val(); if (scriptName == undefined || scriptName == "") { - information("need a script name!") + information("need a script name!"); return; } var runScenarioModel = new RunScenarioModel(0,usePlugins,new Array(),pages); From c86b657d855d3ad9dc00b791e531b307b9cf7c8b Mon Sep 17 00:00:00 2001 From: luqiong <605601787@qq.com> Date: Fri, 5 Sep 2014 14:56:35 +0800 Subject: [PATCH 2/3] modify testPlan input css --- Bench4Q-Web/src/main/webapp/css/test.css | 9 +++------ Bench4Q-Web/src/main/webapp/test.jsp | 4 ++-- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/Bench4Q-Web/src/main/webapp/css/test.css b/Bench4Q-Web/src/main/webapp/css/test.css index ae60ebbf..c55af61c 100644 --- a/Bench4Q-Web/src/main/webapp/css/test.css +++ b/Bench4Q-Web/src/main/webapp/css/test.css @@ -91,15 +91,12 @@ select{ border:red 2px solid; } .load-config-input{ - width:150px; + width:70%; } .load-config-input-alert{ width:100px; border:red 2px solid; } -#loadConfig td{ - padding-left:50px; -} .allocation-input{ width:100px; } @@ -114,6 +111,6 @@ select{ width:150px; border:red 2px solid; } -#addStep{ - margin-left:50px; +div#test-plan-continuous{ + width:100%; } \ No newline at end of file diff --git a/Bench4Q-Web/src/main/webapp/test.jsp b/Bench4Q-Web/src/main/webapp/test.jsp index 1883d4cc..b34b779d 100644 --- a/Bench4Q-Web/src/main/webapp/test.jsp +++ b/Bench4Q-Web/src/main/webapp/test.jsp @@ -90,7 +90,7 @@ body { (s) - - Date: Fri, 5 Sep 2014 15:13:06 +0800 Subject: [PATCH 3/3] change test plan submit --- .../agent/scriptrecord/ScheduleModel.java | 28 ++++++++----------- .../org/bench4q/web/model/WebScriptModel.java | 16 ++++++----- .../webapp/script/TestPlan/TestPlanModels.js | 7 ++--- .../webapp/script/TestPlan/TestPlanServer.js | 27 +++++++++++------- 4 files changed, 40 insertions(+), 38 deletions(-) diff --git a/Bench4Q-Share/src/main/java/org/bench4q/share/models/agent/scriptrecord/ScheduleModel.java b/Bench4Q-Share/src/main/java/org/bench4q/share/models/agent/scriptrecord/ScheduleModel.java index 8d9a9101..2b5e6c56 100644 --- a/Bench4Q-Share/src/main/java/org/bench4q/share/models/agent/scriptrecord/ScheduleModel.java +++ b/Bench4Q-Share/src/main/java/org/bench4q/share/models/agent/scriptrecord/ScheduleModel.java @@ -7,12 +7,10 @@ import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElementWrapper; import javax.xml.bind.annotation.XmlRootElement; -@XmlRootElement public class ScheduleModel { private List points; - @XmlElementWrapper(name = "points") - @XmlElement(name = "point") + public List getPoints() { return points; } @@ -45,22 +43,28 @@ public class ScheduleModel { return result; } - @XmlRootElement public static class PointModel { // Time Unit is second private long timeInSecond; private int load; - @XmlElement + + public PointModel() { + } + + public PointModel(long timeInSecond, int load) { + this.setTimeInSecond(timeInSecond); + this.setLoad(load); + } + public long getTimeInSecond() { return timeInSecond; } - public void setTimeInSecond(long time) { - this.timeInSecond = time; + public void setTimeInSecond(long timeInSecond) { + this.timeInSecond = timeInSecond; } - @XmlElement public int getLoad() { return load; } @@ -68,13 +72,5 @@ public class ScheduleModel { public void setLoad(int load) { this.load = load; } - - public PointModel() { - } - - public PointModel(long timeInSecond, int load) { - this.timeInSecond = timeInSecond; - this.load = load; - } } } diff --git a/Bench4Q-Web/src/main/java/org/bench4q/web/model/WebScriptModel.java b/Bench4Q-Web/src/main/java/org/bench4q/web/model/WebScriptModel.java index f1ced4f8..886f47bb 100644 --- a/Bench4Q-Web/src/main/java/org/bench4q/web/model/WebScriptModel.java +++ b/Bench4Q-Web/src/main/java/org/bench4q/web/model/WebScriptModel.java @@ -14,7 +14,7 @@ public class WebScriptModel { public WebScriptModel(int id, int load, ScheduleModel scheduleModel, String filterTypeMatches) { this.id = id; - this.scheduleModel = scheduleModel; + this.setScheduleModel(scheduleModel); this.filterTypeMatches = filterTypeMatches; } @@ -34,13 +34,7 @@ public class WebScriptModel { this.isFilterTimer = timer; } - public ScheduleModel getScheduleModel() { - return scheduleModel; - } - public void setScheduleModel(ScheduleModel scheduleModel) { - this.scheduleModel = scheduleModel; - } public String getFilterTypeMatches() { return filterTypeMatches; @@ -50,4 +44,12 @@ public class WebScriptModel { this.filterTypeMatches = filterTypeMatches; } + public ScheduleModel getScheduleModel() { + return scheduleModel; + } + + public void setScheduleModel(ScheduleModel scheduleModel) { + this.scheduleModel = scheduleModel; + } + } diff --git a/Bench4Q-Web/src/main/webapp/script/TestPlan/TestPlanModels.js b/Bench4Q-Web/src/main/webapp/script/TestPlan/TestPlanModels.js index 47ff7074..c65fdd4d 100644 --- a/Bench4Q-Web/src/main/webapp/script/TestPlan/TestPlanModels.js +++ b/Bench4Q-Web/src/main/webapp/script/TestPlan/TestPlanModels.js @@ -1,9 +1,6 @@ -function ScriptModel(ID, load, warmup, cooldown, executeRange, isFilterTimer, filterTypeMatches) { +function ScriptModel(ID, schedule, isFilterTimer, filterTypeMatches) { this.id = ID; - this.load = load; - this.warmup = warmup; - this.executeRange = executeRange; - this.cooldown = cooldown; + this.scheduleModel = schedule; this.isFilterTimer = isFilterTimer; this.filterTypeMatches = filterTypeMatches; }; diff --git a/Bench4Q-Web/src/main/webapp/script/TestPlan/TestPlanServer.js b/Bench4Q-Web/src/main/webapp/script/TestPlan/TestPlanServer.js index 850535bf..a4aa884f 100644 --- a/Bench4Q-Web/src/main/webapp/script/TestPlan/TestPlanServer.js +++ b/Bench4Q-Web/src/main/webapp/script/TestPlan/TestPlanServer.js @@ -65,7 +65,15 @@ function getScriptId(scriptName) { return scriptId; } - +function getPointModelList(allocation,requireLoadArrayObj,executeRangeArrayObj){ + var pointModelList = new Array(); + for(var i=1;i< requireLoadArrayObj.length;i++){ + var realLoad = parseInt(parseInt(requireLoadArrayObj[i].value)*allocation/100); + var pointModel = new WebPointModel(parseInt(executeRangeArrayObj[i].value),realLoad); + pointModelList.push(pointModel); + } + return pointModelList; +} function start() { var scriptList = new Array(); @@ -73,17 +81,16 @@ function start() { ipList = getIpList(); var input = $("#userConfig").find("tbody").find("tr").find(".allocation-input"); var allocationList = new Array(); - var loadList = new Array(); - var requireLoad = parseInt($("#RequireLoad").val()); var scriptList = new Array(); var scriptIdList = new Array(); - var warmUp = parseInt($("#WarmUp").val()); - var coolDown = parseInt($("#CoolDown").val()); - var executeRange = parseInt($("#ExecuteRange").val()); + + // + var requireLoadArrayObj = $("#test-plan-continuous").find("input[name='RequireLoad']"); + var executeRangeArrayObj = $("#test-plan-continuous").find("input[name='ExecuteRange']"); + for ( var i = 0; i < input.length; i++) allocationList.push(parseInt(input[i].value)); - for ( var j = 0; j < input.length; j++) - loadList.push(parseInt(requireLoad * allocationList[j] / 100)); + scriptIdList = getScriptIdList(); var isFilterTimer = false; @@ -104,8 +111,8 @@ function start() { filterTypeMatches = filterTypeMatches.substring(0,filterTypeMatches.length-1); for ( var k = 0; k < input.length; k++){ - scriptList.push(new ScriptModel(scriptIdList[k], loadList[k], warmUp, - coolDown, executeRange,isFilterTimer,filterTypeMatches)); + var scheduleModel = new WebScheduleModel(getPointModelList(allocationList[k],requireLoadArrayObj,executeRangeArrayObj)); + scriptList.push(new ScriptModel(scriptIdList[k],scheduleModel ,isFilterTimer,filterTypeMatches)); }