Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * ====================================================================
   * Copyright (c) 2004-2006 TMate Software Ltd.  All rights reserved.
   *
   * This software is licensed as described in the file COPYING, which
   * you should have received as part of this distribution.  The terms
   * are also available at http://svnkit.com/license.html
   * If newer versions of this license are posted there, you may use a
   * newer version instead, at your option.
  * ====================================================================
  */
 package org.tmatesoft.svn.core.internal.io.dav.http;
 
 

Author(s):
TMate Software Ltd.
Version:
1.1.0
 
 class HTTPRequest {
 
     public static final char[] CRLF = { '\r''\n' };
 
     private boolean myIsSecured;
     private boolean myIsProxied;
     private HTTPConnection myConnection;
 
     private String myAuthentication;
     private String myProxyAuthentication;
 
     private HTTPHeader myResponseHeader;
     private HTTPStatus myStatus;
 
     private SVNErrorMessage myErrorMessage;
     private DefaultHandler myResponseHandler;
     private OutputStream myResponseStream;
 
     private byte[] myRequestBody;
     private InputStream myRequestStream;
 
     private boolean myIsProxyAuthForced;
 
     private boolean myIsKeepAlive;
 
     public HTTPRequest() {
     }
     
     public void reset() {
         if ( != null) {
             try {
                 .reset();
             } catch (IOException e) {
             }
         }
          = null;
          = null;
          = null;
          = null;
          = null;
     }
     
     public void setProxied(boolean proxied) {
          = proxied;
     }
     
     public void setSecured(boolean secured) {
          = secured;
     }
     
     public void setConnection(HTTPConnection connection) {
          = connection;
     }
     
     public void setAuthentication(String auth) {
          = auth;
     }
 
     public void setProxyAuthentication(String auth) {
          = auth;
     }
     
     public void setForceProxyAuth(boolean force) {
          = force;
     }
     
     public void setResponseHandler(DefaultHandler handler) {
          = handler;
    }
    
    public void setResponseStream(OutputStream os) {
         = os;
    }
    
    public void setRequestBody(byte[] body) {
         = body;
    }
    
    public void setRequestBody(StringBuffer sb) {
        try {
             = sb.toString().getBytes("UTF-8");
        } catch (UnsupportedEncodingException e) {
             = sb.toString().getBytes();
        }
    }
    
    public void setRequestBody(InputStream is) {
         = is;
    }
    
    
heart of http engine. features: // all this should be moved outside this method: - authentication callback to process 401 and 403 codes, failure results in returning error message. - another callback to process 301 and 302 codes, failure results in returning error message. - code that process ssl exceptions and re-prompts for client certificate when allowed. // auth error, ssl exception and "moved" errors should be processed by the caller. - code to send request body. - code to parse svn error response in case return code is not ok1 and ok2. - standard http error should be returned otherwise. - body may be resetable inputStream + length - IMeasurable. // this may throw IOException that will be converted to: timeout error, can't connect error, or ssl will re-prompt.
    public void dispatch(String requestString pathHTTPHeader headerint ok1int ok2SVNErrorMessage contextthrows IOException {
        long length = 0;
        if ( != null) {
            length = .;
        } else if ( instanceof ByteArrayInputStream) {
            length = ((ByteArrayInputStream).available();
        } else if (header != null && header.hasHeader(.)) {
            length = Long.parseLong(header.getFirstHeaderValue(.));
//            header.removeHeader(HTTPHeader.CONTENT_LENGTH_HEADER);
        }
        StringBuffer headerText = composeHTTPHeader(requestpathheaderlength);
        .sendData(headerText.toString().getBytes());
        if ( != null && length > 0) {
            .sendData();
        } else if ( != null && length > 0) {
            .sendData(length);
        }
        // if method is "CONNECT", then just return normal status 
        // only if there is nothing to read.
        .readHeader(this);        
        context = context == null ? SVNErrorMessage.create(."{0} of ''{1}''"new Object[] {requestpath}) : context
        
        // check status.
        if (.getCode() == . || 
                .getCode() == . ||
                .getCode() == . ||
                .getCode() == . ||
                .getCode() == .) {
            // these errors are always processed by the caller, to allow retry.
            .skipData(this);
            return;
        } 
        
        boolean notExpected = false;        
        int expectedCode = "PROPFIND".equals(request) ? 207 : 200;
        if (ok1 >= 0) {
            if (ok1 == 0) {
                ok1 = "PROPFIND".equals(request) ? 207 : 200;
            }
            if (ok2 <= 0) {
                ok2 = ok1;
            }
            notExpected = !(.getCode() == ok1 || .getCode() == ok2); 
        } else if ("CONNECT".equalsIgnoreCase(request) && .getCode() != .) {
            notExpected = true;
        }
        if (notExpected) {
            // unexpected response code.
             = readError(requestpathcontext);
        } else if (.getCode() == .) {
            .skipData(this);
        } else if (.getCode() >= 300 || .getCode() != expectedCode) {
            SVNErrorMessage error = readError(requestpathcontext);
            .setError(error);
        } else if ( != null) {
             = .readData(this);
        } else if ( != null) {            
             = .readData(thisrequestpath);
        } else {
            if (!"CONNECT".equalsIgnoreCase(request)) {
                .skipData(this);
            } 
        }
    }
    private SVNErrorMessage readError(String requestString pathSVNErrorMessage context) {
        String contextMessage = context.getMessageTemplate();
        Object[] contextObjects = context.getRelatedObjects();
        if (.getCode() == .) {
            contextMessage = "''{0}'' path not found";
            contextObjects = new Object[] {path};
        } 
        SVNErrorMessage error = createDefaultErrorMessage(.getHost(), contextMessagecontextObjects);
        SVNErrorMessage davError = .readError(thisrequestpath);
        if (davError != null) {
            if (error != null) {
                davError.setChildErrorMessage(error);
            }
            return davError
        }
        return error;
    }
    
    public HTTPHeader getResponseHeader() {
        return ;
    }
    
    public HTTPStatus getStatus() {
        return ;
    }
    
    public void setStatus(HTTPStatus status) {
         = status;
    }
    
    public void setResponseHeader(HTTPHeader header) {
         = header;
    }
    
    public SVNErrorMessage getErrorMessage() {
        return ;
    }
    private StringBuffer composeHTTPHeader(String requestString pathHTTPHeader headerlong lengthboolean keepAlive) {
        StringBuffer sb = new StringBuffer();
        sb.append(request);
        sb.append(' ');
        if ( && !) {
            // prepend path with host name.
            sb.append("http://");
            sb.append(.getHost().getHost());
            sb.append(":");
            sb.append(.getHost().getPort());
        }
        if (path == null) {
            path = "/";
        }
        if (!"CONNECT".equals(request) && (path.length() == 0 || path.charAt(0) != '/')) {
            path = "/" + path;
        }
        HTTPParser.getCanonicalPath(pathsb);
        sb.append(' ');
        sb.append("HTTP/1.1");
        sb.append(.);
        sb.append("Host: ");
        sb.append(.getHost().getHost());
        sb.append(":");
        sb.append(.getHost().getPort());
        sb.append(.);
        sb.append("User-Agent: ");
        sb.append(Version.getVersionString());
        sb.append(.);
        if (keepAlive) {
            sb.append("Keep-Alive:");
            sb.append(.);
            sb.append("Connection: TE, Keep-Alive");
            sb.append(.);
        }
        sb.append("TE: trailers");
        sb.append(.);
        if ( != null) {
            sb.append("Authorization: ");
            sb.append();
            sb.append(.);
        }
        if (( || ( && !)) &&  != null) {
            sb.append("Proxy-Authorization: ");
            sb.append();
            sb.append(.);
        }
        if (header == null || !header.hasHeader(.)) {
            sb.append("Content-Length: ");
            sb.append(length);
            sb.append(.);
        }
        sb.append("Accept-Encoding: gzip");
        sb.append(.);
        if (header == null || !header.hasHeader(.)) {
            sb.append("Content-Type: text/xml; charset=\"utf-8\"");
            sb.append(.);
        }
        if (header != null) {
            sb.append(header.toString());
        }
        sb.append(.);
        return sb;
    }
    
    public static SVNErrorMessage createDefaultErrorMessage(SVNURL hostHTTPStatus statusString contextObject[] contextObjects) {
        SVNErrorCode errorCode = .;
        String message = status != null ? status.getCode() + " " + status.getReason() : "";
        if (status != null && status.getCode() == . || status.getCode() == .) {
            errorCode = .;
            message = status.getCode() + " " + status.getReason();
        } else if (status != null && status.getCode() == .) {
            errorCode = .;
        }
        // extend context object to include host:port (empty location).
        Object[] messageObjects = contextObjects == null ? new Object[1] : new Object[contextObjects.length + 1];
        int index = messageObjects.length - 1;
        messageObjects[messageObjects.length - 1] = host;
        if (messageObjects.length > 1) {
            System.arraycopy(contextObjects, 0, messageObjects, 0, contextObjects.length);
        }
        return SVNErrorMessage.create(errorCodecontext + ": " + message + " ({" + index + "})"messageObjects);
    }
    public void setKeepAlive(boolean isKeepAlive) {
         = isKeepAlive;
    }
    
New to GrepCode? Check out our FAQ X