📄 httpmessage.java
字号:
/************************************************************************
*
* $Id: HttpMessage.java,v 1.2 2002/03/04 21:42:57 echtcherbina Exp $
*
* Copyright (c) 2001 Sun Microsystems, Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* Sun Microsystems, Inc. for Project JXTA."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "Sun", "Sun Microsystems, Inc.", "JXTA" and "Project JXTA"
* must not be used to endorse or promote products derived from this
* software without prior written permission. For written
* permission, please contact Project JXTA at http://www.jxta.org.
*
* 5. Products derived from this software may not be called "JXTA",
* nor may "JXTA" appear in their name, without prior written
* permission of Sun.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL SUN MICROSYSTEMS OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of Project JXTA. For more
* information on Project JXTA, please see
* <http://www.jxta.org/>.
*
* This license is based on the BSD license adopted by the Apache Foundation.
*********************************************************************************/
package net.jxta.impl.endpoint.http;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.SequenceInputStream;
import java.util.Vector;
import org.apache.log4j.Category; import org.apache.log4j.Priority;
/**
* This class defines the wire format of HTTP messages. It also acts as an
* interface to the cm
*/
public class HttpMessage {
private static final Category LOG = Category.getInstance(HttpMessage.class.getName());
private String dn = null;
private String fn = null;
private String doc = null;
public static final String CodeTag = "Code";
public static final String ContentTag = "Msg";
public static final int Ok = 1;
public static final int Failed = 2;
public static final int Empty = 3;
public static final int Content = 4;
public static final HttpMessage OKMESSAGE = new HttpMessage( Ok );
public static final HttpMessage FAILEDMESSAGE = new HttpMessage( Failed );
public static final HttpMessage EMPTYMESSAGE = new HttpMessage( Empty );
private static final long MessageLifeTime = 5 * 60 * 1000; // 5 Minutes
// This constructor is used to send a reply containing
// only a return code.
public HttpMessage(int code) {
doc = "<" + CodeTag + ">" + Integer.toString(code) +
"</" + CodeTag + ">";
}
// This constructor is used to create a HttpMessage off a
// a String (receiving side).
public HttpMessage( String buffer ) {
doc = buffer;
}
public HttpMessage(int code, String buffer ) {
String docstart = "<" + CodeTag + ">" + Integer.toString(code) +
"</" + CodeTag + ">" + "<" + ContentTag + ">\n";
String docend = "</" + ContentTag + ">";
doc = docstart + buffer + docend;
}
public HttpMessage(byte[] buffer) {
doc = new String(buffer);
}
// This constructore is used to send a cmd with a content
// stored in the CM
public HttpMessage(String dn, String fn) {
this.dn = dn;
this.fn = fn;
}
// This constructor is used to send a msg with a content
// stored in the CM
public HttpMessage(String dn, String fn, int code, Vector buffers) {
this( dn, fn, code, combineBuffers( buffers ) );
}
// This constructor is used to send a msg with a content
// stored in the CM
public HttpMessage(String dn, String fn, Vector buffers) {
this( dn, fn, combineBuffers( buffers ) );
}
/**
* combines a vector of byte array buffers into an inputStream
**/
private static InputStream combineBuffers( Vector buffers ) {
Vector streamParts = new Vector( buffers.size() );
for( int each = 0; each < buffers.size(); each++ )
streamParts.addElement(
new ByteArrayInputStream( (byte[]) buffers.elementAt(each) ) );
InputStream combined = new SequenceInputStream( streamParts.elements() );
return combined;
}
// This constructor is used to send a msg with a content
// stored in the CM
public HttpMessage(String dn, String fn, byte[] buffer) {
this( dn, fn, HttpMessage.Content, new ByteArrayInputStream( buffer ) );
}
// This constructor is used to send a msg with a content
// stored in the CM
public HttpMessage(String dn, String fn, InputStream is ) {
this( dn, fn, HttpMessage.Content, is );
}
// This constructor is used to send a msg with a content
// stored in the CM
public HttpMessage(String dn, String fn, int code, InputStream is ) {
this( dn, fn );
String docstart = "<" + CodeTag + ">" + Integer.toString(code) +
"</" + CodeTag + ">" + "<" + ContentTag + ">\n";
String docend = "</" + ContentTag + ">";
Vector streamParts = new Vector();
streamParts.addElement( new ByteArrayInputStream(docstart.getBytes()) );
streamParts.addElement( is );
streamParts.addElement( new ByteArrayInputStream(docend.getBytes()) );
InputStream combined = new SequenceInputStream( streamParts.elements() );
try {
HttpTransport.cm.saveBytes(dn,
fn,
combined,
MessageLifeTime,
MessageLifeTime);
} catch( Exception ignored ) {
// 20010828 bondolo@jxta.org you would think it was important to
// not ignore these....
if (LOG.isEnabledFor(Priority.DEBUG)) LOG.debug( "failed to seve to cm", ignored );
}
}
/**
* Returns the entire contents of the message suitable for transmission
*
* @return byte array containing the entire contents of the message.
**/
public byte[] getBytes() {
if (doc == null) {
try {
doc = new String( HttpTransport.cm.restoreBytes( dn, fn ) );
} catch ( Exception punt ) {
if (LOG.isEnabledFor(Priority.DEBUG)) LOG.debug( "failed to restore from cm", punt );
return null;
}
}
return doc.getBytes();
}
/**
* Returns the user data portion of the message
*
* @return byte array containing the user data portion of the message.
**/
public byte[] getData() {
if (doc == null) {
try {
doc = new String( HttpTransport.cm.restoreBytes( dn, fn ) );
} catch ( Exception punt ) {
if (LOG.isEnabledFor(Priority.DEBUG)) LOG.debug( "failed to restore from cm", punt );
return null;
}
}
int indexFirst = doc.indexOf("<" + ContentTag + ">");
int indexLast = doc.lastIndexOf("</" + ContentTag + ">");
if ((indexFirst == -1) || (indexLast == -1)) {
// Invalid message
if (LOG.isEnabledFor(Priority.DEBUG)) LOG.debug( "invalid message " + indexFirst + " " + indexLast );
return null;
}
return doc.substring(indexFirst + ContentTag.length() + 3, // 3 to skip <, >, and \n
indexLast).getBytes();
}
/**
* Returns the status code from the message.
*
* @return int containing the status code.
**/
public int getCode() {
if (doc == null) {
try {
doc = new String( HttpTransport.cm.restoreBytes( dn, fn ) );
} catch ( Exception punt ) {
if (LOG.isEnabledFor(Priority.DEBUG)) LOG.debug( "failed to restore from cm", punt );
return -1;
}
}
int indexFirst = doc.indexOf("<" + CodeTag + ">");
int indexLast = doc.indexOf("</" + CodeTag + ">");
if ((indexFirst == -1) || (indexLast == -1)) {
// Invalid message
return -1;
}
String theCode = doc.substring(indexFirst + CodeTag.length() + 2,
indexLast).trim();
try {
return Integer.parseInt(theCode);
} catch ( NumberFormatException notCode ) {
return -1;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -