Java HTTP PUT с Digest удостоверяване в Java

Опитвам се да кача файл с Java с помощта на PUT, сървърът прави Digest удостоверяване. Искам да го поддържам икономичен, затова се опитвам да използвам 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 заявки с digest 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
Хм, твърде рано... Това, което се случва, е, че сега клиентът се удостоверява правилно, но данните никога не се изпращат от основния изходен поток (изтривам след всяко писане). По принцип просто искам да настроя Authenticator, да се свържа, да получа изходния поток и да напиша данните си. Така че трябва да получа препратка към входния поток (защо това не се обработва при настройка на връзката....), но какво повече. Това трябва да е няколко реда - каква е ползата от стандартна библиотека от класове в противен случай (съжалявам за изказването...) - person Maarten; 24.09.2010
comment
По-конкретно: трябва да извикам conn.getInputStream(), за да имам правилното удостоверяване (виждам това на сървъра да чака, за качените данни). Изглежда, че това обаждане никога не се връща, дори println след получаване на входния поток не е достигнат - person Maarten; 24.09.2010