View Javadoc

1   /*
2    * This file is part of NetPisteur.
3    * 
4    * Copyright 2001-2002 : Olivier CORNEC, David BOUANCHEAU, Loic LOPEZ,
5    *                       Gaetan BOUDARD, Mael LE LANNOU, Julien ROBINEAU
6    * 
7    * Copyright 2002-2003 : Olivier BRIENS, Simon DEZE, Florence FRIGOULT,
8    *                       Olivier JOURNEAULT, Francois MARTINIER, Damien RAUDE-MORVAN
9    * 
10   * Copyright 2004-2007 : Damien RAUDE-MORVAN
11   * 
12   * NetPisteur is free software; you can redistribute it and/or modify
13   * it under the terms of the GNU General Public License as published by
14   * the Free Software Foundation; either version 2 of the License, or
15   * (at your option) any later version.
16   *
17   * NetPisteur is distributed in the hope that it will be useful,
18   * but WITHOUT ANY WARRANTY; without even the implied warranty of
19   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20   * GNU General Public License for more details.
21   *
22   * You should have received a copy of the GNU General Public License
23   * along with NetPisteur; if not, write to the Free Software
24   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
25   *
26   */
27  package com.drazzib.netpisteur.loader;
28  
29  import java.io.BufferedReader;
30  import java.io.IOException;
31  import java.io.InputStream;
32  import java.io.InputStreamReader;
33  import java.net.HttpURLConnection;
34  import java.net.URL;
35  
36  import org.apache.commons.logging.Log;
37  import org.apache.commons.logging.LogFactory;
38  
39  /**
40   * <P>
41   * <STRONG>Description </STRONG>
42   * <P>
43   * Manage the connection with a server and get the content of the Url with the
44   * method getObject
45   * 
46   * @see com.drazzib.netpisteur.loader.Connexion
47   * @version 1.0
48   * @since 2002/03/18
49   * @author NetPisteur Team
50   */
51  
52  public class ConnexionHttp extends Connexion {
53  	
54  	private static Log log = LogFactory.getLog(ConnexionHttp.class);
55  
56  	// /////////////////////////////////////
57  	// attributes
58  
59  	/**
60  	 * Represents the Http connection
61  	 */
62  	private HttpURLConnection connexionHttp;
63  
64  	private String messageErreur;
65  
66  	private boolean connecte;
67  
68  	// /////////////////////////////////////
69  	// constants
70  
71  	/**
72  	 * Represents an error code for stream reader
73  	 */
74  	static final int LECTURE_FLUX_IMPOSSIBLE = 6;
75  
76  	// /////////////////////////////////////
77  	// constructor
78  
79  	/**
80  	 * Creates a ConnexionHttp object using the class httpUrlConnection
81  	 * 
82  	 * @param uneUrl :
83  	 *            uneUrl
84  	 * 
85  	 */
86  	public ConnexionHttp(URL uneUrl) {
87  		super(uneUrl);
88  		this.connexionHttp = null;
89  		this.messageErreur = null;
90  		this.connecte = false;
91  		HttpURLConnection.setFollowRedirects(true);
92  	} // ConnexionHttp()
93  
94  	// /////////////////////////////////////
95  	// Accessors
96  
97  	/**
98  	 * Gets the Url of the connection. This method redifines the Connexion
99  	 * getUrl() method by checking if the connection to this Url is possible
100 	 * 
101 	 * @return URL: url of this connection
102 	 */
103 	public URL getTheUrl() {
104 
105 		if (this.connecte) {
106 			return this.url;
107 
108 		}
109 		return null;
110 
111 	} // getTheUrl()
112 
113 	/**
114 	 * Is the connection made ?
115 	 * 
116 	 * @return boolean : return false is the connection to this url is
117 	 *         impossible
118 	 */
119 	public boolean getConnecte() {
120 		return (this.connecte);
121 	} // getConnecte()
122 
123 	/**
124 	 * Gives the current error message
125 	 * 
126 	 * @return String : the current error message
127 	 */
128 	public String getMessageErreur() {
129 		return (this.messageErreur);
130 	} // getMessageErreur()
131 
132 	// /////////////////////////////////////
133 	// operations
134 
135 	/**
136 	 * Opens a http connection using a url and checking the errors
137 	 * 
138 	 * @return boolean : success or failure
139 	 */
140 	public boolean connexion() {
141 
142 		int typeErreur;
143 		boolean lectureFluxPossible = false;
144 		// initialisation du message d'erreur
145 		this.messageErreur = null;
146 
147 		try {
148 
149 			// affectation de l'url a l'objet HttpURLConnection
150 			this.connexionHttp = (HttpURLConnection) (this.url)
151 					.openConnection();
152 
153 			// Permet d'interroger un serveur en simulant un utilisateur car
154 			// certains serveurs refusent les connexions etablies par des
155 			// programmes
156 			this.connexionHttp
157 					.setRequestProperty("User-Agent", "Netpisteur v2");
158 
159 			// Evite l'ouverture de connexion KeepALive
160 			// difficiles  grer avec le navigateur
161 			this.connexionHttp.setRequestProperty("Connection", "close");
162 			this.connexionHttp.setRequestProperty("Proxy-Connection", "close");
163 			this.connexionHttp.connect();
164 
165 			// recuperation des codes d'erreur
166 			typeErreur = this.connexionHttp.getResponseCode();
167 
168 			// analyse des codes d'erreur
169 			this.messageErreur = traitementErreur(typeErreur);
170 
171 			lectureFluxPossible = this.connexionHttp.getDoInput();
172 
173 			if (!lectureFluxPossible) {
174 				this.messageErreur = traitementErreur(LECTURE_FLUX_IMPOSSIBLE);
175 			}
176 
177 		} catch (java.io.IOException exWithOpenConnection) {
178 			this.messageErreur = "Connexion a l'url : " + getURL()
179 					+ " impossible \n";
180 		}
181 
182 		return this.connecte;
183 	} // ----------------------------------------------------connexion()
184 
185 	/**
186 	 * Sends a request to the serveur 1-It deconnects the previous connection
187 	 * 2-Gets the last url used in the connectionHttp 3-Builds a new url with
188 	 * the parameters to send 4-Opens a new connection with this new url
189 	 * 
190 	 * @param parametre :
191 	 *            the message error of the connection
192 	 * @return boolean : success or failure
193 	 */
194 	public boolean connexionAvecParam(String parametre) {
195 
196 		String stringRequete;
197 		URL hote;
198 		URL urlAvecParam;
199 		int typeErreur;
200 		boolean lectureFluxPossible = false;
201 		// initialisation du message d'erreur
202 		this.messageErreur = null;
203 
204 		// Deconnexion
205 		this.deconnexion();
206 
207 		// Recuperation de la derniere url
208 		hote = this.connexionHttp.getURL();
209 
210 		// Ajout des parametres de la requete
211 		// stringRequete = ( cheminScript + "?" + param1 + "=" + val1 + "&" +
212 		// param2 + "=" + val2 );
213 		stringRequete = parametre;
214 
215 		try {
216 			// Connexion
217 
218 			// nouvelle url avec les parametres
219 			urlAvecParam = new URL(hote, stringRequete);
220 			this.url = urlAvecParam;
221 			this.connexionHttp = (HttpURLConnection) (this.url)
222 					.openConnection();
223 
224 			// Permet d'interroger un serveur en simulant un utilisateur car
225 			// certains serveurs refuse les connexion etablies par des
226 			// programmes
227 			this.connexionHttp.setRequestProperty("User-Agent", "Netpisteurv2");
228 			this.connexionHttp.connect();
229 
230 			// recuperation des codes d'erreurs
231 			typeErreur = this.connexionHttp.getResponseCode();
232 
233 			// analyse des codes d'erreurs si pas d'erreur renvoie true
234 			this.messageErreur = traitementErreur(typeErreur);
235 
236 			lectureFluxPossible = this.connexionHttp.getDoInput();
237 
238 			if (!lectureFluxPossible) {
239 				this.messageErreur = traitementErreur(LECTURE_FLUX_IMPOSSIBLE);
240 			}
241 
242 		} catch (java.io.IOException exWithOpenConnection) {
243 			this.messageErreur = "\nConnexion a l'url : " + getURL()
244 					+ " impossible \n";
245 		}
246 
247 		return this.connecte;
248 	} // ----------------------------------------------------connexionAvecParam()
249 
250 	/**
251 	 * Gets the ressource of an url using the http protocol This ressource is
252 	 * stored in a string
253 	 * 
254 	 * @return String: The ressource of the url
255 	 */
256 	public String getSourceByString() {
257 
258 		InputStream fluxEntree = null;
259 		InputStreamReader lecteurFlux = null;
260 		BufferedReader netIn = null;
261 		String reponseServeur = null;
262 		String reponseServeurTmp = null;
263 
264 		try {
265 			if (this.connecte) {
266 
267 				fluxEntree = this.connexionHttp.getInputStream();
268 				lecteurFlux = new InputStreamReader(fluxEntree);
269 				netIn = new BufferedReader(lecteurFlux);
270 				do {
271 					reponseServeurTmp = (netIn.readLine());
272 					reponseServeur = reponseServeur + reponseServeurTmp;
273 				} while (reponseServeurTmp != null);
274 			} else {
275 				reponseServeur = (this.messageErreur);
276 
277 			}
278 
279 		} catch (java.io.IOException exWithGetInputStream) {
280 			this.messageErreur = "erreur de lecture de flux d'entree dans ConnexionHttp.getSourceByString()";
281 		} finally {
282 			try {
283 				if (netIn != null)
284 				{
285 					netIn.close();
286 				}
287 				if (lecteurFlux != null) {
288 					lecteurFlux.close();
289 				}
290 				if (fluxEntree != null) {
291 					fluxEntree.close();
292 				}
293 			} catch (IOException e) {
294 				log.error(e);
295 			}
296 		}
297 
298 		return reponseServeur;
299 	} // ----------------------------------------------------getSourceByString()
300 
301 	/**
302 	 * Gets the reader of an InputStream using the http protocol This ressource
303 	 * is stored in an InputStream object
304 	 * 
305 	 * @return InputStream : the reader of the url
306 	 */
307 	public InputStreamReader getSourceByReader() {
308 
309 		InputStreamReader fluxEntree = null;
310 
311 		try {
312 			if (this.connecte) {
313 				fluxEntree = new InputStreamReader(this.connexionHttp
314 						.getInputStream());
315 				fluxEntree.close();
316 			}
317 		} catch (java.io.IOException exWithOpenConnection) {
318 			this.messageErreur = "erreur de lecture de flux d'entree dans ConnexioHttp.getSourceByReader()";
319 		}
320 		return fluxEntree;
321 	} // ----------------------------------------------------getSourceByReader()
322 
323 	/**
324 	 * Checks the response code from the serveur
325 	 * 
326 	 * @param unTypeErreur :
327 	 *            the code error to study
328 	 * @return String : the error message
329 	 */
330 	public String traitementErreur(int unTypeErreur) {
331 
332 		String message = null;
333 
334 		switch (unTypeErreur) {
335 
336 		case (200):
337 			message = "Succs 200. OK. La requte a abouti... ";
338 			this.connecte = true;
339 			return message;
340 
341 		case (201):
342 			message = "Succs 201. Cr. La requte a abouti et une nouvelle ressource rseau en rsulte... ";
343 			this.connecte = true;
344 			return message;
345 
346 		case (202):
347 			message = "Succs 202. Accepte. La requte a abouti et est interprte correctement, mais son traitement n'est pas termin... ";
348 			this.connecte = true;
349 			return message;
350 
351 		case (204):
352 			message = "Succs 204. Pas de contenu. La requte a abouti et le serveur n'a rien retourn en retour... ";
353 			this.connecte = true;
354 			return message;
355 
356 		case (300):
357 			message = "Erreur 300. Choix multiple. La ressource vise est disponible en un ou plusieurs autres points du rseau... ";
358 			this.connecte = true;
359 			return message;
360 
361 		case (301):
362 			message = "Erreur 301. Changement d'adresse dfinitive. La ressource demande est dsormais accessible via une autre URL... ";
363 			this.connecte = true;
364 			return message;
365 
366 		case (302):
367 			message = "Erreur 302. Changement d'adresse temporaire. La ressource demande est actuellement et temporairement accessible via une autre URL... ";
368 			this.connecte = true;
369 			return message;
370 
371 		case (304):
372 			message = "Erreur 304. Non modifi. La ressource demande n'est pas accessible car elle n'a pas t modifie... ";
373 			this.connecte = true;
374 			return message;
375 
376 		case (400):
377 			message = "Erreur 400. Requte incorrecte. La requte n'a pas pu tre reconnue par le serveur pour cause d'une syntaxe incorrecte... ";
378 			this.connecte = false;
379 			return message;
380 
381 		case (401):
382 			message = "Erreur 401. Non autoris. La requte demande ncessite une authentification de la part de l'utilisateur... ";
383 			this.connecte = false;
384 			return message;
385 
386 		case (403):
387 			message = "Erreur 403. Interdit. Le serveur a compris la requte mais refuse de la satisfaire... ";
388 			this.connecte = false;
389 			return message;
390 
391 		case (404):
392 			message = "Erreur 404. Non trouv. Le serveur n'a trouv aucune ressource correspondant  l'URL vise... ";
393 			this.connecte = false;
394 			return message;
395 
396 		case (500):
397 			message = "Erreur 500. Erreur serveur interne. Le serveur a t en prsence d'un vnement inattendu... ";
398 			this.connecte = false;
399 			return message;
400 
401 		case (501):
402 			message = "Erreur 501. Non implment. Le serveur ne supporte pas les fonctionnalits requises pour satisfaire la requte... ";
403 			this.connecte = false;
404 			return message;
405 
406 		case (502):
407 			message = "Erreur 502. Erreur de routeur. Le serveur a reu une rponse invalide de la part du serveur amont contact pour satisfaire la requte... ";
408 			this.connecte = false;
409 			return message;
410 
411 		case (503):
412 
413 			message = "Erreur 503. Service indisponible. Le serveur ne peut pas traiter la requte momentanment... ";
414 			this.connecte = false;
415 			return message;
416 
417 		case (6):
418 
419 			message = "Erreur, lecteur de flux impossible, veuillez vrifier vos paramtres de connexion... ";
420 			this.connecte = false;
421 			return message;
422 
423 		default:
424 
425 			message = "Erreur inconnue";
426 			this.connecte = false;
427 			return message;
428 
429 		}
430 
431 	} // ----------------------------------------------------traitementErreur()
432 
433 	/**
434 	 * Closes the connexionHttp
435 	 * 
436 	 * @return boolean : state of the connection
437 	 */
438 	public boolean deconnexion() {
439 
440 		this.connexionHttp.disconnect();
441 		this.connecte = false;
442 		return this.connecte;
443 	} // ---------------deconnexion()
444 
445 } // -----------------------------------------------------------------------------------fin
446 // ConnexionHttp
447