Java HTTP PUT с дайджест-аутентификацией в Java

Я пытаюсь загрузить файл с Java, используя PUT, сервер выполняет дайджест-аутентификацию. Я хочу сохранить компактность, поэтому стараюсь использовать HttpURLConnection.

public void putData(String path, byte [] data) throws IOException, MalformedURLException {

Authenticator.setDefault(new Authenticator() {
      protected PasswordAuthentication getPasswordAuthentication() {
          return new PasswordAuthentication(user,password.toCharArray());
      }});

  debug("Default authenticator set");
  //Safeguard against double slashes
  if (path.startsWith("/")) {
   path = path.replaceFirst("/","");
  }

  debug(hostname + path);
  URL url = new URL(hostname + path);
  HttpURLConnection conn = (HttpURLConnection) url.openConnection();
  debug("HttpURLConnection acquired");
  conn.setDoOutput(true);
        conn.setDoInput(true);

  conn.setRequestMethod("PUT");
  conn.setRequestProperty("Content-Length",String.valueOf(data.length));
  conn.setRequestProperty("Content-type","application/binary");
  conn.setFixedLengthStreamingMode(data.length);
  conn.connect();

  debug("Properties set");
  OutputStream out = conn.getOutputStream();
  debug("Outputstrem acquired");
  out.write(data,0,data.length);
  out.flush();
  out.close();
  debug("Data written, stream closed."); 
 }

По какой-то причине это безнадежно терпит неудачу: я вижу, что возвращается 401, а затем все готово. Если я отключу авторизацию, тот же код работает. Загрузка файла с аналогичным кодом с использованием дайджест-аутентификации «просто работает». Любые идеи? Я действительно предпочел бы не начинать использовать следующее количество библиотек, таких как htclient от Apache или около того (... это 2010 год... вы ожидаете, что http-запросы с дайджестом authN будут работать в любой стандартной библиотеке).


person Maarten    schedule 23.09.2010    source источник


Ответы (1)


Вы должны по крайней мере попробовать conn.getInputStream() в конце вашего метода, чтобы принудительно оценить ответ сервера. В противном случае возможные сообщения об ошибках с сервера не будут правильно обнаружены.

person jarnbjo    schedule 23.09.2010
comment
Да, это помогает, и O должен удалить строку conn.setFixedLengthStreamingMode(data.length); - person Maarten; 23.09.2010
comment
Хм, слишком рано... Что происходит, так это то, что теперь клиент правильно аутентифицируется, но данные никогда не отправляются из основного потока вывода (я очищаю после записи). По сути, я просто хочу установить аутентификатор, подключиться, получить выходной поток и записать свои данные. Поэтому мне нужно получить ссылку на входной поток (почему это не обрабатывается при настройке соединения ....), но что еще. Это должно быть несколько строк - в противном случае какая польза от стандартной библиотеки классов (извините за напыщенную речь...) - person Maarten; 24.09.2010
comment
Более конкретно: я должен вызвать conn.getInputStream() для правильной аутентификации (я вижу это на сервере, ожидающем загруженных данных). похоже, что этот вызов никогда не возвращается, даже println после получения входного потока не достигается - person Maarten; 24.09.2010