Использование Java для команды FTP Put через Squid HTTP Proxy error

Я немного не знаком с Java, но столкнулся с проблемой при попытке ЗАГРУЗИТЬ локальный файл на удаленный FTP-сервер через HTTP-прокси SQUID (обратите внимание, что это явно связывает мне руки, так что типы прокси-серверов «FTP» и «SOCKS» не входят в объем).

Итак, вот мой код:

                       URL url = new URL(urlString);
                       OutputStream os ;                             

                       System.setProperty("proxySet", "true");
                       System.setProperty("proxyHost", proxyHost.trim());
                       System.setProperty("proxyPort", proxyPort.stringValue());


                       URLConnection ftpConn = url.openConnection() ;
                       ftpConn.setAllowUserInteraction(true); //threw this in to see if it would work, does nothing
                       ftpConn.setDoOutput(true); //here is where I set the setDoOutput
                       os = ftpConn.getOutputStream(); //here is where the exception occurs

Я продолжаю получать это исключение:

Вызов Java прерван необработанным исключением Java: java.net.ProtocolException: невозможно записать в URLConnection, если doOutput=false — вызовите setDoOutput(true)

Итак, я попробовал это с FTPURLConnection и т. д., и у меня возникла та же проблема.

При отладке выясняется, что в ftpConn имеется не менее ТРЕХ переменных, которые называются doOutput.
Только одна из них доступна для редактирования (а две другие — нет).

Первый (и, кажется, тот, который возвращается через getDoOutput) возвращает true после настройки ftpConn.setDoOutput(true);.

просмотр исходного кода для HttpURLConnection:

 public synchronized OutputStream getOutputStream()
                    throws IOException {

                try {
                    if (!doOutput) {
                        throw new ProtocolException(
                                "cannot write to a URLConnection"
                                        + " if doOutput=false - call setDoOutput(true)");
                    }

Просмотр обработки прокси в FtpURLConnection заставляет меня поверить, что когда он определяет, что вы используете HTTP-прокси, он передает обработку HttpURLConnection.

Здесь, я думаю, происходит отключение (либо у меня, либо у библиотеки, либо у прокси).

Я что-то пропустил, чтобы установить setDoOutput или что-то еще?

Мне удалось успешно туннелировать из прокси-сервера для GET, но все PUT FAILING на doOutput.

Спасибо за любую помощь или указатели, чтобы заставить это работать.

P.S. Я использую Java 1.5.0_10 (мы здесь, чтобы соответствовать другим приложениям)


person Harrison    schedule 24.06.2011    source источник
comment
Выяснилось, что это ошибка (Bug 6519647) в металинке. обходной путь в значительной степени использует что-то другое! не знаю, как пометить это как правильное (поскольку оно принадлежит мне), и я не думаю, что его закрытие обязательно является правильным курсом (поскольку у него есть разрешение)   -  person Harrison    schedule 25.06.2011


Ответы (1)


Выяснилось, что это ошибка (Bug 6519647) в металинке. обходной путь в значительной степени использует что-то другое!

(эта ошибка сохраняется независимо от того, как установлен прокси (с/без «http» и даже через класс прокси)

извините за дублированное редактирование/ответ, это мой первый «ответ» на мой собственный вопрос.

переключился на ftp4j, но все еще сталкивался с проблемами прокси-сервера squid (это совсем другая история).

person Harrison    schedule 27.06.2011