You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by tr...@apache.org on 2005/04/23 19:43:27 UTC
svn commit: r164404 - in /directory/network/trunk:
src/examples/org/apache/mina/examples/echoserver/ssl/
src/examples/org/apache/mina/examples/httpserver/
src/java/org/apache/mina/io/ src/java/org/apache/mina/io/handler/
src/java/org/apache/mina/protocol/ xdocs/
Author: trustin
Date: Sat Apr 23 10:43:26 2005
New Revision: 164404
URL: http://svn.apache.org/viewcvs?rev=164404&view=rev
Log:
* Added StreamIoHandler that enables stream-based I/O for MINA
* Added HTTP server example
* Added some JavaDocs
Added:
directory/network/trunk/src/examples/org/apache/mina/examples/echoserver/ssl/package.html (with props)
directory/network/trunk/src/examples/org/apache/mina/examples/httpserver/
directory/network/trunk/src/examples/org/apache/mina/examples/httpserver/HttpProtocolHandler.java (with props)
directory/network/trunk/src/examples/org/apache/mina/examples/httpserver/Main.java (with props)
directory/network/trunk/src/examples/org/apache/mina/examples/httpserver/package.html (with props)
directory/network/trunk/src/java/org/apache/mina/io/handler/
directory/network/trunk/src/java/org/apache/mina/io/handler/StreamIoHandler.java (with props)
directory/network/trunk/src/java/org/apache/mina/io/handler/package.html (with props)
Modified:
directory/network/trunk/src/java/org/apache/mina/io/AbstractIoHandlerFilterChain.java
directory/network/trunk/src/java/org/apache/mina/protocol/AbstractProtocolHandlerFilterChain.java
directory/network/trunk/xdocs/index.xml
Added: directory/network/trunk/src/examples/org/apache/mina/examples/echoserver/ssl/package.html
URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/examples/org/apache/mina/examples/echoserver/ssl/package.html?rev=164404&view=auto
==============================================================================
--- directory/network/trunk/src/examples/org/apache/mina/examples/echoserver/ssl/package.html (added)
+++ directory/network/trunk/src/examples/org/apache/mina/examples/echoserver/ssl/package.html Sat Apr 23 10:43:26 2005
@@ -0,0 +1,8 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+</head>
+<body>
+SSL support classes.
+</body>
+</html>
Propchange: directory/network/trunk/src/examples/org/apache/mina/examples/echoserver/ssl/package.html
------------------------------------------------------------------------------
svn:keywords = HeadURL Id LastChangedBy LastChangedDate LastChangedRevision
Added: directory/network/trunk/src/examples/org/apache/mina/examples/httpserver/HttpProtocolHandler.java
URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/examples/org/apache/mina/examples/httpserver/HttpProtocolHandler.java?rev=164404&view=auto
==============================================================================
--- directory/network/trunk/src/examples/org/apache/mina/examples/httpserver/HttpProtocolHandler.java (added)
+++ directory/network/trunk/src/examples/org/apache/mina/examples/httpserver/HttpProtocolHandler.java Sat Apr 23 10:43:26 2005
@@ -0,0 +1,127 @@
+/*
+ * @(#) $Id$
+ *
+ * Copyright 2004 The Apache Software Foundation
+ *
+ * Licensed 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.mina.examples.httpserver;
+
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.PrintWriter;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.TreeMap;
+import java.util.Map.Entry;
+
+import org.apache.mina.io.IoSession;
+import org.apache.mina.io.handler.StreamIoHandler;
+
+/**
+ * A simplistic HTTP protocol handler that replies back the URL and headers
+ * which a client requested.
+ *
+ * @author The Apache Directory Project (dev@directory.apache.org)
+ * @author Trustin Lee (trustin@apache.org)
+ * @version $Rev$, $Date$
+ */
+public class HttpProtocolHandler extends StreamIoHandler
+{
+ protected void processStreamIo( IoSession session, InputStream in,
+ OutputStream out )
+ {
+ // You *MUST* execute stream I/O logic in a separate thread.
+ new Worker( in, out ).start();
+ }
+
+ private static class Worker extends Thread
+ {
+ private final InputStream in;
+ private final OutputStream out;
+
+ public Worker( InputStream in, OutputStream out )
+ {
+ setDaemon( true );
+ this.in = in;
+ this.out = out;
+ }
+
+ public void run()
+ {
+ String url;
+ Map headers = new TreeMap();
+ BufferedReader in = new BufferedReader(
+ new InputStreamReader( this.in ) );
+ PrintWriter out = new PrintWriter(
+ new BufferedWriter( new OutputStreamWriter( this.out ) ) );
+
+ try
+ {
+ // Get request URL.
+ url = in.readLine().split( " " )[1];
+
+ // Read header
+ String line;
+ while ( ( line = in.readLine() ) != null && !line.equals( "" ) )
+ {
+ String[] tokens = line.split(": ");
+ headers.put( tokens[0], tokens[1] );
+ }
+
+ // Write header
+ out.println( "HTTP/1.0 200 OK" );
+ out.println( "Content-Type: text/html" );
+ out.println( "Server: MINA Example" );
+ out.println();
+
+ // Write content
+ out.println( "<html><head></head><body>" );
+ out.println( "<h3>Request Summary for: " + url + "</h3>" );
+ out.println( "<table border=\"1\"><tr><th>Key</th><th>Value</th></tr>" );
+
+ Iterator it = headers.entrySet().iterator();
+ while( it.hasNext() )
+ {
+ Entry e = ( Entry ) it.next();
+ out.println( "<tr><td>" + e.getKey() + "</td><td>" + e.getValue() + "</td></tr>" );
+ }
+
+ out.println( "</table>" );
+ out.println( "</body></html>" );
+ }
+ catch( Exception e )
+ {
+ e.printStackTrace();
+ }
+ finally
+ {
+ out.flush();
+ out.close();
+ try
+ {
+ in.close();
+ }
+ catch( IOException e )
+ {
+ }
+ }
+ }
+ }
+}
Propchange: directory/network/trunk/src/examples/org/apache/mina/examples/httpserver/HttpProtocolHandler.java
------------------------------------------------------------------------------
svn:keywords = HeadURL Id LastChangedBy LastChangedDate LastChangedRevision
Added: directory/network/trunk/src/examples/org/apache/mina/examples/httpserver/Main.java
URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/examples/org/apache/mina/examples/httpserver/Main.java?rev=164404&view=auto
==============================================================================
--- directory/network/trunk/src/examples/org/apache/mina/examples/httpserver/Main.java (added)
+++ directory/network/trunk/src/examples/org/apache/mina/examples/httpserver/Main.java Sat Apr 23 10:43:26 2005
@@ -0,0 +1,71 @@
+/*
+ * @(#) $Id$
+ *
+ * Copyright 2004 The Apache Software Foundation
+ *
+ * Licensed 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.mina.examples.httpserver;
+
+import java.net.InetSocketAddress;
+
+import org.apache.mina.examples.echoserver.ssl.BogusSSLContextFactory;
+import org.apache.mina.io.IoAcceptor;
+import org.apache.mina.io.filter.IoThreadPoolFilter;
+import org.apache.mina.io.filter.SSLFilter;
+import org.apache.mina.io.socket.SocketAcceptor;
+
+/**
+ * (<b>Entry point</b>) HTTP server
+ *
+ * @author Trustin Lee (trustin@apache.org)
+ * @version $Rev$, $Date$
+ */
+public class Main
+{
+ /** Choose your favorite port number. */
+ private static final int PORT = 8080;
+
+ /** Set this to true if you want to make the server SSL */
+ private static final boolean USE_SSL = false;
+
+ public static void main( String[] args ) throws Exception
+ {
+ // Create a I/O thread pool filter
+ IoThreadPoolFilter threadPoolFilter = new IoThreadPoolFilter();
+ threadPoolFilter.start(); // and start it
+
+ // Create a TCP/IP acceptor
+ IoAcceptor acceptor = new SocketAcceptor();
+
+ // Add thread pool filter
+ // MINA runs in a single thread if you don't add this filter.
+ acceptor.getFilterChain().addFirst( "threadPool", threadPoolFilter );
+
+ // Add SSL filter if SSL is enabled.
+ if( USE_SSL )
+ {
+ System.out.println( "SSL is enabled." );
+ SSLFilter sslFilter = new SSLFilter( BogusSSLContextFactory
+ .getInstance( true ) );
+ acceptor.getFilterChain().addLast( "sslFilter", sslFilter );
+ }
+
+ // Bind
+ acceptor.bind( new InetSocketAddress( PORT ),
+ new HttpProtocolHandler() );
+
+ System.out.println( "Listening on port " + PORT );
+ }
+}
Propchange: directory/network/trunk/src/examples/org/apache/mina/examples/httpserver/Main.java
------------------------------------------------------------------------------
svn:keywords = HeadURL Id LastChangedBy LastChangedDate LastChangedRevision
Added: directory/network/trunk/src/examples/org/apache/mina/examples/httpserver/package.html
URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/examples/org/apache/mina/examples/httpserver/package.html?rev=164404&view=auto
==============================================================================
--- directory/network/trunk/src/examples/org/apache/mina/examples/httpserver/package.html (added)
+++ directory/network/trunk/src/examples/org/apache/mina/examples/httpserver/package.html Sat Apr 23 10:43:26 2005
@@ -0,0 +1,8 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+</head>
+<body>
+Simplistic HTTP server which demonstates stream-based I/O support.
+</body>
+</html>
Propchange: directory/network/trunk/src/examples/org/apache/mina/examples/httpserver/package.html
------------------------------------------------------------------------------
svn:keywords = HeadURL Id LastChangedBy LastChangedDate LastChangedRevision
Modified: directory/network/trunk/src/java/org/apache/mina/io/AbstractIoHandlerFilterChain.java
URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/java/org/apache/mina/io/AbstractIoHandlerFilterChain.java?rev=164404&r1=164403&r2=164404&view=diff
==============================================================================
--- directory/network/trunk/src/java/org/apache/mina/io/AbstractIoHandlerFilterChain.java (original)
+++ directory/network/trunk/src/java/org/apache/mina/io/AbstractIoHandlerFilterChain.java Sat Apr 23 10:43:26 2005
@@ -1,3 +1,21 @@
+/*
+ * @(#) $Id$
+ *
+ * Copyright 2004 The Apache Software Foundation
+ *
+ * Licensed 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.mina.io;
import java.util.ArrayList;
@@ -28,7 +46,7 @@
* finally to be written to the underlying transport layer (e.g. socket)
*
* @author The Apache Directory Project
- * @version $Rev$, $Date$,
+ * @version $Rev$, $Date$
*/
public abstract class AbstractIoHandlerFilterChain implements IoHandlerFilterChain
{
Added: directory/network/trunk/src/java/org/apache/mina/io/handler/StreamIoHandler.java
URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/java/org/apache/mina/io/handler/StreamIoHandler.java?rev=164404&view=auto
==============================================================================
--- directory/network/trunk/src/java/org/apache/mina/io/handler/StreamIoHandler.java (added)
+++ directory/network/trunk/src/java/org/apache/mina/io/handler/StreamIoHandler.java Sat Apr 23 10:43:26 2005
@@ -0,0 +1,290 @@
+package org.apache.mina.io.handler;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.PipedOutputStream;
+import java.net.SocketTimeoutException;
+
+import org.apache.mina.common.ByteBuffer;
+import org.apache.mina.common.IdleStatus;
+import org.apache.mina.io.IoHandlerAdapter;
+import org.apache.mina.io.IoSession;
+
+/**
+ * A {@lin IoHandler} that adapts asynchronous MINA events to stream I/O.
+ * <p>
+ * Please extend this class and implement
+ * {@link #processStreamIo(IoSession, InputStream, OutputStream)} to
+ * execute your stream I/O logic; <b>please note that you must forward
+ * the process request to other thread or thread pool.</b>
+ *
+ * @author The Apache Directory Project (dev@directory.apache.org)
+ * @author Trustin Lee (trustin@apache.org)
+ * @version $Rev$, $Date$
+ */
+public abstract class StreamIoHandler extends IoHandlerAdapter
+{
+ private static final String KEY_IN = "BlockingIoHandler.in";
+ private static final String KEY_OUT = "BlockingIoHandler.out";
+ private static final String KEY_STARTED = "BlockingIoHandler.started";
+
+ private int readTimeout;
+
+ private int writeTimeout;
+
+ protected StreamIoHandler()
+ {
+ }
+
+ /**
+ * Implement this method to execute your stream I/O logic;
+ * <b>please note that you must forward the process request to other
+ * thread or thread pool.</b>
+ */
+ protected abstract void processStreamIo( IoSession session,
+ InputStream in, OutputStream out );
+
+ /**
+ * Returns read timeout in seconds.
+ * The default value is <tt>0</tt> (disabled).
+ */
+ public int getReadTimeout()
+ {
+ return readTimeout;
+ }
+
+ /**
+ * Sets read timeout in seconds.
+ * The default value is <tt>0</tt> (disabled).
+ */
+ public void setReadTimeout( int readTimeout )
+ {
+ this.readTimeout = readTimeout;
+ }
+
+ /**
+ * Returns write timeout in seconds.
+ * The default value is <tt>0</tt> (disabled).
+ */
+ public int getWriteTimeout()
+ {
+ return writeTimeout;
+ }
+
+ /**
+ * Sets write timeout in seconds.
+ * The default value is <tt>0</tt> (disabled).
+ */
+ public void setWriteTimeout( int writeTimeout )
+ {
+ this.writeTimeout = writeTimeout;
+ }
+
+ /**
+ * Initializes streams and timeout settings.
+ */
+ public void sessionOpened( IoSession session )
+ {
+ // Set timeouts
+ session.getConfig().setWriteTimeout( writeTimeout );
+ session.getConfig().setIdleTime( IdleStatus.READER_IDLE, readTimeout );
+
+ // Create streams
+ PipedOutputStream out = new PipedOutputStream();
+ session.setAttribute( KEY_OUT, out );
+ try
+ {
+ session.setAttribute( KEY_IN, new PipedInputStream( out ) );
+ }
+ catch( IOException e )
+ {
+ throw new StreamIoException( e );
+ }
+ }
+
+ /**
+ * Closes input stream.
+ */
+ public void sessionClosed( IoSession session )
+ {
+ final PipedOutputStream out = ( PipedOutputStream ) session.getAttribute( KEY_OUT );
+ try {
+ out.close();
+ }
+ catch( IOException e )
+ {
+ throw new StreamIoException( e );
+ }
+ }
+
+ /**
+ * Forwards read data to input stream.
+ */
+ public void dataRead( IoSession session, ByteBuffer buf )
+ {
+ final PipedInputStream in = ( PipedInputStream ) session.getAttribute( KEY_IN );
+ final PipedOutputStream out = ( PipedOutputStream ) session.getAttribute( KEY_OUT );
+
+ java.nio.ByteBuffer nioBuf = buf.buf();
+ int offset = nioBuf.position();
+ int length = nioBuf.limit() - offset;
+ if( !nioBuf.hasArray() )
+ {
+ ByteBuffer heapBuf = ByteBuffer.allocate( length, false );
+ heapBuf.put( buf );
+ heapBuf.flip();
+ nioBuf = heapBuf.buf();
+ offset = 0;
+ }
+
+ try
+ {
+ out.write( nioBuf.array(), offset, length );
+ }
+ catch( IOException e )
+ {
+ throw new StreamIoException( e );
+ }
+ finally
+ {
+ beginService( session, in );
+ }
+ }
+
+ /**
+ * Forwards caught exceptions to input stream.
+ */
+ public void exceptionCaught( IoSession session, Throwable cause )
+ {
+ final PipedInputStream in = ( PipedInputStream ) session.getAttribute( KEY_IN );
+
+ IOException e = null;
+ if( cause instanceof StreamIoException )
+ {
+ e = ( IOException ) cause.getCause();
+ }
+ else if( cause instanceof IOException )
+ {
+ e = ( IOException ) cause;
+ }
+
+ if( e != null && in != null )
+ {
+ in.setException( e );
+ beginService( session, in );
+ }
+ else
+ {
+ cause.printStackTrace();
+ session.close();
+ }
+ }
+
+ /**
+ * Handles read timeout.
+ */
+ public void sessionIdle( IoSession session, IdleStatus status )
+ {
+ if( status == IdleStatus.READER_IDLE )
+ {
+ throw new StreamIoException(
+ new SocketTimeoutException( "Read timeout" ) );
+ }
+ }
+
+ private void beginService( IoSession session, PipedInputStream in )
+ {
+ if( session.getAttribute( KEY_STARTED ) == null )
+ {
+ session.setAttribute( KEY_STARTED, Boolean.TRUE );
+ processStreamIo( session, in, new ServiceOutputStream( session ) );
+ }
+ }
+
+ private static class PipedInputStream extends java.io.PipedInputStream
+ {
+ private IOException exception;
+
+ public PipedInputStream(PipedOutputStream src) throws IOException
+ {
+ super( src );
+ }
+
+ public void setException( IOException e )
+ {
+ this.exception = e;
+ }
+
+ public synchronized int read() throws IOException
+ {
+ throwException();
+ return super.read();
+ }
+
+ public synchronized int read( byte[] b, int off, int len ) throws IOException
+ {
+ throwException();
+ return super.read( b, off, len );
+ }
+
+ private void throwException() throws IOException
+ {
+ if( exception != null )
+ {
+ throw exception;
+ }
+ }
+ }
+
+ private static class ServiceOutputStream extends OutputStream
+ {
+ private final IoSession session;
+
+ public ServiceOutputStream( IoSession session )
+ {
+ this.session = session;
+ }
+
+ public void close()
+ {
+ session.close( true );
+ }
+
+ public void flush()
+ {
+ }
+
+ public void write( byte[] b, int off, int len )
+ {
+ ByteBuffer buf = ByteBuffer.wrap( b, off, len );
+ buf.acquire(); // prevent from being pooled.
+ session.write( buf, null );
+ }
+
+ public void write( byte[] b )
+ {
+ ByteBuffer buf = ByteBuffer.wrap( b );
+ buf.acquire(); // prevent from being pooled.
+ session.write( buf, null );
+ }
+
+ public void write( int b )
+ {
+ ByteBuffer buf = ByteBuffer.allocate( 1 );
+ buf.put( ( byte ) b );
+ buf.flip();
+ session.write( buf, null );
+ }
+ }
+
+ private static class StreamIoException extends RuntimeException
+ {
+ private static final long serialVersionUID = 3976736960742503222L;
+
+ public StreamIoException( IOException cause )
+ {
+ super(cause);
+ }
+ }
+}
Propchange: directory/network/trunk/src/java/org/apache/mina/io/handler/StreamIoHandler.java
------------------------------------------------------------------------------
svn:keywords = HeadURL Id LastChangedBy LastChangedDate LastChangedRevision
Added: directory/network/trunk/src/java/org/apache/mina/io/handler/package.html
URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/java/org/apache/mina/io/handler/package.html?rev=164404&view=auto
==============================================================================
--- directory/network/trunk/src/java/org/apache/mina/io/handler/package.html (added)
+++ directory/network/trunk/src/java/org/apache/mina/io/handler/package.html Sat Apr 23 10:43:26 2005
@@ -0,0 +1,8 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+</head>
+<body>
+Useful <code>IoHandler</code> implementations.
+</body>
+</html>
Propchange: directory/network/trunk/src/java/org/apache/mina/io/handler/package.html
------------------------------------------------------------------------------
svn:keywords = HeadURL Id LastChangedBy LastChangedDate LastChangedRevision
Modified: directory/network/trunk/src/java/org/apache/mina/protocol/AbstractProtocolHandlerFilterChain.java
URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/java/org/apache/mina/protocol/AbstractProtocolHandlerFilterChain.java?rev=164404&r1=164403&r2=164404&view=diff
==============================================================================
--- directory/network/trunk/src/java/org/apache/mina/protocol/AbstractProtocolHandlerFilterChain.java (original)
+++ directory/network/trunk/src/java/org/apache/mina/protocol/AbstractProtocolHandlerFilterChain.java Sat Apr 23 10:43:26 2005
@@ -1,3 +1,21 @@
+/*
+ * @(#) $Id$
+ *
+ * Copyright 2004 The Apache Software Foundation
+ *
+ * Licensed 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.mina.protocol;
import java.util.ArrayList;
@@ -10,6 +28,25 @@
import org.apache.mina.common.IdleStatus;
import org.apache.mina.protocol.ProtocolHandlerFilter.NextFilter;
+/**
+ * An abstract implementation of {@link ProtocolHandlerFilterChain} that provides
+ * common operations for developers to extend protocol layer.
+ * <p>
+ * All methods has been implemented. The list of filters is maintained
+ * as a doublely linked list. You can fire any MINA events which is filtered
+ * by this chain using these public methods:
+ * <ul>
+ * <li></li>
+ * </ul>
+ *
+ * The only method a developer should implement is {@link #doWrite(ProtocolSession, Object)}.
+ * This method is invoked when filter chain is evaluated for
+ * {@link ProtocolHandlerFilter#filterWrite(NextFilter, ProtocolSession, Object)} and
+ * finally to be written out.
+ *
+ * @author The Apache Directory Project
+ * @version $Rev$, $Date$
+ */
public abstract class AbstractProtocolHandlerFilterChain implements ProtocolHandlerFilterChain
{
private final ProtocolHandlerFilter HEAD_FILTER = new ProtocolHandlerFilter()
Modified: directory/network/trunk/xdocs/index.xml
URL: http://svn.apache.org/viewcvs/directory/network/trunk/xdocs/index.xml?rev=164404&r1=164403&r2=164404&view=diff
==============================================================================
--- directory/network/trunk/xdocs/index.xml (original)
+++ directory/network/trunk/xdocs/index.xml Sat Apr 23 10:43:26 2005
@@ -68,6 +68,11 @@
<td>Client</td>
</tr>
<tr>
+ <td><a target="classFrame" href="xref-examples/org/apache/mina/examples/httpserver/package-summary.html">HTTP server</a></td>
+ <td>Stream-based I/O support.</td>
+ <td>Server</td>
+ </tr>
+ <tr>
<td><a target="classFrame" href="xref-examples/org/apache/mina/examples/tennis/package-summary.html">Tennis</a></td>
<td>In-VM pipe support in protocol layer.</td>
<td>Both</td>