You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by co...@apache.org on 2002/02/06 18:43:08 UTC
cvs commit: jakarta-tomcat-connectors/jk/java/org/apache/jk/common ChannelJni.java ChannelSocket.java ChannelUn.java
costin 02/02/06 09:43:08
Modified: jk/java/org/apache/jk/common ChannelJni.java
ChannelSocket.java ChannelUn.java
Log:
Update for the api changes.
Added isSameAddress from Ajp12Interceptor - will be used with the secret for
the shutdown handler.
Few changes in jni - less code in static methods ( we'll eventually remove all,
but for now it's easier on the C side )
Revision Changes Path
1.4 +63 -47 jakarta-tomcat-connectors/jk/java/org/apache/jk/common/ChannelJni.java
Index: ChannelJni.java
===================================================================
RCS file: /home/cvs/jakarta-tomcat-connectors/jk/java/org/apache/jk/common/ChannelJni.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- ChannelJni.java 26 Jan 2002 07:24:37 -0000 1.3
+++ ChannelJni.java 6 Feb 2002 17:43:08 -0000 1.4
@@ -73,7 +73,7 @@
import org.apache.jk.apr.*;
-/** Pass messages using unix domain sockets.
+/** Pass messages using jni
*
* @author Costin Manolache
*/
@@ -88,20 +88,20 @@
public void init() throws IOException {
// static field init, temp
- wEnv=we;
+ wEnvStatic=wEnv;
}
- public int receive( Msg msg, Endpoint ep )
+ public int receive( Msg msg, MsgContext ep )
throws IOException
{
Msg sentResponse=(Msg)ep.getNote( receivedNote );
// same buffer is used, no need to copy
if( msg==sentResponse ) {
- d("Returned previously received message ");
+ if( dL > 0 ) d("Returned previously received message ");
return 0;
}
- d("XXX Copy previously received message ");
+ if( dL > 0 ) d("XXX Copy previously received message ");
// send will alter the msg and insert the response.
// copy...
// XXX TODO
@@ -113,14 +113,14 @@
* We could use 2 packets, or sendAndReceive().
*
*/
- public int send( Msg msg, Endpoint ep )
+ public int send( Msg msg, MsgContext ep )
throws IOException
{
byte buf[]=msg.getBuffer();
EpData epData=(EpData)ep.getNote( epDataNote );
// send and get the response
- d( "Sending packet ");
+ if( dL > 0 ) d( "Sending packet ");
msg.end();
// msg.dump("Outgoing: ");
@@ -128,43 +128,78 @@
epData.jkServiceP, buf, msg.getLen() );
ep.setNote( receivedNote, msg );
- d( "Sending packet - done ");
+ if( dL > 0 ) d( "Sending packet - done ");
return 0;
}
- /* ==================== ==================== */
-
- static WorkerEnv wEnv=null;
static int epDataNote=-1;
- static ChannelJni chJni=new ChannelJni();
- static class EpData {
- public long jkEnvP;
- public long jkEndpointP;
- public long jkServiceP;
- }
-
- public static Endpoint createEndpointStatic(long env, long epP) {
- Endpoint ep=new Endpoint();
+ public MsgContext createEndpoint(long env, long epP) {
+ MsgContext ep=new MsgContext();
if( epDataNote==-1)
epDataNote=wEnv.getNoteId(WorkerEnv.ENDPOINT_NOTE, "epData");
- d("createEndpointStatic() " + env + " " + epP);
+ if( dL > 0 ) d("createEndpointStatic() " + env + " " + epP);
+
EpData epData=new EpData();
epData.jkEnvP=env;
epData.jkEndpointP=epP;
ep.setNote( epDataNote, epData );
+ ep.setWorkerEnv( wEnv );
+
+ ep.setChannel( this );
return ep;
}
+ public int receive( long env, long rP, MsgContext ep,
+ MsgAjp msg)
+ {
+ try {
+ // first, we need to get an endpoint. It should be
+ // per/thread - and probably stored by the C side.
+ if( dL > 0 ) d("Received request " + rP);
+ // The endpoint will store the message pt.
+
+ msg.processHeader();
+ if( dL > 5 ) msg.dump("Incoming msg ");
+
+ EpData epData=(EpData)ep.getNote( epDataNote );
+
+ epData.jkServiceP=rP;
+
+ int status= this.invoke( msg, ep );
+
+ if(dL > 0 ) d("after processCallbacks " + status);
+
+ return status;
+ } catch( Exception ex ) {
+ ex.printStackTrace();
+ }
+ return 0;
+ }
+
+ /* ==================== ==================== */
+
+ static WorkerEnv wEnvStatic=null;
+ static ChannelJni chJni=new ChannelJni();
+
+ static class EpData {
+ public long jkEnvP;
+ public long jkEndpointP;
+ public long jkServiceP;
+ }
+
+ public static MsgContext createEndpointStatic(long env, long epP) {
+ return chJni.createEndpoint( env, epP );
+ }
+
public static MsgAjp createMessage() {
- System.out.println("XXX CreateMessage");
return new MsgAjp();
}
public static byte[] getBuffer(MsgAjp msg) {
- System.out.println("XXX getBuffer " + msg.getBuffer() + " "
- + msg.getBuffer().length);
+ //if( dL > 0 ) d("XXX getBuffer " + msg.getBuffer() + " "
+ // + msg.getBuffer().length);
return msg.getBuffer();
}
@@ -187,31 +222,12 @@
* the conversion done in java ( after we know the encoding and
* if anyone asks for it - same lazy behavior as in 3.3 ).
*/
- public static int receiveRequest( long env, long rP, Endpoint ep,
+ public static int receiveRequest( long env, long rP, MsgContext ep,
MsgAjp msg)
{
- try {
- // first, we need to get an endpoint. It should be
- // per/thread - and probably stored by the C side.
- d("Received request " + rP);
- // The endpoint will store the message pt.
- msg.processHeader();
- // msg.dump("Incoming msg ");
-
- EpData epData=(EpData)ep.getNote( epDataNote );
-
- epData.jkServiceP=rP;
-
- int status=wEnv.processCallbacks( chJni, ep, msg );
-
- d("after processCallbacks ");
-
- } catch( Exception ex ) {
- ex.printStackTrace();
- }
- return 0;
+ return chJni.receive(env, rP, ep, msg );
}
-
+
/** Send the packet to the C side. On return it contains the response
* or indication there is no response. Asymetrical because we can't
* do things like continuations.
@@ -219,7 +235,7 @@
public static native int sendPacket(long env, long e, long s,
byte data[], int len);
- private static final int dL=10;
+ private static final int dL=0;
private static void d(String s ) {
System.err.println( "ChannelJni: " + s );
}
1.4 +70 -16 jakarta-tomcat-connectors/jk/java/org/apache/jk/common/ChannelSocket.java
Index: ChannelSocket.java
===================================================================
RCS file: /home/cvs/jakarta-tomcat-connectors/jk/java/org/apache/jk/common/ChannelSocket.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- ChannelSocket.java 26 Jan 2002 07:25:09 -0000 1.3
+++ ChannelSocket.java 6 Feb 2002 17:43:08 -0000 1.4
@@ -86,7 +86,7 @@
* Various container adapters should load this object ( as a bean ),
* set configurations and use it. Note that the connector will handle
* all incoming protocols - it's not specific to ajp1x. The protocol
- * is abstracted by Endpoint/Message/Channel.
+ * is abstracted by MsgContext/Message/Channel.
*/
@@ -119,6 +119,14 @@
this.inet=inet;
}
+ public void setAddress(String inet) {
+ try {
+ this.inet= InetAddress.getByName( inet );
+ } catch( Exception ex ) {
+ ex.printStackTrace();
+ }
+ }
+
/**
* Sets the timeout in ms of the server sockets created by this
* server. This method allows the developer to make servers
@@ -149,13 +157,15 @@
int isNote=2;
int osNote=3;
- public void accept( Endpoint ep ) throws IOException {
+ public void accept( MsgContext ep ) throws IOException {
Socket s=sSocket.accept();
ep.setNote( socketNote, s );
if(dL>0 )
d("Accepted socket " + s );
if( linger > 0 )
s.setSoLinger( true, linger);
+ if( socketTimeout > 0 )
+ s.setSoTimeout( socketTimeout );
InputStream is=new BufferedInputStream(s.getInputStream());
OutputStream os= s.getOutputStream();
@@ -174,11 +184,11 @@
tp.runIt( acceptAjp);
}
- public void open(Endpoint ep) throws IOException {
+ public void open(MsgContext ep) throws IOException {
}
- public void close(Endpoint ep) throws IOException {
+ public void close(MsgContext ep) throws IOException {
Socket s=(Socket)ep.getNote( socketNote );
s.close();
}
@@ -204,7 +214,7 @@
}
}
- public int send( Msg msg, Endpoint ep)
+ public int send( Msg msg, MsgContext ep)
throws IOException
{
msg.end(); // Write the packet header
@@ -219,7 +229,7 @@
return len;
}
- public int receive( Msg msg, Endpoint ep )
+ public int receive( Msg msg, MsgContext ep )
throws IOException
{
if (dL > 0) {
@@ -289,7 +299,7 @@
* case it is left unspecified whether the file position (if any) changes.
*
**/
- public int read( Endpoint ep, byte[] b, int offset, int len)
+ public int read( MsgContext ep, byte[] b, int offset, int len)
throws IOException
{
InputStream is=(InputStream)ep.getNote( isNote );
@@ -320,8 +330,11 @@
return pos;
}
- public Endpoint createEndpoint() {
- return new Endpoint();
+ public MsgContext createEndpoint() {
+ MsgContext mc=new MsgContext();
+ mc.setChannel(this);
+ mc.setWorkerEnv( wEnv );
+ return mc;
}
boolean running=true;
@@ -333,7 +346,7 @@
d("Accepting ajp connections on " + port);
while( running ) {
try {
- Endpoint ep=this.createEndpoint();
+ MsgContext ep=this.createEndpoint();
this.accept(ep);
SocketConnection ajpConn=
new SocketConnection(this, ep);
@@ -346,15 +359,15 @@
/** Process a single ajp connection.
*/
- void processConnection(Endpoint ep) {
+ void processConnection(MsgContext ep) {
if( dL > 0 )
d( "New ajp connection ");
try {
MsgAjp recv=new MsgAjp();
while( running ) {
this.receive( recv, ep );
- int status=we.processCallbacks( this, ep, recv );
- if( status!= Handler.OK ) {
+ int status= this.invoke( recv, ep );
+ if( status!= JkHandler.OK ) {
d("processCallbacks status " + status );
break;
}
@@ -364,8 +377,49 @@
ex.printStackTrace();
}
}
+
+ public boolean isSameAddress(MsgContext ep) {
+ Socket s=(Socket)ep.getNote( socketNote );
+ return isSameAddress( s.getLocalAddress(), s.getInetAddress());
+ }
+
+
+ /**
+ * Return <code>true</code> if the specified client and server addresses
+ * are the same. This method works around a bug in the IBM 1.1.8 JVM on
+ * Linux, where the address bytes are returned reversed in some
+ * circumstances.
+ *
+ * @param server The server's InetAddress
+ * @param client The client's InetAddress
+ */
+ public static boolean isSameAddress(InetAddress server, InetAddress client)
+ {
+ // Compare the byte array versions of the two addresses
+ byte serverAddr[] = server.getAddress();
+ byte clientAddr[] = client.getAddress();
+ if (serverAddr.length != clientAddr.length)
+ return (false);
+ boolean match = true;
+ for (int i = 0; i < serverAddr.length; i++) {
+ if (serverAddr[i] != clientAddr[i]) {
+ match = false;
+ break;
+ }
+ }
+ if (match)
+ return (true);
+
+ // Compare the reversed form of the two addresses
+ for (int i = 0; i < serverAddr.length; i++) {
+ if (serverAddr[i] != clientAddr[(serverAddr.length-1)-i])
+ return (false);
+ }
+ return (true);
+ }
+
- private static final int dL=10;
+ private static final int dL=0;
private static void d(String s ) {
System.err.println( "ChannelSocket: " + s );
}
@@ -390,9 +444,9 @@
class SocketConnection implements ThreadPoolRunnable {
ChannelSocket wajp;
- Endpoint ep;
+ MsgContext ep;
- SocketConnection(ChannelSocket wajp, Endpoint ep) {
+ SocketConnection(ChannelSocket wajp, MsgContext ep) {
this.wajp=wajp;
this.ep=ep;
}
1.6 +16 -13 jakarta-tomcat-connectors/jk/java/org/apache/jk/common/ChannelUn.java
Index: ChannelUn.java
===================================================================
RCS file: /home/cvs/jakarta-tomcat-connectors/jk/java/org/apache/jk/common/ChannelUn.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- ChannelUn.java 26 Jan 2002 07:25:09 -0000 1.5
+++ ChannelUn.java 6 Feb 2002 17:43:08 -0000 1.6
@@ -108,7 +108,7 @@
AprImpl apr;
long gPool;
- public void accept( Endpoint ep ) throws IOException {
+ public void accept( MsgContext ep ) throws IOException {
long l= apr.unAccept(gPool, unixListenSocket);
/* We could create a real java.net.Socket, or a UnixSocket, etc
*/
@@ -145,11 +145,11 @@
tp.runIt( acceptAjp);
}
- public void open(Endpoint ep) throws IOException {
+ public void open(MsgContext ep) throws IOException {
}
- public void close(Endpoint ep) throws IOException {
+ public void close(MsgContext ep) throws IOException {
Long s=(Long)ep.getNote( socketNote );
apr.unSocketClose(gPool, s.longValue(),3);
}
@@ -163,7 +163,7 @@
e.printStackTrace();
}
}
- public int send( Msg msg, Endpoint ep)
+ public int send( Msg msg, MsgContext ep)
throws IOException
{
msg.end(); // Write the packet header
@@ -179,7 +179,7 @@
return len;
}
- public int receive( Msg msg, Endpoint ep )
+ public int receive( Msg msg, MsgContext ep )
throws IOException
{
if (dL > 0) {
@@ -249,7 +249,7 @@
* case it is left unspecified whether the file position (if any) changes.
*
**/
- public int read( Endpoint ep, byte[] b, int offset, int len) throws IOException {
+ public int read( MsgContext ep, byte[] b, int offset, int len) throws IOException {
Long s=(Long)ep.getNote( socketNote );
int pos = 0;
int got;
@@ -274,8 +274,11 @@
- public Endpoint createEndpoint() {
- return new Endpoint();
+ public MsgContext createEndpoint() {
+ MsgContext mc=new MsgContext();
+ mc.setChannel( this );
+ mc.setWorkerEnv( wEnv );
+ return mc;
}
boolean running=true;
@@ -287,7 +290,7 @@
d("Accepting ajp connections on " + file);
while( running ) {
try {
- Endpoint ep=this.createEndpoint();
+ MsgContext ep=this.createEndpoint();
this.accept(ep);
AprConnection ajpConn=
new AprConnection(this, ep);
@@ -300,7 +303,7 @@
/** Process a single ajp connection.
*/
- void processConnection(Endpoint ep) {
+ void processConnection(MsgContext ep) {
if( dL > 0 )
d( "New ajp connection ");
try {
@@ -311,7 +314,7 @@
// EOS
break;
}
- int status=we.processCallbacks( this, ep, recv );
+ int status=this.invoke( recv, ep );
}
this.close( ep );
} catch( Exception ex ) {
@@ -344,9 +347,9 @@
class AprConnection implements ThreadPoolRunnable {
ChannelUn wajp;
- Endpoint ep;
+ MsgContext ep;
- AprConnection(ChannelUn wajp, Endpoint ep) {
+ AprConnection(ChannelUn wajp, MsgContext ep) {
this.wajp=wajp;
this.ep=ep;
}
--
To unsubscribe, e-mail: <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>