001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: *
017: */
018:
019: /*
020: * Basic TCP Sampler Client class
021: *
022: * Can be used to test the TCP Sampler against an HTTP server
023: *
024: * The protocol handler class name is defined by the property tcp.handler
025: *
026: */
027: package org.apache.jmeter.protocol.tcp.sampler;
028:
029: import java.io.ByteArrayOutputStream;
030: import java.io.IOException;
031: import java.io.InputStream;
032: import java.io.InterruptedIOException;
033: import java.io.OutputStream;
034:
035: import org.apache.jmeter.util.JMeterUtils;
036: import org.apache.jorphan.logging.LoggingManager;
037: import org.apache.log.Logger;
038:
039: /**
040: *
041: *
042: */
043: public class TCPClientImpl implements TCPClient {
044: private static Logger log = LoggingManager.getLoggerForClass();
045:
046: private byte eolByte = (byte) JMeterUtils.getPropDefault(
047: "tcp.eolByte", 0);
048:
049: public TCPClientImpl() {
050: super ();
051: log.info("Using eolByte=" + eolByte);
052: }
053:
054: /*
055: * (non-Javadoc)
056: *
057: * @see org.apache.jmeter.protocol.tcp.sampler.TCPClient#setupTest()
058: */
059: public void setupTest() {
060: log.info("setuptest");
061: }
062:
063: /*
064: * (non-Javadoc)
065: *
066: * @see org.apache.jmeter.protocol.tcp.sampler.TCPClient#teardownTest()
067: */
068: public void teardownTest() {
069: log.info("teardowntest");
070:
071: }
072:
073: /*
074: * (non-Javadoc)
075: *
076: * @see org.apache.jmeter.protocol.tcp.sampler.TCPClient#write(java.io.OutputStream,
077: * java.lang.String)
078: */
079: public void write(OutputStream os, String s) {
080: try {
081: os.write(s.getBytes());
082: os.flush();
083: } catch (IOException e) {
084: log.warn("Write error", e);
085: }
086: log.debug("Wrote: " + s);
087: return;
088: }
089:
090: /*
091: * (non-Javadoc)
092: *
093: * @see org.apache.jmeter.protocol.tcp.sampler.TCPClient#write(java.io.OutputStream,
094: * java.io.InputStream)
095: */
096: public void write(OutputStream os, InputStream is) {
097: byte buff[] = new byte[512];
098: try {
099: while (is.read(buff) > 0) {
100: os.write(buff);
101: os.flush();
102: }
103: } catch (IOException e) {
104: log.warn("Write error", e);
105: }
106: }
107:
108: /*
109: * (non-Javadoc)
110: *
111: * @see org.apache.jmeter.protocol.tcp.sampler.TCPClient#read(java.io.InputStream)
112: */
113: public String read(InputStream is) {
114: byte[] buffer = new byte[4096];
115: ByteArrayOutputStream w = new ByteArrayOutputStream();
116: int x = 0;
117: try {
118: while ((x = is.read(buffer)) > -1) {
119: w.write(buffer, 0, x);
120: if ((eolByte != 0) && (buffer[x - 1] == eolByte))
121: break;
122: }
123: /*
124: * Timeout is reported as follows: JDK1.3: InterruptedIOException
125: * JDK1.4: SocketTimeoutException, which extends
126: * InterruptedIOException
127: *
128: * So to make the code work on both, just check for
129: * InterruptedIOException
130: *
131: * If 1.3 support is dropped, can change to using
132: * SocketTimeoutException
133: *
134: * For more accurate detection of timeouts under 1.3, one could
135: * perhaps examine the Exception message text...
136: *
137: */
138: } catch (InterruptedIOException e) {
139: // drop out to handle buffer
140: } catch (IOException e) {
141: log.warn("Read error:" + e);
142: return "";
143: }
144:
145: // do we need to close byte array (or flush it?)
146: log.debug("Read: " + w.size() + "\n" + w.toString());
147: return w.toString();
148: }
149:
150: /**
151: * @return Returns the eolByte.
152: */
153: public byte getEolByte() {
154: return eolByte;
155: }
156:
157: /**
158: * @param eolByte
159: * The eolByte to set.
160: */
161: public void setEolByte(byte eolByte) {
162: this.eolByte = eolByte;
163: }
164: }
|