Клуб API Диска

Авторизация посредством BasicAuthentication

13 июня, 01:47

Пару лет назад допиливал клиент в SDK для авторизации посредством BasicAuthentication, получилось и работало. На текущий момент перестало, при получении ответа либо "Input string was not in a correct format." либо другие ошибки (Conflict, MethodNotAllowed).

Заголовок запроса формируется следующим образом:

public static HttpWebRequest CreateRequest(SdkBasicAuthUserInfo basicAuthInfo, string path = "/")
        {
            var url = WebDavYD.ApiUrl + path;
            var request = WebRequest.CreateHttp(url);
            request.Accept = "*/*";
            request.Headers["Depth"] = "1";
            request.Headers["Authorization"] = "Basic " + Convert.ToBase64String(Encoding.UTF8.GetBytes(basicAuthInfo.Login + ":" + basicAuthInfo.Password));
            CommonServiceManager.CommonService.SetCustomHeader(request);
            return request;
        }

В чем может быть проблема?

Продолжает работать создание каталога, но не получается запросить содержимое.

Загрузка файлов в диск вроде бы работает, данные передаются, но по окончании получаю ошибку 'The remote server returned an error: (409) Conflict.' и в диске закачанный файл отсутствует.

OAuth не вариант, т.к. приложение только для личных целей, и внезапное прекращение работы при прекращении срока действия токена нежелательно.

Либо как получить токен OAuth без ограничения по сроку действия?

5 комментариев
Мой косяк в загрузке файлов. Ошибся в пути к файлу на стороне яндекс диска.

Вопрос по ошибке при получении содержимого каталога остается открытым.
Хотя и в получении списка файлов разобрался. Проблема в том что в ответе присутствует пустой параметр 'd:getcontentlength'
А код парсинга выглядит так:
case "d:getcontentlength":
reader.Read();
itemInfo.ContentLength = int.Parse(reader.Value);
break;


Если исправить на
case "d:getcontentlength":
{
reader.Read();
int buf;
if (int.TryParse(reader.Value, out buf))
{
itemInfo.ContentLength = buf;
}
}
break;


то все работает. В данном случае проблема получается в официальных исходниках. Либо в том что можно получить указанное значение пустым.
И еще ошибка в официальном C# клиенте в классе DiskSdkClient в методе:
public void GetItemInfoAsync(string path)
{
try
{
var request = HttpUtilities.CreateRequest(this.accessToken, path);
request.Method = WebdavResources.PropfindMethod;
var requestState = new RequestState { Request = request, ResponseArgument = path };
HttpUtilities.SendFullRequest(requestState, this.ProcessGetItemInfoResponse);
}
catch (Exception ex)
{
this.GetItemInfoCompleted.SafeInvoke(this, new GenericSdkEventArgs<DiskItemInfo>(HttpUtilities.ProcessException(ex)));
}
}


Вместо ResponseArgument = path должно быть RequestArgument = path.


Вам стоит порефакторить код.
И еще, если попробовать через браузер зайти по правильному пути:
https://webdav.yandex.ru/{path}
То в ответ приходит

ERROR


А если набрать несуществующий путь:
https://webdav.yandex.ru/{wrong_path}
то в ответе:
resource not found


Это точно должно так работать?
Да и по инструкции: https://yandex.ru/support/disk/webdav/webdav-win.html
Не удается подключить свой диск..


[Window Title]
Network Error
[Main Instruction]
Windows cannot access https://webdav.yandex.ru
[Content]
Check the spelling of the name. Otherwise, there might be a problem with your network. To try to identify and resolve network problems, click Diagnose.
[V] See details [Diagnose] [Cancel]
[Expanded Information]
Error code: 0x80070043
The network name cannot be found.