// //
* $Id$
*
* Copyright 1998 Integrated Computer Solutions, Inc. All Rights Reserved
*
* This source code is protected by copyright law and international treaties.
* Unauthorized reproduction or distribution of this source code module or any
* portion of it, may result in severe civil and criminal penalties, and will
* be prosecuted to the maximum extent possible under law.
*/
import com.ics.lib.*;
import com.ics.util.*;
import java.io.PrintWriter;
import java.io.*;
import java.net.*;
import java.util.Hashtable;
import java.util.Vector;
import com.ibm.xml.parser.*;
import org.w3c.dom.*;
/**
* The Request class is the meat of the thing
*/
public class Request extends HTTPRequestI
{
/** The parsed request as an XML DOM document */
public TXDocument contents;
/** The reader to get stuff from the socket */
HTTPInputStream socketReader = null;
/** The XML parser instance reading the request */
Parser xmlparser = null;
/** Source stream into xml parser */
Source xmlsource = null;
/** The socket which we are connected to */
Socket socket;
/** Create a Request
* @param _server what PUPserver I belong to
* @param _pool what RequestPool I belong to
* @param _socket my connection to the ultimate client
*/
Request(Socket _socket)
{
super(_socket);
socket = _socket;
}
/**
* Read a request from the client input stream
*/
public boolean readRequestFromSocket()
throws IOException
{
socketReader = new HTTPInputStream(socket.getInputStream());
// This routine reads the HTTP header up through the
// blank line and load various members of the superclass
// HTTPRequestI.
HTTPUtil.readHTTPRequest(this, socketReader);
return true;
}
/** Fullfill a request */
void process()
{
try {
readRequestFromSocket();
// Execute operation from the message
if(readXMLdoc() < 0) {
errorCode = 666;
return -1;
}
// Print the DOM tree for debugging
DOMHelpers.dumpDoc(contents);
} catch(IOException ioe) {
LogManager.danger(Constants.REQUEST, ioe);
try {
if(socket != null) socket.close();
} catch(IOException ioe2) {
}
} finally {
socket = null;
}
}
/** Load up a configuration file containing parameters
*/
public int readXMLdoc()
{
//*** The confTree is the root of the DOM Tree. It is of type
//*** Document which implements the DOM Document interface.
xmlparser = new Parser(null,
new RequestErrorListener(),
new RequestStreamProducer());
xmlparser.setKeepComment(false);
// I do not use a DTD, this prevents DTD checks
xmlparser.setElementFactory(new TXDocument() {
public boolean isCheckValidity() {
return false;
}
});
xmlparser.setTagHandler(new PUPTagHandler()); // PUPTagHandler
// System.out.println("Start xml parse");
contents = xmlparser.readStream(socketReader);
xmlparser = null; // discard, it cannot be reused
return 0;
}
class RequestErrorListener implements ErrorListener
{
public int error(String fileName, int lineNo, int charOffset,
Object key, String msg) {
StringBuffer x = new StringBuffer("Parse error at line:");
x.append(lineNo);
x.append(", col:");
x.append(charOffset);
x.append(" = ");
x.append(msg);
LogManager.warning(Constants.REQUEST, x.toString());
return 0;
}
}
/** The RequestStreamProducer is an artifact needed by the XML
* parser.
*/
class RequestStreamProducer implements StreamProducer
{
/** This is never called by the XML4J package */
public Source getInputStream(String name, String pID, String sysID)
{
System.out.println("RSP.getInputStream called");
xmlsource = new Source(socketReader);
return xmlsource;
}
/** Yet, this is called. Sounds like a bug to me */
public void closeInputStream(Source s)
{
// System.out.println("RSP.closeInputSteam called");
}
public void loadCatalog(Reader r)
{
// System.out.println("RSP.loadCatalog called");
}
}
//
//
//
class PUPTagHandler implements TagHandler
{
public void handleStartTag(TXElement tag, boolean isEmpty) {
// System.out.println("I got the " + tag.getTagName() + " start");
}
//
public void handleEndTag(TXElement tag, boolean isEmpty) {
// System.out.println("I got the " + tag.getTagName() + " end");
if("BODY".equals(tag.getTagName())) {
System.out.println("Body text="+tag.getText());
}
if("PUP".equals(tag.getTagName())) {
// System.out.println("Got FINAL PUP TAG - DONE");
/** Both of these sound like they should work,
* from reading the docs, but they don't seem to
* do it. The HTTPInputStream.signalEOF call
* simulates an EOF on the next read, so that the
* parser returns.
*/
// xmlparser.closeInputStream(xmlsource);
// xmlparser.stop();
socketReader.signalEOF();
}
}
}
}
//