{
public void run()
{
final Mozilla mozilla = Mozilla.getInstance();
nsIServiceManager serviceManager = mozilla.getServiceManager();
nsIObserverService observerService = ( nsIObserverService )serviceManager.getServiceByContractID(
"@mozilla.org/observer-service;1", nsIObserverService.NS_IOBSERVERSERVICE_IID );
final nsIBinaryInputStream in = XPCOMManager.getInstance().newComponent( "@mozilla.org/binaryinputstream;1",
nsIBinaryInputStream.class );
nsIObserver httpObserver = new nsIObserver()
{
public void observe( nsISupports subject, String sTopic, String sData )
{
try
{
if( EVENT_HTTP_ON_MODIFY_REQUEST.equals( sTopic ) )
{
nsIHttpChannel httpChannel = ( nsIHttpChannel )subject
.queryInterface( nsIHttpChannel.NS_IHTTPCHANNEL_IID );
if( httpChannel.getNotificationCallbacks() == null )
return;
nsIInterfaceRequestor interfaceRequestor = ( nsIInterfaceRequestor )httpChannel
.getNotificationCallbacks()
.queryInterface( nsIInterfaceRequestor.NS_IINTERFACEREQUESTOR_IID );
nsIDOMWindow window = ( nsIDOMWindow )interfaceRequestor
.getInterface( nsIDOMWindow.NS_IDOMWINDOW_IID );
BrowserComponent browserComponent = browserMap.get( window );
if( browserComponent != null && browserRecordingMap.containsKey( browserComponent ) )
{
RecordedRequest rr = new RecordedRequest( dumpUri( httpChannel.getURI() ),
httpChannel.getRequestMethod() );
nsIUploadChannel upload = ( nsIUploadChannel )httpChannel
.queryInterface( nsIUploadChannel.NS_IUPLOADCHANNEL_IID );
byte[] requestData = null;
if( upload != null )
{
nsIInputStream uploadStream = upload.getUploadStream();
if( uploadStream != null && uploadStream.available() > 0 )
{
nsISeekableStream seekable = ( nsISeekableStream )uploadStream
.queryInterface( nsISeekableStream.NS_ISEEKABLESTREAM_IID );
long pos = seekable.tell();
long available = uploadStream.available();
if( available > 0 )
{
try
{
synchronized( mozilla )
{
in.setInputStream( uploadStream );
requestData = in.readByteArray( available );
String requestBody = getRequestBody( requestData );
if( requestBody != null && requestBody.length() > 0 )
{
rr.setContent( requestBody );
String contentType = getContentType( requestData );
if( StringUtils.hasContent( contentType ) )
rr.setContentType( contentType );
}
}
}
catch( Throwable e )
{
e.printStackTrace();
}
finally
{
seekable.seek( nsISeekableStream.NS_SEEK_SET, pos );
}
}
}
}
final StringToStringsMap headersMap = new StringToStringsMap();
httpChannel.visitRequestHeaders( new nsIHttpHeaderVisitor()
{
public void visitHeader( String header, String value )
{
if( !isHeaderExcluded( header ) )
{
headersMap.put( header, value );
}
}
public nsISupports queryInterface( String sIID )
{
return Mozilla.queryInterface( this, sIID );
}
} );
rr.setHeaders( headersMap );
browserRecordingMap.get( browserComponent ).put( rr.getUrl(), rr );
}
}
else
{
System.out.println( "HTTPObserver: Unknown event '" + sTopic + "'" );
}
}
catch( Throwable e )
{
// ignore errors related to the querying of unsupported
// interfaces
if( e.getMessage().indexOf( "0x80004002" ) == -1 )
SoapUI.logError( e );
}
}
public nsISupports queryInterface( String sIID )
{
return Mozilla.queryInterface( this, sIID );
}
};
boolean blnObserverIsWeakReference = false;
observerService.addObserver( httpObserver, EVENT_HTTP_ON_MODIFY_REQUEST, blnObserverIsWeakReference );
}