Benoits Marchals Artikel oben brachte die Lösung... und eine gute theoretische Erklärung.
Increasingly, companies require employees to log in to the proxy before accessing the Internet. Login is used to better monitor Internet usage; for example, to monitor what sites are visited.
... und wie oben angemerkt, erwarten die meisten Proxies Username, Password Base64 encoded. Vermutlich funktioniert deshalb die Lösung vom Freitag mit dem username und password property nicht (wird nicht base64 encoded)
Die zweite Lösung funktioniert problemlos.
Bei der ersten Lösung stellt sich zumindest in Domino6 die Notes-Java-Agent-Security in den Weg.
Ich habs nicht ausprobiert, aber hier ist wohl die Lösung, um dieses Problem auszuschalten.
diskussion auf notes.netwie gesagt: Agent2 läuft hier problemlos. Wäre nett, wenn das andere hinter Firmenfirewalls auch mal ausprobieren könnten:
DEIN_NAME, DEIN_PASSWORT, DEIN_PROXY mit eigenen Werten ersetzen.
lsg 1: scheitert an Policy, die verändert werden kann.
import lotus.domino.*;
import java.io.*;
import java.net.*;
import java.util.*;
public class JavaAgent extends AgentBase {
public void NotesMain() {
try {
Session session = getSession();
AgentContext agentContext = session.getAgentContext();
// (my code walks here)
String url = "http://www.marchal.com/",
proxy = "DEIN_PROXY",
port = "8080",
username = "DEIN_NAME",
password = "DEIN_PASSWORT";
Authenticator.setDefault(new SimpleAuthenticator(
username,password));
URL server = new URL(url);
Properties systemProperties = System.getProperties();
systemProperties.setProperty("http.proxyHost",proxy);
systemProperties.setProperty("http.proxyPort",port);
HttpURLConnection connection = (
HttpURLConnection)server.openConnection();
connection.connect();
InputStream in = connection.getInputStream();
BufferedReader inReader = new BufferedReader(new InputStreamReader(in));
String inputLine;
while ((inputLine = inReader.readLine()) != null)
System.out.println(inputLine);
// (my code stops here)
} catch(Exception e) {
e.printStackTrace();
}
}
}
class SimpleAuthenticator
extends Authenticator
{
private String username,
password;
public SimpleAuthenticator(String username,String password)
{
this.username = username;
this.password = password;
}
protected PasswordAuthentication getPasswordAuthentication()
{
return new PasswordAuthentication(
username,password.toCharArray());
}
}
lsg2 funktioniert:
import lotus.domino.*;
import java.io.*;
import java.net.*;
public class JavaAgent extends AgentBase {
public void NotesMain() {
try {
Session session = getSession();
AgentContext agentContext = session.getAgentContext();
int port = 8080;
String url = "http://www.marchal.com/",
proxy = "DEIN_PROXY",
authentication = "DEIN_NAME!!!:DEIN_PASSWORT";
URL server = new URL(url);
Socket socket = new Socket(proxy,port);
Writer writer = new OutputStreamWriter(socket.getOutputStream(),
"US-ASCII");
writer.write("GET " + server.toExternalForm() + " HTTP/1.0\r\n");
writer.write("Host: " + server.getHost() + "\r\n");
writer.write("Proxy-Authorization: Basic "
+ new sun.misc.BASE64Encoder().encode(
authentication.getBytes())
+ "\r\n\r\n");
writer.flush();
BufferedReader reader = new BufferedReader(new InputStreamReader(
socket.getInputStream(),"US-ASCII"));
String line = reader.readLine();
if(line != null && line.startsWith("HTTP/"))
{
int sp = line.indexOf(' ');
String status = line.substring(sp + 1,sp + 4);
if(status.equals("200"))
{
while ((line = reader.readLine()) != null) {
System.out.println(line); }
}
else
throw new FileNotFoundException("Host reports error " +
status);
}
else
throw new IOException("Bad protocol");
reader.close();
writer.close();
socket.close();
} catch(Exception e) {
e.printStackTrace();
}
}
}