You are viewing a plain text version of this content. The canonical link for it is here.
Posted to jmeter-dev@jakarta.apache.org by se...@apache.org on 2007/02/09 17:34:05 UTC

svn commit: r505356 - in /jakarta/jmeter/branches/rel-2-2: src/core/org/apache/jmeter/resources/ src/protocol/http/org/apache/jmeter/protocol/http/control/ src/protocol/http/org/apache/jmeter/protocol/http/control/gui/ xdocs/ xdocs/images/screenshots/ ...

Author: sebb
Date: Fri Feb  9 08:34:04 2007
New Revision: 505356

URL: http://svn.apache.org/viewvc?view=rev&rev=505356
Log:
Adding HTTP Mirror server workbench item

Added:
    jakarta/jmeter/branches/rel-2-2/src/protocol/http/org/apache/jmeter/protocol/http/control/HttpMirrorControl.java
    jakarta/jmeter/branches/rel-2-2/src/protocol/http/org/apache/jmeter/protocol/http/control/HttpMirrorServer.java
    jakarta/jmeter/branches/rel-2-2/src/protocol/http/org/apache/jmeter/protocol/http/control/HttpMirrorThread.java
    jakarta/jmeter/branches/rel-2-2/src/protocol/http/org/apache/jmeter/protocol/http/control/gui/HttpMirrorControlGui.java
    jakarta/jmeter/branches/rel-2-2/xdocs/images/screenshots/mirrorserver.png   (with props)
Modified:
    jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/resources/messages.properties
    jakarta/jmeter/branches/rel-2-2/xdocs/changes.xml
    jakarta/jmeter/branches/rel-2-2/xdocs/usermanual/component_reference.xml

Modified: jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/resources/messages.properties
URL: http://svn.apache.org/viewvc/jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/resources/messages.properties?view=diff&rev=505356&r1=505355&r2=505356
==============================================================================
--- jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/resources/messages.properties (original)
+++ jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/resources/messages.properties Fri Feb  9 08:34:04 2007
@@ -245,6 +245,7 @@
 html_assertion_title=HTML Assertion
 html_parameter_mask=HTML Parameter Mask
 http_implementation=HTTP Implementation:
+httpmirror_title=HTTP Mirror Server
 http_response_code=HTTP response code
 http_url_rewriting_modifier_title=HTTP URL Re-writing Modifier
 http_user_parameter_modifier=HTTP User Parameter Modifier

Added: jakarta/jmeter/branches/rel-2-2/src/protocol/http/org/apache/jmeter/protocol/http/control/HttpMirrorControl.java
URL: http://svn.apache.org/viewvc/jakarta/jmeter/branches/rel-2-2/src/protocol/http/org/apache/jmeter/protocol/http/control/HttpMirrorControl.java?view=auto&rev=505356
==============================================================================
--- jakarta/jmeter/branches/rel-2-2/src/protocol/http/org/apache/jmeter/protocol/http/control/HttpMirrorControl.java (added)
+++ jakarta/jmeter/branches/rel-2-2/src/protocol/http/org/apache/jmeter/protocol/http/control/HttpMirrorControl.java Fri Feb  9 08:34:04 2007
@@ -0,0 +1,97 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * 
+ */
+
+package org.apache.jmeter.protocol.http.control;
+
+import java.io.Serializable;
+
+import org.apache.jmeter.config.ConfigElement;
+import org.apache.jmeter.control.GenericController;
+import org.apache.jmeter.testelement.property.IntegerProperty;
+import org.apache.jmeter.util.JMeterUtils;
+
+//For unit tests, @see TestHttpMirrorControl
+
+public class HttpMirrorControl extends GenericController implements Serializable {
+    
+	private transient HttpMirrorServer server;
+
+	private static final int DEFAULT_PORT = 8080;
+
+    // and as a string
+	public static final String DEFAULT_PORT_S =
+        Integer.toString(DEFAULT_PORT);// Used by GUI
+
+	public static final String PORT = "HttpMirrorControlGui.port"; // $NON-NLS-1$
+
+	public HttpMirrorControl() {
+		setPort(DEFAULT_PORT);
+	}
+
+	public void setPort(int port) {
+		this.setProperty(new IntegerProperty(PORT, port));
+	}
+
+	public void setPort(String port) {
+		setProperty(PORT, port);
+	}
+	
+	public String getClassLabel() {
+		return JMeterUtils.getResString("httpmirror_title");
+	}
+
+
+	public int getPort() {
+		return getPropertyAsInt(PORT);
+	}
+
+	public String getPortString() {
+		return getPropertyAsString(PORT);
+	}
+
+	public int getDefaultPort() {
+		return DEFAULT_PORT;
+	}
+
+	public Class getGuiClass() {
+		return org.apache.jmeter.protocol.http.control.gui.HttpMirrorControlGui.class;
+	}
+
+	public void addConfigElement(ConfigElement config) {
+	}
+
+	public void startHttpMirror() {
+		server = new HttpMirrorServer(getPort());
+		server.start();
+	}
+
+	public void stopHttpMirror() {
+		if (server != null) {
+			server.stopServer();
+			try {
+				server.join(1000); // wait for server to stop
+			} catch (InterruptedException e) {
+			}
+			server = null;
+		}
+	}
+
+	public boolean canRemove() {
+		return null == server;
+	}
+}

Added: jakarta/jmeter/branches/rel-2-2/src/protocol/http/org/apache/jmeter/protocol/http/control/HttpMirrorServer.java
URL: http://svn.apache.org/viewvc/jakarta/jmeter/branches/rel-2-2/src/protocol/http/org/apache/jmeter/protocol/http/control/HttpMirrorServer.java?view=auto&rev=505356
==============================================================================
--- jakarta/jmeter/branches/rel-2-2/src/protocol/http/org/apache/jmeter/protocol/http/control/HttpMirrorServer.java (added)
+++ jakarta/jmeter/branches/rel-2-2/src/protocol/http/org/apache/jmeter/protocol/http/control/HttpMirrorServer.java Fri Feb  9 08:34:04 2007
@@ -0,0 +1,109 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * 
+ */
+
+package org.apache.jmeter.protocol.http.control;
+
+import java.io.InterruptedIOException;
+import java.net.ServerSocket;
+import java.net.Socket;
+
+import org.apache.jorphan.logging.LoggingManager;
+import org.apache.jorphan.util.JOrphanUtils;
+import org.apache.log.Logger;
+
+/**
+ * Server daemon thread. 
+ * Creates main socket and listens on it.
+ * For each client request, creates a thread to handle the request.
+ * 
+ */
+public class HttpMirrorServer extends Thread {
+	private static final Logger log = LoggingManager.getLoggerForClass();
+
+	/**
+	 * The time (in milliseconds) to wait when accepting a client connection.
+	 * The accept will be retried until the Daemon is told to stop. So this
+	 * interval is the longest time that the Daemon will have to wait after
+	 * being told to stop.
+	 */
+	private static final int ACCEPT_TIMEOUT = 1000;
+
+	/** The port to listen on. */
+	private final int daemonPort;
+
+	/** True if the Daemon is currently running. */
+	private volatile boolean running;
+
+	/**
+	 * Create a new Daemon with the specified port and target.
+	 * 
+	 * @param port
+	 *            the port to listen on.
+	 * @param target
+	 *            the target which will receive the generated JMeter test
+	 *            components.
+	 */
+	public HttpMirrorServer(int port) {
+		super("HttpMirrorServer");
+		this.daemonPort = port;
+	}
+
+	/**
+	 * Listen on the daemon port and handle incoming requests. This method will
+	 * not exit until {@link #stopServer()} is called or an error occurs.
+	 */
+	public void run() {
+		running = true;
+		ServerSocket mainSocket = null;
+
+		try {
+			log.info("Creating HttpMirror ... on port " + daemonPort);
+			mainSocket = new ServerSocket(daemonPort);
+			mainSocket.setSoTimeout(ACCEPT_TIMEOUT);
+			log.info("HttpMirror up and running!");
+
+			while (running) {
+				try {
+					// Listen on main socket
+					Socket clientSocket = mainSocket.accept();
+					if (running) {
+						// Pass request to new thread
+						HttpMirrorThread thd = new HttpMirrorThread(clientSocket);
+						log.info("Starting new Mirror thread");
+						thd.start();
+					} else {
+						log.warn("Server not running");
+						JOrphanUtils.closeQuietly(clientSocket);
+					}
+				} catch (InterruptedIOException e) {
+					// Timeout occurred. Ignore, and keep looping until we're
+					// told to stop running.
+				}
+			}
+			log.info("HttpMirror Server stopped");
+		} catch (Exception e) {
+			log.warn("HttpMirror Server stopped", e);
+		} finally {
+			JOrphanUtils.closeQuietly(mainSocket);
+		}
+	}
+
+	public void stopServer() {
+		running = false;
+	}
+}

Added: jakarta/jmeter/branches/rel-2-2/src/protocol/http/org/apache/jmeter/protocol/http/control/HttpMirrorThread.java
URL: http://svn.apache.org/viewvc/jakarta/jmeter/branches/rel-2-2/src/protocol/http/org/apache/jmeter/protocol/http/control/HttpMirrorThread.java?view=auto&rev=505356
==============================================================================
--- jakarta/jmeter/branches/rel-2-2/src/protocol/http/org/apache/jmeter/protocol/http/control/HttpMirrorThread.java (added)
+++ jakarta/jmeter/branches/rel-2-2/src/protocol/http/org/apache/jmeter/protocol/http/control/HttpMirrorThread.java Fri Feb  9 08:34:04 2007
@@ -0,0 +1,84 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * 
+ */
+
+package org.apache.jmeter.protocol.http.control;
+
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+import java.io.PrintWriter;
+import java.net.Socket;
+
+import org.apache.jorphan.logging.LoggingManager;
+import org.apache.jorphan.util.JOrphanUtils;
+import org.apache.log.Logger;
+
+/**
+ * Thread to handle one client request. Gets the request from the client and
+ * sends the response back to the client.
+ */
+public class HttpMirrorThread extends Thread {
+    private static final Logger log = LoggingManager.getLoggerForClass();
+
+	/** Socket to client. */
+	private final Socket clientSocket;
+
+	public HttpMirrorThread(Socket _clientSocket) {
+		this.clientSocket=_clientSocket;
+	}
+
+	/**
+	 * Main processing method for the HttpMirror object
+	 */
+	public void run() {
+		log.info("Starting thread");
+		BufferedReader in = null;
+		PrintWriter out = null;
+		// Seems to fail unless we wait a short while before opening the streams
+		try {
+			Thread.sleep(200);
+		} catch (InterruptedException e) {
+		}
+		try {
+			in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
+			out = new PrintWriter(new OutputStreamWriter(clientSocket.getOutputStream()));
+			out.println("HTTP/1.0 200 OK");
+			out.println("Content-Type: text/plain");
+			out.println();
+			out.flush();
+			String line;
+			while((line = in.readLine()) != null){
+				out.println(line);
+				if (line.length()==0) break;
+			}
+            int c;
+            while(in.ready() && (c = in.read()) != -1) {
+                out.write(c);
+            }
+			out.flush();
+		} catch (Exception e) {
+			log.error("", e);
+		} finally {
+			JOrphanUtils.closeQuietly(out);
+			JOrphanUtils.closeQuietly(in);
+			JOrphanUtils.closeQuietly(clientSocket);
+		}
+		log.info("End of Thread");
+	}
+
+}
\ No newline at end of file

Added: jakarta/jmeter/branches/rel-2-2/src/protocol/http/org/apache/jmeter/protocol/http/control/gui/HttpMirrorControlGui.java
URL: http://svn.apache.org/viewvc/jakarta/jmeter/branches/rel-2-2/src/protocol/http/org/apache/jmeter/protocol/http/control/gui/HttpMirrorControlGui.java?view=auto&rev=505356
==============================================================================
--- jakarta/jmeter/branches/rel-2-2/src/protocol/http/org/apache/jmeter/protocol/http/control/gui/HttpMirrorControlGui.java (added)
+++ jakarta/jmeter/branches/rel-2-2/src/protocol/http/org/apache/jmeter/protocol/http/control/gui/HttpMirrorControlGui.java Fri Feb  9 08:34:04 2007
@@ -0,0 +1,167 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * 
+ */
+
+package org.apache.jmeter.protocol.http.control.gui;
+
+import java.awt.BorderLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.Arrays;
+import java.util.Collection;
+
+import javax.swing.Box;
+import javax.swing.JButton;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JTextField;
+
+import org.apache.jmeter.control.gui.LogicControllerGui;
+import org.apache.jmeter.gui.JMeterGUIComponent;
+import org.apache.jmeter.gui.UnsharedComponent;
+import org.apache.jmeter.gui.util.HorizontalPanel;
+import org.apache.jmeter.gui.util.MenuFactory;
+import org.apache.jmeter.protocol.http.control.HttpMirrorControl;
+import org.apache.jmeter.testelement.TestElement;
+import org.apache.jmeter.util.JMeterUtils;
+import org.apache.jorphan.logging.LoggingManager;
+import org.apache.log.Logger;
+
+public class HttpMirrorControlGui extends LogicControllerGui 
+    implements JMeterGUIComponent, ActionListener, UnsharedComponent {
+	private static transient Logger log = LoggingManager.getLoggerForClass();
+
+	private JTextField portField;
+
+	private JButton stop, start;
+
+	private static final String STOP = "stop";
+
+	private static final String START = "start";
+
+	private HttpMirrorControl mirrorController;
+
+	public HttpMirrorControlGui() {
+		super();
+		log.debug("Creating HttpMirrorControlGui");
+		init();
+	}
+
+	public TestElement createTestElement() {
+		mirrorController = new HttpMirrorControl();
+		log.debug("creating/configuring model = " + mirrorController);
+		modifyTestElement(mirrorController);
+		return mirrorController;
+	}
+
+	/**
+	 * Modifies a given TestElement to mirror the data in the gui components.
+	 * 
+	 * @see org.apache.jmeter.gui.JMeterGUIComponent#modifyTestElement(TestElement)
+	 */
+	public void modifyTestElement(TestElement el) {
+		configureTestElement(el);
+		if (el instanceof HttpMirrorControl) {
+			mirrorController = (HttpMirrorControl) el;
+			mirrorController.setPort(portField.getText());
+		}
+	}
+
+	public String getLabelResource() {
+		return "httpmirror_title";
+	}
+
+	public Collection getMenuCategories() {
+		return Arrays.asList(new String[] { MenuFactory.NON_TEST_ELEMENTS });
+	}
+
+	public void configure(TestElement element) {
+		log.debug("Configuring gui with " + element);
+		super.configure(element);
+		mirrorController = (HttpMirrorControl) element;
+		portField.setText(mirrorController.getPortString());
+		repaint();
+	}
+
+
+	public void actionPerformed(ActionEvent action) {
+		String command = action.getActionCommand();
+
+		if (command.equals(STOP)) {
+			mirrorController.stopHttpMirror();
+			stop.setEnabled(false);
+			start.setEnabled(true);
+		} else if (command.equals(START)) {
+			modifyTestElement(mirrorController);
+			mirrorController.startHttpMirror();
+			start.setEnabled(false);
+			stop.setEnabled(true);
+		}
+	}
+
+	private void init() {
+		setLayout(new BorderLayout(0, 5));
+		setBorder(makeBorder());
+
+		add(makeTitlePanel(), BorderLayout.NORTH);
+
+		JPanel mainPanel = new JPanel(new BorderLayout());
+
+		Box myBox = Box.createVerticalBox();
+		myBox.add(createPortPanel());
+		mainPanel.add(myBox, BorderLayout.NORTH);
+
+        mainPanel.add(createControls(), BorderLayout.SOUTH);
+
+		add(mainPanel, BorderLayout.CENTER);
+	}
+
+	private JPanel createControls() {
+		start = new JButton(JMeterUtils.getResString("start"));
+		start.addActionListener(this);
+		start.setActionCommand(START);
+		start.setEnabled(true);
+
+		stop = new JButton(JMeterUtils.getResString("stop"));
+		stop.addActionListener(this);
+		stop.setActionCommand(STOP);
+		stop.setEnabled(false);
+
+		JPanel panel = new JPanel();
+		panel.add(start);
+		panel.add(stop);
+		return panel;
+	}
+
+	private JPanel createPortPanel() {
+		portField = new JTextField(HttpMirrorControl.DEFAULT_PORT_S, 8);
+		portField.setName(HttpMirrorControl.PORT);
+
+		JLabel label = new JLabel(JMeterUtils.getResString("port"));
+		label.setLabelFor(portField);
+
+		
+		HorizontalPanel panel = new HorizontalPanel();
+		panel.add(label);
+		panel.add(portField);
+
+		panel.add(Box.createHorizontalStrut(10));
+
+		return panel;
+	}
+
+}
\ No newline at end of file

Modified: jakarta/jmeter/branches/rel-2-2/xdocs/changes.xml
URL: http://svn.apache.org/viewvc/jakarta/jmeter/branches/rel-2-2/xdocs/changes.xml?view=diff&rev=505356&r1=505355&r2=505356
==============================================================================
--- jakarta/jmeter/branches/rel-2-2/xdocs/changes.xml (original)
+++ jakarta/jmeter/branches/rel-2-2/xdocs/changes.xml Fri Feb  9 08:34:04 2007
@@ -58,6 +58,7 @@
 <li>HttpClient now behaves the same as the JDK http sampler for invalid certificates etc</li>
 <li>Add Domain and Realm support to HTTP Authorisation Manager</li>
 <li>Bug 33964 - send file as entire post body if name/type are omitted</li>
+<li>HTTP Mirror Server Workbench element</li>
 </ul>
 
 <h4>Bug fixes:</h4>

Added: jakarta/jmeter/branches/rel-2-2/xdocs/images/screenshots/mirrorserver.png
URL: http://svn.apache.org/viewvc/jakarta/jmeter/branches/rel-2-2/xdocs/images/screenshots/mirrorserver.png?view=auto&rev=505356
==============================================================================
Binary file - no diff available.

Propchange: jakarta/jmeter/branches/rel-2-2/xdocs/images/screenshots/mirrorserver.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Modified: jakarta/jmeter/branches/rel-2-2/xdocs/usermanual/component_reference.xml
URL: http://svn.apache.org/viewvc/jakarta/jmeter/branches/rel-2-2/xdocs/usermanual/component_reference.xml?view=diff&rev=505356&r1=505355&r2=505356
==============================================================================
--- jakarta/jmeter/branches/rel-2-2/xdocs/usermanual/component_reference.xml (original)
+++ jakarta/jmeter/branches/rel-2-2/xdocs/usermanual/component_reference.xml Fri Feb  9 08:34:04 2007
@@ -3121,24 +3121,30 @@
 </component>
 
 <component name="WorkBench" index="&sect-num;.9.3"  width="232" height="68" screenshot="workbench.png">
-<description><p>The WorkBench simply provides a place to temporarily store test elements while not in use, for copy/paste purposes, or any other purpose you desire.  When you save your test plan, WorkBench items are not saved with it.  Your WorkBench can be saved independently, if you like (right-click on WorkBench and choose Save).</p></description>
+<description>
+<p>The WorkBench simply provides a place to temporarily store test elements while not in use, for copy/paste purposes, or any other purpose you desire. 
+When you save your test plan, WorkBench items are not saved with it. 
+Your WorkBench can be saved independently, if you like (right-click on WorkBench and choose Save).</p>
+<p>Certain test elements are only available on the WorkBench:</p>
+<ul>
+<li>HTTP Proxy Server</li>
+<li>HTTP Mirror Server</li>
+</ul>
+</description>
 </component>
 
 <component name="SSL Manager" index="&sect-num;.9.4" screenshot="">
 <p>
   The SSL Manager is a way to select a client certificate so that you can test
-  applications that use Public Key Infrastructure (PKI).  In order to use it,
-  you must have JSSE 1.0.2 installed.  Unfortunately, there is no standard method
-  for controling who a client is--and that won't be introduced until JDK 1.4 is
-  officially available.  The SSL Manager should still work with JDK 1.4, so this
-  is the best solution we could come up with.
+  applications that use Public Key Infrastructure (PKI).
+  It is only needed if you have not set up the appropriate System properties.
 </p>
 
 <b>Choosing a Client Certificate</b>
 <p>
   You may either use a Java Key Store (JKS) format key store, or a Public Key
   Certificate Standard #12 (PKCS12) file for your client certificates.  There
-  is a bug in the JSSE libraries that require you to have at least a six character
+  is a feature of the JSSE libraries that require you to have at least a six character
   password on your key (at least for the keytool utility that comes with your
   JDK).
 </p>
@@ -3153,6 +3159,7 @@
   for the keystore is also the password for the private key of the client you want
   to authenticate as.
 </p>
+<p>Or you can set the appropriate System properties - see the system.properties file.</p>
 <p>
   The next time you run your test, the SSL Manager will examine your key store to
   see if it has more than one key available to it.  If there is only one key, SSL
@@ -3176,6 +3183,15 @@
   the "cacerts" file, then you can authenticate against all of the CA certificates
   installed.
 </p>
+</component>
+
+<component name="HTTP Mirror Server" index="&sect-num;.9.5"  width="303" height="139" screenshot="mirrorserver.png">
+<description>
+<p>
+The HTTP Mirrror Server is a very simple HTTP server - it simply mirrors the data sent to it.
+This is useful for checking the content of HTTP requests.
+</p>
+</description>
 </component>
 
 <a href="#">^</a>



---------------------------------------------------------------------
To unsubscribe, e-mail: jmeter-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: jmeter-dev-help@jakarta.apache.org