|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
25.10.2007, 11:26 | #1 |
Пользователь
Регистрация: 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; Выкинул чтоб не загламлять незначачие ф-ции. Основное - вот. |
25.10.2007, 11:39 | #2 |
Старожил
Регистрация: 13.12.2006
Сообщений: 3,859
|
А что именно не получается ? на каком этапе, какая ошибка ?
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи |
25.10.2007, 13:45 | #3 |
Пользователь
Регистрация: 11.12.2006
Сообщений: 10
|
Так в том-то и дело, что никакой ошибки нет.
Поясню: сама ф-ция HTTPGet проверена мной и использована многократно на методе и POST и GET на http и https. Все работает. Но вот появилась необходимость отправить фаил. В том случае, если фаил принят к обработке, появляется страничка, что фаил такой-то принят к обработке (в моем случае это копируется в переменную ResultSendFile := HTTPGet('https://www.arrl.org/lotw/upload', 'POST', PostStr.Text, nil ); ). Но выводя содержание ResultSendFile я вижу только начальную страничку, т.е. фаил к обработке не принят. Никаких более сообщений нет. |
25.10.2007, 16:23 | #4 |
Старожил
Регистрация: 13.12.2006
Сообщений: 3,859
|
Ну я бы посоветовал для начала поставить какой- нибудь снифер http заголовков и посомотреть поточней что там происходит при отправке файла
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи |
25.10.2007, 21:04 | #5 |
Пользователь
Регистрация: 11.12.2006
Сообщений: 10
|
Естественно ставил. Но протокол-то HTTPS - кодированный! Ничего не понятно, что передается.
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Авторизация на 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 |