alvinalexander.com | career | drupal | java | mac | mysql | perl | scala | uml | unix  

What this is

This file is included in the DevDaily.com "Java Source Code Warehouse" project. The intent of this project is to help you "Learn Java by Example" TM.

Other links

The source code

/*
 *  Copyright 1999-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.coyote.tomcat3;

import java.util.Enumeration;
import java.util.Hashtable;

import org.apache.coyote.ActionCode;
import org.apache.coyote.ProtocolHandler;
import org.apache.tomcat.core.BaseInterceptor;
import org.apache.tomcat.core.Context;
import org.apache.tomcat.core.ContextManager;
import org.apache.tomcat.core.TomcatException;
import org.apache.tomcat.util.IntrospectionUtils;
import org.apache.tomcat.util.net.SSLSupport;

/** Standalone http.
 *
 *  Connector properties:
 *  
    *
  • secure - will load a SSL socket factory and act as https server
  • *
* * Properties passed to the net layer: *
    *
  • timeout
  • *
  • backlog
  • *
  • address
  • *
  • port
  • *
* Thread pool properties: *
    *
  • minSpareThreads
  • *
  • maxSpareThreads
  • *
  • maxThreads
  • *
  • poolOn
  • *
* Properties for HTTPS: *
    *
  • keystore - certificates - default to ~/.keystore
  • *
  • keypass - password
  • *
  • clientauth - true if the server should authenticate the client using certs
  • *
* Properties for HTTP: *
    *
  • reportedname - name of server sent back to browser (security purposes)
  • *
*
    *
  • compression - use gzip compression in HTTP 1.1 (on/off) - def off
  • *
*
    *
  • compressionMinSize - minimum size content to use gzip compression in HTTP 1.1 - def 2048
  • *
*
    *
  • noCompressionUserAgents - comma separated list of userAgents who didn't support gzip
  • *
*
    *
  • restrictedUserAgents - comma separated list of userAgents who didn't support HTTP 1.1 (use HTTP 1.0)
  • *
*
    *
  • compressableMimeTypes - comma separated list of mime types supported for compression - def text/html,text/xml,text/plain
  • *
*/ public class CoyoteInterceptor2 extends BaseInterceptor { private String processorClassName="org.apache.coyote.http11.Http11Protocol"; Tomcat3Adapter adapter; ProtocolHandler proto; int protocolNote; public CoyoteInterceptor2() { super(); // defaults: this.setAttribute( "port", "8080" ); this.setAttribute( "soLinger", "-1" ); } // -------------------- PoolTcpConnector -------------------- /** Set the class of the processor to use. */ public void setProcessorClassName(String pcn) { processorClassName = pcn; } // -------------------- Start/stop -------------------- Hashtable attributes=new Hashtable(); public void setAttribute( String prop, Object value) { attributes.put( prop, value ); } public void setProperty( String prop, String value ) { setAttribute( prop, value ); } /** Called when the ContextManger is started */ public void engineInit(ContextManager cm) throws TomcatException { super.engineInit( cm ); protocolNote = cm.getNoteId(ContextManager.MODULE_NOTE, "coyote.protocol"); adapter=new Tomcat3Adapter(cm); try { Class c=Class.forName(processorClassName); proto=(ProtocolHandler)c.newInstance(); setNote(protocolNote, proto); } catch( Exception ex ) { ex.printStackTrace(); } this.setAttribute("jkHome", cm.getHome()); proto.setAdapter( adapter ); try { Enumeration keys=attributes.keys(); while( keys.hasMoreElements() ) { String k=(String)keys.nextElement(); Object o=attributes.get(k); if( o instanceof String ) IntrospectionUtils.setProperty( proto, k, (String)o ); else IntrospectionUtils.setAttribute( proto, k, o ); } proto.init(); } catch( Exception ex ) { throw new TomcatException( "Error setting protocol properties ", ex ); } } /** Called when the ContextManger is started */ public void engineStart(ContextManager cm) throws TomcatException { try { proto.start(); } catch( Exception ex ) { ex.printStackTrace(); throw new TomcatException( ex ); } } public void engineShutdown(ContextManager cm) throws TomcatException { try { proto.destroy(); } catch( Exception ex ) { throw new TomcatException( ex ); } } // -------------------- Handler implementation -------------------- /** Handle HTTP expectations. */ public int preService(org.apache.tomcat.core.Request request, org.apache.tomcat.core.Response response) { if(response instanceof Tomcat3Response) { try { ((Tomcat3Response)response).sendAcknowledgement(); } catch(Exception ex) { log("Can't send ACK", ex); } } return 0; } public int postRequest(org.apache.tomcat.core.Request request, org.apache.tomcat.core.Response response) { if(request instanceof Tomcat3Request) { try { Tomcat3Request httpReq=(Tomcat3Request)request; org.apache.coyote.Request cReq = httpReq.getCoyoteRequest(); cReq.action( ActionCode.ACTION_POST_REQUEST , null); } catch(Exception ex) { log("Can't send ACK", ex); } } return 0; } /** getInfo calls for SSL data @return the requested data */ public Object getInfo( Context ctx, org.apache.tomcat.core.Request request, int id, String key ) { if( ! ( request instanceof Tomcat3Request ) ) return null; Tomcat3Request httpReq=(Tomcat3Request)request; if(key!=null && httpReq!=null ){ org.apache.coyote.Request cReq = httpReq.getCoyoteRequest(); Object info = cReq.getAttribute(key); if( info != null) return info; // XXX Should use MsgContext, pass the attribute we need. // This will extract both if(isSSLAttribute(key)) { cReq.action(ActionCode.ACTION_REQ_SSL_ATTRIBUTE, httpReq.getCoyoteRequest() ); // Only allowed a single cert under the 2.2 Spec. Object [] value = (Object []) cReq.getAttribute(SSLSupport.CERTIFICATE_KEY); if( value != null ) { cReq.setAttribute(SSLSupport.CERTIFICATE_KEY, value[0]); } return cReq.getAttribute(key); } return cReq.getAttribute( key ); } return super.getInfo(ctx,request,id,key); } public int setInfo( Context ctx, org.apache.tomcat.core.Request request, int id, String key, String object ) { if( ! ( request instanceof Tomcat3Request ) ) return DECLINED; Tomcat3Request httpReq=(Tomcat3Request)request; if(key!=null && httpReq!=null ){ org.apache.coyote.Request cReq = httpReq.getCoyoteRequest(); cReq.setAttribute(key, object); return OK; } return super.setInfo(ctx, request, id, key, object); } /** * Check if a string is a reserved SSL attribute key. */ public static boolean isSSLAttribute(String key) { return SSLSupport.CIPHER_SUITE_KEY.equals(key) || SSLSupport.KEY_SIZE_KEY.equals(key) || SSLSupport.CERTIFICATE_KEY.equals(key) || SSLSupport.SESSION_ID_KEY.equals(key); } }
... this post is sponsored by my books ...

#1 New Release!

FP Best Seller

 

new blog posts

 

Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.

A percentage of advertising revenue from
pages under the /java/jwarehouse URI on this website is
paid back to open source projects.