Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.10.2007, 11:26   #1
Alex_C
Пользователь
 
Регистрация: 11.12.2006
Сообщений: 10
По умолчанию HTTPS и POST

Подскажите пожайлуста: есть страничка
https://www.arrl.org/lotw/upload
зайти туда может любой и загрузить свой фаил.
Как это сделать, кратко описано тут:
http://www.arrl.org/lotw/developer/uploads.html
Делал такой запрос:

const
multipart_boundary = '-----------------------------7cf87224d2020a';
...

PostStr := TStringList.Create;

// Создание header
PostStr.Add( 'Content-type: multipart/form-data, boundary=' + multipart_boundary );
PostStr.Add( 'Content-length: ' + FileSize(F) + Length('--' + multipart_boundary + '--')+2 );
PostStr.Add( '' );

// Заголовок
PostStr.Add( '--'+ multipart_boundary );
PostStr.Add( 'Content-Disposition: form-data; name="upfile"; filename="'+
CurrDir + '\Log\UploadToLoTW.tq8"');
PostStr.Add( 'Content-type: application/octet-stream' );
PostStr.Add( '' );

// Считываем фаил в файловый поток и копируем его в строковый поток
fstream := TFileStream.Create( CurrDir + '\Log\UploadToLoTW.tq8', fmOpenRead+fmShareDenyNone );
sstream := TStringStream.Create('');
sstream.CopyFrom(fstream, 0);
fstream.Free;
PostStr.Add(sstream.DataString);
sstream.Free;

// Добавляем окончание
PostStr.Add( '' );
PostStr.Add( '--' + multipart_boundary + '--' );

Вроде все как надо делаю, но не получается. Может кто подскажет?

P.S. Сам запрос осуществляется так:
(я это нашел в инете и модифицировал для использования с https. Все с https работает - пробовал заполнять формы, а вот именно фаил загрузить не могу.)

function HTTPGet(URL, RequestMethod, PostQuery: String; ProgressProc: TProgresProc): String;
var
hSession, hConnect, hRequest: hInternet;
HostName, FileName: String;
dwBufLen, dwIndex: DWord;
Data: Array[0..$400] of Char;
BytesToRead, BytesReaded: DWord;
TempStr: String;
Buf: Pointer;
AcceptType: String;
IP: String;
HTTP_Port: DWord;
dwFlags, dwError: DWord;
SendReqestResult: Boolean;

procedure CloseHandles;
begin
InternetCloseHandle(hRequest);
InternetCloseHandle(hConnect);
InternetCloseHandle(hSession);
end;

begin
Result := '';

// Проверяем соединение
IP := LocalIP;
if (IP = '') or (IP = '127.0.0.1') then
Exit;

ParseURL(URL, HostName, FileName);

if Pos('https://', URL) <> 0 then
HTTP_Port := INTERNET_DEFAULT_HTTPS_PORT
else
HTTP_Port := INTERNET_DEFAULT_HTTP_PORT;

hSession := InternetOpen(nil, INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
hConnect := InternetConnect (hSession, PChar(HostName),
HTTP_Port, nil, nil, INTERNET_SERVICE_HTTP, 0, 0);
AcceptType := PChar('Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/msword, application/vnd.ms-excel, application/vnd.ms-powerpoint, */*');

if HTTP_Port = INTERNET_DEFAULT_HTTPS_PORT then
dwFlags := INTERNET_FLAG_SECURE or INTERNET_FLAG_IGNORE_CERT_CN_INVALI D or INTERNET_FLAG_IGNORE_CERT_DATE_INVA LID
else
dwFlags := 0;

dwFlags := dwFlags or INTERNET_FLAG_RELOAD;

hRequest := HttpOpenRequest(hConnect, PChar(RequestMethod), PChar(FileName), HTTP_VERSION,
nil, @AcceptType, dwFlags, 0);

if RequestMethod = 'GET' then
SendReqestResult := HttpSendRequest(hRequest, nil, 0, nil, 0)
else
SendReqestResult := HttpSendRequest(hRequest, 'Content-Type: application/x-www-form-urlencoded', 47,
PChar(PostQuery), Length(PostQuery));

if not SendReqestResult then
begin
dwError := GetLastError;
ShowMessage( 'Error connect: ' + IntToStr(dwError) );
end;

dwIndex := 0;
dwBufLen := 1024;
GetMem(Buf, dwBufLen);

HttpQueryInfo(hRequest, HTTP_QUERY_CONTENT_LENGTH or HTTP_QUERY_FLAG_NUMBER, Buf, dwBufLen, dwIndex);

BytesReaded := 0;
BytesToRead := 0;

try
while True do
begin
if not InternetReadFile(hRequest, @Data, SizeOf(Data), BytesToRead) then
Break
else
if BytesToRead = 0 then
Break
else
begin
TempStr := Data;
SetLength(TempStr, BytesToRead);
Result := Result + TempStr;
inc(BytesReaded, BytesToRead);
if Assigned(ProgressProc) then
ProgressProc(BytesReaded);
end;
end;
finally
FreeMem(Buf);
CloseHandles;
end;
end;

Выкинул чтоб не загламлять незначачие ф-ции. Основное - вот.
Alex_C вне форума Ответить с цитированием
Старый 25.10.2007, 11:39   #2
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

А что именно не получается ? на каком этапе, какая ошибка ?
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Старый 25.10.2007, 13:45   #3
Alex_C
Пользователь
 
Регистрация: 11.12.2006
Сообщений: 10
По умолчанию

Так в том-то и дело, что никакой ошибки нет.
Поясню: сама ф-ция HTTPGet проверена мной и использована многократно на методе и POST и GET на http и https. Все работает. Но вот появилась необходимость отправить фаил. В том случае, если фаил принят к обработке, появляется страничка, что фаил такой-то принят к обработке (в моем случае это копируется в переменную
ResultSendFile := HTTPGet('https://www.arrl.org/lotw/upload', 'POST', PostStr.Text, nil ); ). Но выводя содержание ResultSendFile я вижу только начальную страничку, т.е. фаил к обработке не принят. Никаких более сообщений нет.
Alex_C вне форума Ответить с цитированием
Старый 25.10.2007, 16:23   #4
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

Ну я бы посоветовал для начала поставить какой- нибудь снифер http заголовков и посомотреть поточней что там происходит при отправке файла
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Старый 25.10.2007, 21:04   #5
Alex_C
Пользователь
 
Регистрация: 11.12.2006
Сообщений: 10
По умолчанию

Естественно ставил. Но протокол-то HTTPS - кодированный! Ничего не понятно, что передается.
Alex_C вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Авторизация на https arm82 Работа с сетью в Delphi 15 23.01.2011 20:54
HTTPS,SSL <-----Помогите разобраться nigma143 Работа с сетью в Delphi 14 07.07.2010 10:14
Не могу авторизоваться на HTTPS Yuran Работа с сетью в Delphi 11 18.04.2008 14:19
idHTTP и HTTPS CoDeR Работа с сетью в Delphi 2 12.11.2007 15:55
Ищу информацию по перехвату и декодированию HTTPS траффика ir0407 Работа с сетью в Delphi 12 22.07.2007 08:49