Webサーバーにデータを送信するデスクトップクライアントがあり、プロキシサーバーを経由できないようです。
更新:プロキシを介して通信しようとすると、407HTTPエラーが発生します。
Webサーバーから情報をダウンロードするときは、すべて問題ありません。ユーザーが(私が書いたダイアログボックスを使用して)プロキシサーバーを構成すると、ダウンロードは正常に機能します。ただし、 org.apache.http.client.HttpClientを使用したデータのアップロードは機能しません。
JDialogから情報を収集した後、このようなコードでプロキシサーバーを構成しています。
System.setProperty("http.proxyHost", proxyHost);
System.setProperty("http.proxyPort", "" + portNumber);
これを実行すると、単純なダウンロードが正常に機能します。たとえば、Webサーバーからいくつかのxmlデータを読み取るコードがあります(以下を参照)。顧客のネットワークでは、プロキシ設定が構成される前にキャッチブロックのエラーが表示され、正しいプロキシが設定されるとすべてが正常に機能しました。
/**
* Loads a collection of exams from the web site. The URL is determined by
* configuration or registration since it is State specific.
*/
public static int importExamsWS(StringBuilder msg) {
try {
java.net.URL onlineExams = new URL(examURL);
//Parse the XML data from InputStream and store it.
return importExams(onlineExams.openStream(), msg);
}
catch (java.net.UnknownHostException noDNS) {
showError(noDNS, "Unable to connect to proctinator.com to download the exam file.\n"
+ "There is probably a problem with your Internet proxy settings.");
}
catch (MalformedURLException | IOException duh) {
showFileError(duh);
}
return 0;
}
ただし、データをWebサーバーに送信しようとすると、プロキシ設定が無視され、IOExceptionがスローされたように見えます。すなわち:
org.apache.http.conn.HttpHostConnectException: Connection to http://proctinator.com:8080 refused
Webブラウザーでアドレスをテストしたため、ポート8080が顧客のWebフィルターによってブロックされていないことがわかりました。
ユーザーが入力した登録IDを確認するためのコードは次のとおりです。 更新:このメソッドでもプロキシを設定しています。
//Registered is just an enum with ACTIVE, INACTIVE, NOTFOUND, ERROR
public static Registered checkRegistration(int id) throws IOException {
httpclient = new DefaultHttpClient();
Config pref = Config.getConfig(); //stores user-entered proxy settings.
HttpHost proxy = new HttpHost(pref.getProxyServer(), pref.getProxyPort());
httpclient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy);
URIBuilder builder = new URIBuilder();
String path = "/Proctorest/rsc/register/" + id;
try {
builder.setScheme("http").setHost(server).setPort(8080).setPath(path);
URI uri = builder.build();
System.out.println("Connecting to " + uri.toString());
HttpGet httpget = new HttpGet(uri);
HttpResponse response = httpclient.execute(httpget);
System.out.println(response.getStatusLine().toString());
if(response.getStatusLine().getStatusCode()==200) {
String msg = EntityUtils.toString(response.getEntity());
GUI.globalLog.log(Level.INFO, "Server response to checkRegistration(" + id + "): " + msg);
return Registered.stringToRegistered(msg);
}
else {
GUI.globalLog.log(Level.INFO, "Server response status code to checkRegistration: " +
response.getStatusLine().getStatusCode());
return Registered.ERROR;
}
}
catch(java.net.URISyntaxException bad) {
System.out.println("URI construction error: " + bad.toString());
return Registered.ERROR;
}
}
問題がプロキシサーバーの構成に起因していることはほぼ間違いありませんが、SystemDefaultHttpClientのドキュメントでhttp.proxyHost
は、とのシステムプロパティを使用していると主張しています http.proxyPort
。プロパティが適切に設定されていることはわかっていますが、それでもこの認証エラーが発生します。プログラムから生成されたログを表示すると、次のことがわかりました。
checkRegistration INFO: Server response status code to checkRegistration: 407
この認証エラーを解決するにはどうすればよいですか?