Модераторы: Snowy, Poseidon, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Upload файла (WinInet), проблемы с логином 
:(
    Опции темы
Микаэль
  Дата 10.2.2009, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 30.6.2006

Репутация: нет
Всего: нет



Положение дел: есть файлы, которые ужно залить на сервер через HTTP средствами WinInet по соответствующему логину и паролю.
Проблема: при установке флага INTERNET_FLAG_KEEP_CONNECTION запрос не проходит на сервер (не отображается в логах), а при его отсутствии сервер возвращает ошибку 401 (отсутствует авторизация). Если не использовать систему логина (отключать права доступа на сервере), все работает без проблем. Однако логин необходим.
Если у кого-то есть соображения на этот счет, буду благодарен.

Код


var
  s, readed,w: DWord;
  f : file;
  Buf : PBuf;
  param : Cardinal;
  proxy : PChar;
  internet_buf : INTERNET_BUFFERS;

.......

http_internet:=InternetOpen(PChar(ExtractFileName(application.exename)),param,proxy,nil,0);
if http_internet <> nil then begin
   http_connection:=InternetConnect(http_internet,PChar(HTTPHost]),80,PChar(UserName),Pchar(Password]),INTERNET_SERVICE_HTTP,0,0);
   if http_connection <> nil then begin

    AssignFile(f,FFileList[0]);
    Reset(f,1);
    s:=FileSize(f);
    new(buf);

    http_request:=HttpOpenRequest(http_connection,'PUT',PChar(filePath),nil,nil,nil,INTERNET_FLAG_KEEP_CONNECTION or INTERNET_FLAG_NO_CACHE_WRITE,0);
    FillChar(internet_buf,sizeOf(internet_buf),0);
    internet_buf.dwStructSize:=sizeOf(internet_buf);
    internet_buf.dwBufferTotal:=filesize(f);

   if HTTPsendRequestEX(http_request, @internet_buf, nil, HSR_INITIATE, 0) then begin

    {$I-}
    BlockRead(f,buf^,1024,readed);               
    if IOResult = 0 then
      repeat
        InternetWriteFile(http_request,@buf,readed,w);                     
        BlockRead(f,buf^,1024,readed); // ñíîâà ÷èòàåì
      until readed = 0                         

    HttpEndRequest(http_request, nil, 0, 0);

    {$I+}

    dispose(buf);
    closeFile(f); 
    end 

   InternetCloseHandle(http_request);
   InternetCloseHandle(http_connection);
   InternetCloseHandle(http_internet);

PM MAIL   Вверх
Snowy
Дата 10.2.2009, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 53
Всего: 484



InternetCreateUrl
Заполни структуру, включая логин и пароль.
И скармливай этот урл, который соберёт функция.
PM MAIL   Вверх
Микаэль
Дата 11.2.2009, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 30.6.2006

Репутация: нет
Всего: нет



Спасибо за совет!

Функция собирает незамысловатую строку типа:
Код

http://логин:пароль@хост/путь/файл


Передаем ее как урл запроса, и в логах сервер пишет дословно следующее:
Код

80 PUT /http:/логин:пароль@хост/путь/файл - 404

(с расстановкой слэшей я не ошибся)
и в чем-то он (сервер) прав, ибо такого адреса быть не может  smile 

Так что проблема, к сожалению, еще актуальна  smile 
PM MAIL   Вверх
Snowy
Дата 11.2.2009, 18:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 53
Всего: 484



Это я тупость в прошлый раз написал.
Зубудь её.
В приведённом куске кода всё верно.
Вероятно что-то не так в параметрах. Тут непонятно.
Может прокси виноват...
Попробуй флаг INTERNET_FLAG_RELOAD.
Также можно попробовать, в случае 401, принудительно повторить установку пароля через InternetSetOption с флагом INTERNET_OPTION_USERNAME  и INTERNET_OPTION_PASSWORD.
А в коде ошибок не вижу. Всё верно.
PM MAIL   Вверх
Микаэль
Дата 18.2.2009, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 30.6.2006

Репутация: нет
Всего: нет



Спасибо, но к сожалению не помогло...
Этот вопрос пока замяли... Аплоад решили не запароливать, но выяснилось, что download с авторизацией работает ни на всех компьютерах.
На систмах Win XP SP2 rus, (wininet v.6.0.2900.2180), Win 2K SP4 rus (wininet v.5.0.3700.6713) - авторизация проходит нормально
На английской Win 2k c такой же версией wininet и еще какой-то Win 2k (с кожалению, не имею доступа, чтобы уточнить) - ошибка 401.
В чем могут быть потенциальные грабли?

UPD: Код dowload'a могу привести, но он мало чем принципиально отличается от upload'а.

Это сообщение отредактировал(а) Микаэль - 18.2.2009, 14:20
PM MAIL   Вверх
MetalFan
Дата 18.2.2009, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 14
Всего: 128



может filePath кривой какой-нибудь...
а вообще еще можно посмотреть, что шлет клиентское приложение через какой-нить http tracer...


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0742 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.