Newsgroup: it.comp.java
Titolo: Downloader attraverso un proxy

Buongiorno a tutti.
Visto che ho un po' di tempo libero, mi sto implementando un downloader
*molto* rudimentale.
I file li scarica correttamente. Attualmente non ho fatto una struttura
seria di programma e sto facendo solo delle prove percui manca anche
tutta la gestione di errore.
Per scaricare il file uso un codice come il seguente
	url = new URL("
http://www.topolinia.it/file.txt
");
	is = new DataInputStream(url.openStream());
	br = new BufferedReader(new InputStreamReader(is));
	bw = new BufferedWriter(new FileWriter("prova.txt"));
 
	while((c=br.read()) != -1){
		bw.write(c);
	}
Tutto funziona correttamente tranne quando sono dietro ad un proxy (con
autenticazione per di più). COme faccio a dire ad URL che deve passare
da un proxy?
Ciao e grazie D.
Inviato da 
www.mynewsgate.net

Pare che la soluzione stia in
System.setProperty("proxySet","true");
System.setProperty("http.proxyHost","...");
System.setProperty("http.proxyPort","...");
System.setProperty("http.proxyUser","...");
System.setProperty("http.proxyPort","...");
Adesso faccio un po' di prove e poi faccio sapere.
Ciao D.
Inviato da 
www.mynewsgate.net

 System.setProperty("http.proxyPort","...");
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
ehm, correzione: http.proxyPassword


Nessuno è mai riuscito a farlo.
Sto provando vari modi trovati per la rete ma non riesco mai ad autenticarmi
al proxy.
Uso jvm 1.3 di WSAD.


 Nessuno è mai riuscito a farlo.
Ehm... Ehm...
Io ho una semplicissima applicazione Java
(funzionante con successo tutti i giorni da
diversi mesi) che scarica delle foto
da un sito Web passando attraverso un proxy.
Ha sempre funzionato senza problemi.
Le linee che permettono il tutto (almeno nel mio caso) sono:
   private static void setProxy() {
     System.setProperty("proxySet", "true" );
     System.setProperty("http.proxyHost", "bla.bla.bla" );
     System.setProperty("http.proxyPort", "8080" );
   }
Il metodo setProxy va chiamato PRIMA della creazione
di qualsiasi URL e URLConnection.
- Dario

    }
Si ok, quelle le ho pure io. I problemi li ho con l'autenticazione. Ho provato
con Authenticator, senza Authenticator ma niente da fare, tutte le volte ricevo
un 407 Proxy Authentication Required.


Ecco un po' di codice
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Properties;
import java.net.Authenticator;
public class ProxyPass{
	public static void main(String[] args){
		String 				url 		= "
http://www.google.com/
",
							proxy 		= "theProxy",
							port 		= "1234";
		URL					server		= null;
		HttpURLConnection	connection	= null;
		InputStream			in			= null;
		Properties			props		= System.getProperties();
 
		Authenticator.setDefault(new SimpleAuthenticator("dominio\utente","password"));
		props.setProperty("proxySet","true");
		props.setProperty("http.proxyHost",proxy);
		props.setProperty("http.proxyPort",port);
 
		try{
			server = new URL(url);
			connection = (HttpURLConnection) server.openConnection();
			HttpURLConnection.setFollowRedirects(true);
			connection.setInstanceFollowRedirects(false);
			connection.connect();
 
			System.out.println("(" + connection.getResponseCode() + ") " +
connection.getResponseMessage());
 
			//aggiunto perchè pare che vi sia un problema con i redirect.
			//ma non entra mai
			while(String.valueOf(connection.getResponseCode()).startsWith("3")){
				String newLocation = connection.getHeaderField("Location");
				connection.disconnect();
				server = new URL(newLocation);
				connection = (HttpURLConnection) server.openConnection();
				HttpURLConnection.setFollowRedirects(true);
				connection.setInstanceFollowRedirects(false);
				connection.connect();				
			}
			in = connection.getInputStream();
 
			readResponse(in);
		}catch(MalformedURLException mfue){
			mfue.printStackTrace();
		}catch(IOException ioe){
			ioe.printStackTrace();
		}finally{
			try{in.close();}catch(Exception e){}
		}
	}
 
	public static void readResponse(InputStream in) throws IOException{
		BufferedReader	br 		= new BufferedReader(new InputStreamReader(in));
		int 			line	= -1;
 
		try{
			while((line = br.read()) != -1){
				System.out.print((char)line);
			}
		}catch(IOException ioe){
			throw ioe;
		}finally{
			try{br.close();}catch(Exception e){}
		}
	}
}
import java.net.Authenticator;
import java.net.PasswordAuthentication;
public class SimpleAuthenticator extends Authenticator{
	private String username;
	private String password;
 
	public SimpleAuthenticator(String username, String password){
		this.username = username;
		this.password = password;
	}
 
	protected PasswordAuthentication getPasswordAuthentication() {
		return new PasswordAuthentication(username, password.toCharArray());
	}
}
Inviato da 
www.mynewsgate.net

Questo è un'altro tentativo che ho fatto senza Authenticator.
Ricevo comunque il solito errore 407.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Properties;
import sun.misc.BASE64Encoder;
public class Down3 {
	public static void main (String[] args){
		String 				url 		= "
http://www.google.com/
",
							proxy 		= "theProxy",
							port 		= "1234";
		URL					server		= null;
		HttpURLConnection	connection	= null;
		InputStream			in			= null;
		Properties			props		= System.getProperties();
		String				encPass		= new
BASE64Encoder().encode("dominio\utente:password".getBytes());
 
		props.setProperty("http.proxySet","true");
		props.setProperty("http.proxyHost",proxy);
		props.setProperty("http.proxyPort",port);
 
		try{
			server = new URL(url);
			connection = (HttpURLConnection) server.openConnection();
			connection.setRequestProperty("Proxy-Authorization", "Basic " + encPass);
			connection.connect();
			System.out.println("(" + connection.getResponseCode() + ") " +
connection.getResponseMessage());
			in = connection.getInputStream();
 
			readResponse(in);
		}catch(MalformedURLException mfue){
			mfue.printStackTrace();
		}catch(IOException ioe){
			ioe.printStackTrace();
		}finally{
			try{in.close();}catch(Exception e){}
		}
 
	}
 
	public static void readResponse(InputStream in) throws IOException{
		BufferedReader	br 		= new BufferedReader(new InputStreamReader(in));
		int 			line	= -1;
 
		try{
			while((line = br.read()) != -1){
				System.out.print((char)line);
			}
		}catch(IOException ioe){
			throw ioe;
		}finally{
			try{br.close();}catch(Exception e){}
		}
	}
}
Inviato da 
www.mynewsgate.net

getting_out wrote:

Prova a googolare un po'....
Io, per esempio, ho trovato questo:
 
http://www.rgagnon.com/javadetails/java-0085.html
dove, tra l'altro, si dice:
ou might need to identify yourself to the proxy server. Use the HTTP 
property "Proxy-Authorization" with a username:password base64 encoded.
    Properties systemSettings = System.getProperties();
   ...
   System.setProperties(systemSettings);
   URL url=new URL("
http://someserver/somepage
");
   URLConnection uc = url.openConnection ();
   String encoded = new String
       (Base64.base64Encode(new String("username:password").getBytes()));
   uc.setRequestProperty("Proxy-Authorization", "Basic " + encoded);
   uc.connect();
Non so se ti può essere utile...
- Dario

 Non so se ti può essere utile...
Spero vivavmente. E' veramente tutto il giorno che ci giro intorno. Non vorrei
ricorrere ai socket; è così comodo l'URL!


 ...
Niente da fare. Ottengo senpre risposta dal proxy che devo autenticarmi.
Ecco il codice
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.Properties;
import sun.misc.BASE64Encoder;
public class Down4 {
	public static void main (String[] args){
		String 				url 		= "
http://www.google.com/
",
							proxy 		= "proxy",
							port 		= "1234";
		String				encPass		= new BASE64Encoder().encode("dominio\user:pass".getBytes());
		Properties			props		= System.getProperties();
		URL					server		= null;
		URLConnection		conn		= null;
		InputStream			in			= null;
 
		props.put("proxySet","true");
		props.put("http.proxyHost",proxy);
		props.put("http.proxyPort",port);
		System.setProperties(props);
 
		try{
			server = new URL(url);
			conn = server.openConnection();
			conn.setRequestProperty("Proxy-Authorization", "Basic " + encPass);
			conn.connect();
 
			readResponse(conn.getInputStream());
 
		}catch(MalformedURLException mue){
			mue.printStackTrace();
		}catch(IOException ioe){
			ioe.printStackTrace();


 Niente da fare. Ottengo senpre risposta dal proxy che devo autenticarmi.
Googolando un po' ho trovato anche questo:
http://www.doc.ic.ac.uk/~ca99/blogs/000157.html
Soprattutto il punto 1 potrebbe essere quello che fa x te.
Prova a guardare un po'.
Di + non riesco a dire perchè non ho mai avuto problemi...
I'm sorry...
- Dario

 I'm sorry...
Figurati, è già tanto che ti sei messo a cercare per me!
Ecco comunque una prima prova (che non funziona). Ottengo sempre 407
authentication required. Sembrerebbe come se il proxy non riesca a rilevare che
java gli sta mandando l'autenticazione. Eppure l'autenticazione con mozilla/wget
nel formato dominio\username funziona.
Il proxy accetta autenticazione http perchè riesco a farlo andare con wget.
nel file wgetrc la lina del proxy è:
http_proxy = 
http://dominio
\utente:password@proxy:porta/
Bah ci riuscirò prima o poi?
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import sun.misc.BASE64Encoder;
public class Down5 {
	public static void main (String[] args){
		String 				addr 		= "
http://www.google.com/
",
							proxy 		= "proxy",
							port 		= "port";
		String				userName	= "dominio\nome";
		String				password	= "password";
		String				encPass		= new BASE64Encoder().encode((userName + ":" +
password).getBytes());
		URL					url			= null;
		HttpURLConnection	conn		= null;
 
		System.getProperties().put("http.proxySet","true");
		System.getProperties().put("http.proxyHost",proxy);
		System.getProperties().put("http.proxyPort",port);
		System.getProperties().put("http.proxyUser",userName);
		System.getProperties().put("http.proxySet",password);
 
		try{
			url = new URL(addr);
			conn = (HttpURLConnection)url.openConnection();
			conn.connect();
			System.out.println("(" + conn.getResponseCode() + ") " +
conn.getResponseMessage());
 
			readResponse(conn.getInputStream());
		}catch(MalformedURLException mue){
			mue.printStackTrace();
		}catch(IOException ioe){
			ioe.printStackTrace();
		}finally{
			try{conn.getInputStream().close();}catch(Exception e){}


 
http://www.doc.ic.ac.uk/~ca99/blogs/000157.html
Altro tentativo, altra risposta negativa.
ho sempre il 407 con in più un'eccezione
(407) Proxy Authentication Required
java.net.ProtocolException: Server redirected too many times (5)
	at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:311)
	at Down6.main(Down6.java:43)
	at Down6.main(Down6.java:51)
ho provato sia lasciando che togliendo le linee
System.getProperties().put("http.proxyUser",userName);
System.getProperties().put("http.proxySet",password);
ecco il codice
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Authenticator;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import sun.misc.BASE64Encoder;
public class Down6 {
	public static void main (String[] args){
		String				addr 		= "
http://www.google.com/
",
							proxy 		= "proxies",
							port 		= "1234";
		String				userName	= "dominio\utente";
		String				password	= "password";
		String				encPass		= new BASE64Encoder().encode((userName + ":" +
password).getBytes());
		URL					url			= null;
		HttpURLConnection	conn		= null;
 
		System.getProperties().put("http.proxySet","true");
		System.getProperties().put("http.proxyHost",proxy);
		System.getProperties().put("http.proxyPort",port);
		System.getProperties().put("http.proxyUser",userName);
		System.getProperties().put("http.proxySet",password);
 
		Authenticator.setDefault(new MyAuthenticator(userName,password));
 
		try{
			url = new URL(addr);
			conn = (HttpURLConnection)url.openConnection();
			conn.connect();
			System.out.println("(" + conn.getResponseCode() + ") " +
conn.getResponseMessage());
 
			readResponse(conn.getInputStream());
		}catch(MalformedURLException mue){
			mue.printStackTrace();
		}catch(IOException ioe){
			ioe.printStackTrace();
		}finally{
			try{conn.getInputStream().close();}catch(Exception e){}
		}
	}
 
	public static void readResponse(InputStream in) throws IOException{
		BufferedReader	br 		= new BufferedReader(new InputStreamReader(in));
		int 			line	= -1;
 
		try{
			while((line = br.read()) != -1){
				System.out.print((char)line);
			}
		}catch(IOException ioe){
			throw ioe;
		}finally{
			try{br.close();}catch(Exception e){}
		}
	}
}
import java.net.Authenticator;
import java.net.PasswordAuthentication;
public class MyAuthenticator extends Authenticator {
	private String user,password;
 
	public MyAuthenticator(String user, String password){
		this.user = user;
		this.password = password;
	}
 
	protected PasswordAuthentication getPasswordAuthentication() {
		return new PasswordAuthentication(this.user,this.password.toCharArray());
	}
}
Inviato da 
www.mynewsgate.net

 
http://www.doc.ic.ac.uk/~ca99/blogs/000157.html
Ecco un'altro tentativo.
La classe MyAuthenticator è la stessa del mio post precedente.
Ottengo sempre il 407.
Ho provato a togliere e lasciare le righe
System.getProperties().put("http.proxyUser",userName);
System.getProperties().put("http.proxySet",password);
Authenticator.setDefault(new MyAuthenticator(userName,password));
Non mi rimane che la via dei socket ma volevo evitarla...
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Authenticator;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import sun.misc.BASE64Encoder;
public class Down7 {
	public static void main (String[] args){
		String				addr 		= "
http://www.google.com/
",
							proxy 		= "proxy",
							port 		= "1234";
		String				userName	= "dominio\utente";
		String				password	= "password";
		String				encPass		= new BASE64Encoder().encode((userName + ":" +
password).getBytes());
		URL					url			= null;
		HttpURLConnection	conn		= null;
 
		System.getProperties().put("http.proxySet","true");
		System.getProperties().put("http.proxyHost",proxy);
		System.getProperties().put("http.proxyPort",port);
		System.getProperties().put("http.proxyUser",userName);
		System.getProperties().put("http.proxySet",password);
 
		Authenticator.setDefault(new MyAuthenticator(userName,password));
 
		try{
			url = new URL(addr);
			conn = (HttpURLConnection)url.openConnection();
			conn.setRequestProperty("Proxy-Authorization", "Basic " + encPass);
			conn.connect();
			System.out.println("(" + conn.getResponseCode() + ") " +
conn.getResponseMessage());
 
			readResponse(conn.getInputStream());
		}catch(MalformedURLException mue){
			mue.printStackTrace();
		}catch(IOException ioe){
			ioe.printStackTrace();
		}finally{
			try{conn.getInputStream().close();}catch(Exception e){}
		}
	}
 


 		String				userName	= "dominio\utente";
In Java per ottenere la stringa
     dominio\utente
devi scrivere
     "dominio\\utente"
- Dario

      "dominio\\utente"
Por##][]@[@#@#][][@##@€
Porca Pupazza
Non ci credo per una str####ta come questa ho perso un giorno. Ma guarda che
sono veramente un pivello. Mica ci facevo caso. Pensa che il lato comico è che
il nome utente inizia con "t", percui inserivo un carattere di tabulazione
all'interno dello user name.
Grazie infinite per la pazienza.
Adesso vado a fustigarmi per un paio d'ore :)
Funziona alla perfezione con il metodo dell'authenticator!
Ciao e grazie ancora D.
Inviato da 
www.mynewsgate.net

 Ciao e grazie ancora D.
Non c'è di che.
- Dario

 
http://www.playernet.net/postcard/sorry/sorry14.jpg
ahahahaahah LOL! :)
E pensare che sto per certificarmi... :P
