1 // 2 // $Id: DefaultUploadPolicy.java 289 2007-06-19 10:04:46 +0000 (mar., 19 juin 3 // 2007) etienne_sf $ 4 // 5 // jupload - A file upload juploadContext. 6 // Copyright 2007 The JUpload Team 7 // 8 // Created: 2006-05-04 9 // Creator: etienne_sf 10 // Last modified: $Date: 2010-01-23 18:39:37 +0100 (sam., 23 janv. 2010) $ 11 // 12 // This program is free software; you can redistribute it and/or modify it under 13 // the terms of the GNU General Public License as published by the Free Software 14 // Foundation; either version 2 of the License, or (at your option) any later 15 // version. This program is distributed in the hope that it will be useful, but 16 // WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 17 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more 18 // details. You should have received a copy of the GNU General Public License 19 // along with this program; if not, write to the Free Software Foundation, Inc., 20 // 675 Mass Ave, Cambridge, MA 02139, USA. 21 package wjhk.jupload2.upload.helper; 22 23 import wjhk.jupload2.policies.UploadPolicy; 24 25 /** 26 * This Thread executes a HEAD request to the server. From the server response, 27 * the exact HTTP protocol, and any possible redirection are checked and used 28 * (if any) to update the uploadURL.<BR> 29 * The entry point for this method is the static 30 * {@link #computeServerProtocol(UploadPolicy, String)} method. 31 * 32 * @author etienne_sf 33 */ 34 public class HttpProtocolFinderThread extends Thread { 35 /** The current upload policy */ 36 UploadPolicy uploadPolicy; 37 38 /** The given which should be analyzed, to find the server protocol */ 39 String givenServerProtocol; 40 41 /** 42 * This static method is the entry point for this class. It creates a 43 * thread, and launch it, returning immediately. The finding of the server 44 * protocol is then executed in a separated thread. So whenever long it is, 45 * the user won't see it. A default protocol is set immediately, in the run 46 * method, to be sure that there will be no NullPointerException. 47 * 48 * @param uploadPolicy The current upload policy 49 * @param givenServerProtocol The protocol given as parameter. If valid it 50 * will be used. If not, the serverProtocol will be computed from 51 * the post URL (and from a HEAD request for HTTP URL). 52 */ 53 static public void computeServerProtocol(UploadPolicy uploadPolicy, 54 String givenServerProtocol) { 55 new HttpProtocolFinderThread(uploadPolicy, givenServerProtocol).start(); 56 } 57 58 /** 59 * @param uploadPolicy The current upload policy 60 * @param givenServerProtocol The protocol given as parameter. If valid it 61 * will be used. If not, the serverProtocol will be computed from 62 * the post URL (and from a HEAD request for HTTP URL). 63 */ 64 public HttpProtocolFinderThread(UploadPolicy uploadPolicy, 65 String givenServerProtocol) { 66 //Let's name this thread. It's easier for debugging. 67 super("HttpProtocolFinderThread"); 68 69 this.uploadPolicy = uploadPolicy; 70 this.givenServerProtocol = givenServerProtocol; 71 } 72 73 /** 74 * The job itself. Will do a HEAD request if it's a HTTP URL. Will just note 75 * ftp if FTP. Otherwise: will throw an error. 76 */ 77 public void run() { 78 String computedProtocol = null; 79 String postURL = this.uploadPolicy.getPostURL(); 80 81 if (null == givenServerProtocol || givenServerProtocol.equals("")) { 82 if (null == postURL || postURL.equals("")) { 83 this.uploadPolicy.displayErr("postURL not set"); 84 computedProtocol = UploadPolicy.DEFAULT_SERVER_PROTOCOL; 85 } else if (postURL.substring(0, 3).equals("ftp")) { 86 computedProtocol = "ftp"; 87 } else { 88 try { 89 this.uploadPolicy.displayDebug( 90 "Getting serverProtocol from HEAD request", 30); 91 92 // Let's set a default protocol immediatly. It should be 93 // good, and avoid a NullPointerException if an upload 94 // starts immediatly. 95 this.uploadPolicy 96 .setServerProtocol(UploadPolicy.DEFAULT_SERVER_PROTOCOL); 97 // Then we do the head request to the server 98 computedProtocol = new HttpConnect(this.uploadPolicy) 99 .getProtocol(); 100 } catch (Exception e) { 101 // If we throw an error here, we prevent the applet 102 // to 103 // start. So we just log it, and try the default protocol 104 this.uploadPolicy.displayErr( 105 "Unable to access to the postURL: '" + postURL 106 + "'", e); 107 // Let's try with default value. 108 computedProtocol = UploadPolicy.DEFAULT_SERVER_PROTOCOL; 109 } 110 } 111 } else if (this.givenServerProtocol.startsWith("HTTP")) { 112 try { 113 // In HTTP mode, we always give a try to HTTPConnect, to check 114 // if the page has moved, and other stuff. 115 // But we keep the parameter given when calling this method. 116 this.uploadPolicy.displayDebug( 117 "Checking any redirect, from HEAD request", 30); 118 // Let's set a default protocol immediatly. It should be 119 // good, and avoid a NullPointerException if an upload 120 // starts immediatly. 121 this.uploadPolicy 122 .setServerProtocol(UploadPolicy.DEFAULT_SERVER_PROTOCOL); 123 // Then we do the head request to the server 124 computedProtocol = new HttpConnect(this.uploadPolicy) 125 .getProtocol(); 126 } catch (Exception e) { 127 // If we throw an error here, we prevent the applet to 128 // start. So we just log it, and try the default protocol 129 this.uploadPolicy.displayErr( 130 "Unknown to get protocol in the given postURL (" 131 + this.uploadPolicy.getPostURL() 132 + "), due to error: " + e.getMessage(), e); 133 } 134 } 135 this.uploadPolicy.setServerProtocol(computedProtocol); 136 } 137 }