📄 webclient.java
字号:
public void addWindowListener( WebWindowListener listener ) { synchronized (_windowListeners) { if (listener != null && !_windowListeners.contains( listener )) _windowListeners.add( listener ); } } /** * Removes a listener to watch for window openings and closings. */ public void removeWindowListener( WebWindowListener listener ) { synchronized (_windowListeners) { _windowListeners.remove( listener ); } } /** * Returns the next javascript alert without removing it from the queue. */ public String getNextAlert() { return _alerts.isEmpty() ? null : (String) _alerts.getFirst(); } /** * Returns the next javascript alert and removes it from the queue. If the queue is empty, * will return an empty string. */ public String popNextAlert() { if (_alerts.isEmpty()) return ""; return (String) _alerts.removeFirst(); } /** * Specifies the object which will respond to all dialogs. **/ public void setDialogResponder( DialogResponder responder ) { _dialogResponder = responder; }//------------------------------------------ protected members ----------------------------------- protected WebClient() { _openWindows.add( _mainWindow ); } /** * Creates a web response object which represents the response to the specified web request. * @param request the request to which the response should be generated * @param targetFrame the frame in which the response should be stored **/ abstract protected WebResponse newResponse( WebRequest request, FrameSelector targetFrame ) throws MalformedURLException, IOException; /** * Writes the message body for the request. **/ final protected void writeMessageBody( WebRequest request, OutputStream stream ) throws IOException { request.writeMessageBody( stream ); } /** * Returns the value of all current header fields. **/ protected Dictionary getHeaderFields( URL targetURL ) { Hashtable result = (Hashtable) _headers.clone(); result.put( "User-Agent", getClientProperties().getUserAgent() ); if (getClientProperties().isAcceptGzip()) result.put( "Accept-Encoding", "gzip" ); AddHeaderIfNotNull( result, "Cookie", _cookieJar.getCookieHeaderField( targetURL ) ); AddHeaderIfNotNull( result, "Authorization", _authorizationString ); AddHeaderIfNotNull( result, "Proxy-Authorization", _proxyAuthorizationString ); return result; } private void AddHeaderIfNotNull( Hashtable result, final String headerName, final String headerValue ) { if (headerValue != null) result.put( headerName, headerValue ); } /** * Updates this web client based on a received response. This includes updating * cookies and frames. This method is required by ServletUnit, which cannot call the updateWindow method directly. **/ final protected void updateMainWindow( FrameSelector frame, WebResponse response ) throws MalformedURLException, IOException, SAXException { getMainWindow().updateWindow( frame.getName(), response, new RequestContext() ); }//------------------------------------------------- package members ---------------------------------------------------- void tellListeners( WebRequest request ) { List listeners; synchronized (_clientListeners) { listeners = new ArrayList( _clientListeners ); } for (Iterator i = listeners.iterator(); i.hasNext();) { ((WebClientListener) i.next()).requestSent( this, request ); } } void tellListeners( WebResponse response ) { List listeners; synchronized (_clientListeners) { listeners = new ArrayList( _clientListeners ); } for (Iterator i = listeners.iterator(); i.hasNext();) { ((WebClientListener) i.next()).responseReceived( this, response ); } } void updateClient( WebResponse response ) throws IOException { if (getClientProperties().isAcceptCookies()) _cookieJar.updateCookies( response.getCookieJar() ); validateHeaders( response ); } CookieJar getCookieJar() { return _cookieJar; } void updateFrameContents( WebWindow requestWindow, String requestTarget, WebResponse response, RequestContext requestContext ) throws IOException, SAXException { if (response.getFrame() == FrameSelector.NEW_FRAME) { WebWindow window = new WebWindow( this, requestWindow.getCurrentPage() ); if (!WebRequest.NEW_WINDOW.equalsIgnoreCase( requestTarget )) window.setName( requestTarget ); response.setFrame( window.getTopFrame() ); window.updateFrameContents( response, requestContext ); _openWindows.add( window ); reportWindowOpened( window ); } else if (response.getFrame().getWindow() != null && response.getFrame().getWindow() != requestWindow) { response.getFrame().getWindow().updateFrameContents( response, requestContext ); } else { if (response.getFrame() == FrameSelector.TOP_FRAME) response.setFrame( requestWindow.getTopFrame() ); requestWindow.updateFrameContents( response, requestContext ); } } void close( WebWindow window ) { if (!_openWindows.contains( window )) throw new IllegalStateException( "Window is already closed" ); _openWindows.remove( window ); if (_openWindows.isEmpty()) _openWindows.add( new WebWindow( this ) ); if (window.equals( _mainWindow )) _mainWindow = (WebWindow) _openWindows.get(0); reportWindowClosed( window ); } private void reportWindowOpened( WebWindow window ) { List listeners; synchronized (_windowListeners) { listeners = new ArrayList( _windowListeners ); } for (Iterator i = listeners.iterator(); i.hasNext();) { ((WebWindowListener) i.next()).windowOpened( this, window ); } } private void reportWindowClosed( WebWindow window ) { List listeners; synchronized (_windowListeners) { listeners = new ArrayList( _windowListeners ); } for (Iterator i = listeners.iterator(); i.hasNext();) { ((WebWindowListener) i.next()).windowClosed( this, window ); } }//------------------------------------------ package members ------------------------------------ boolean getConfirmationResponse( String message ) { return _dialogResponder.getConfirmation( message ); } String getUserResponse( String message, String defaultResponse ) { return _dialogResponder.getUserResponse( message, defaultResponse ); } void postAlert( String message ) { _alerts.addLast( message ); }//------------------------------------------ private members ------------------------------------- /** The list of alerts generated by JavaScript. **/ private LinkedList _alerts = new LinkedList(); /** The currently defined cookies. **/ private CookieJar _cookieJar = new CookieJar(); /** A map of header names to values. **/ private HeaderDictionary _headers = new HeaderDictionary(); private boolean _exceptionsThrownOnErrorStatus = HttpUnitOptions.getExceptionsThrownOnErrorStatus(); private List _clientListeners = new ArrayList(); private List _windowListeners = new ArrayList(); private DialogResponder _dialogResponder = new DialogAdapter(); private ClientProperties _clientProperties = ClientProperties.getDefaultProperties().cloneProperties(); /** * Examines the headers in the response and throws an exception if appropriate. **/ private void validateHeaders( WebResponse response ) throws HttpException { if (!getExceptionsThrownOnErrorStatus()) return; if (response.getHeaderField( "WWW-Authenticate" ) != null) { throw new AuthorizationRequiredException( response.getHeaderField( "WWW-Authenticate" ) ); } else if (response.getResponseCode() == HttpURLConnection.HTTP_INTERNAL_ERROR) { throw new HttpInternalErrorException( response.getURL() ); } else if (response.getResponseCode() == HttpURLConnection.HTTP_NOT_FOUND) { throw new HttpNotFoundException( response.getResponseMessage(), response.getURL() ); } else if (response.getResponseCode() >= HttpURLConnection.HTTP_BAD_REQUEST) { throw new HttpException( response.getResponseCode(), response.getResponseMessage(), response.getURL() ); } } FrameSelector findFrame( String target ) { for (int i = 0; i < _openWindows.size(); i++) { WebWindow webWindow = (WebWindow) _openWindows.get( i ); FrameSelector frame = webWindow.getFrame( target ); if (frame != null) return frame; } return null; }//================================================================================================== static public class HeaderDictionary extends Hashtable { public void addEntries( Dictionary source ) { for (Enumeration e = source.keys(); e.hasMoreElements(); ) { Object key = e.nextElement(); put( key, source.get( key ) ); } } public boolean containsKey( Object key ) { return super.containsKey( matchPreviousFieldName( key.toString() ) ); } public Object get( Object fieldName ) { return (String) super.get( matchPreviousFieldName( fieldName.toString() ) ); } public Object put( Object fieldName, Object fieldValue ) { fieldName = matchPreviousFieldName( fieldName.toString() ); Object oldValue = super.get( fieldName ); if (fieldValue == null) { remove( fieldName ); } else { super.put( fieldName, fieldValue ); } return oldValue; } /** * If a matching field name with different case is already known, returns the older name. * Otherwise, returns the specified name. **/ private String matchPreviousFieldName( String fieldName ) { for (Enumeration e = keys(); e.hasMoreElements(); ) { String key = (String) e.nextElement(); if (key.equalsIgnoreCase( fieldName )) return key; } return fieldName; } }}//==================================================================================================class RedirectWebRequest extends WebRequest { RedirectWebRequest( WebResponse response ) throws MalformedURLException { super( response.getURL(), response.getHeaderField( "Location" ), response.getFrame(), response.getFrameName() ); if (response.getReferer() != null) setHeaderField( "Referer", response.getReferer() ); } /** * Returns the HTTP method defined for this request. **/ public String getMethod() { return "GET"; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -