:: Visual Foxpro, Foxpro for DOS
WinHttp.WinHttpRequest - проблемка с юникодом
AndyNigmatec
Автор

Сообщений: 1574
Откуда: Волгоград
Дата регистрации: 28.06.2015
пытаюсь програмно забрать csv-файл в utf-8 с определенного URL (в браузере норм забирается) так:

cUrl ="http://*****************"
loHttp = CreateObject("WinHttp.WinHttpRequest.5.1")
loHttp.Option(6) = .f.
loHttp.Open("GET", cUrl, .F.)
loHttp.Send()
?loHttp.Status
?loHttp.GetAllResponseHeaders()
?StrToFile(loHttp.ResponseText, "tmp.txt")

loHttp.GetAllResponseHeaders возвращяет:
Connection: keep-alive
Date: Tue, 13 Mar 2018 11:32:35 GMT
Content-Length: 365675
Content-Type: text/plain; charset=utf-8
Content-Encoding: deflate
Last-Modified: Tue, 13 Mar 2018 11:32:34 GMT
Server: nginx/1.8.1
Content-Disposition: attachment; filename=ref.csv

вот на этой строке
StrToFile(loHttp.ResponseText, "tmp.txt")
вываливается в ошибку:

[attachment 29126 s1.png]

никак не догоню - как победить сие?



Исправлено 1 раз(а). Последнее : AndyNigmatec, 13.03.18 14:39
Ratings: 0 negative/0 positive
Re: WinHttp.WinHttpRequest - проблемка с юникодом
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
В .ResponseBody есть нераскодированный полученный текст, попробуй его прочитать в переменную/файл и STRCONV(11) преобразовать UTF8->ASCII, что там за символ...
Ratings: 0 negative/0 positive
Re: WinHttp.WinHttpRequest - проблемка с юникодом
AndyNigmatec
Автор

Сообщений: 1574
Откуда: Волгоград
Дата регистрации: 28.06.2015
пока не победил ... (((
.responseBody возвращает "нечто", что никаким strconv() не раскодируется ... вот где-то туплю - та же опера нормально скачивает



Исправлено 1 раз(а). Последнее : AndyNigmatec, 13.03.18 18:33
Ratings: 0 negative/0 positive
Re: WinHttp.WinHttpRequest - проблемка с юникодом
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Как это не раскодируется
text/plain; charset=utf-8 - обычный текст
приложи файл, если не секретный
Ratings: 0 negative/0 positive
Re: WinHttp.WinHttpRequest - проблемка с юникодом
Taran

Сообщений: 13625
Откуда: Красноярск
Дата регистрации: 16.01.2008
А strtofile с флагом UTF-8 не помогает?
Ratings: 0 negative/0 positive
Re: WinHttp.WinHttpRequest - проблемка с юникодом
AndyNigmatec
Автор

Сообщений: 1574
Откуда: Волгоград
Дата регистрации: 28.06.2015
не секретный ))) тока сюда прикрепить не могу ... счас куда нить залью ... вот

www.neuro.nigmatec.ru
Ratings: 0 negative/0 positive
Re: WinHttp.WinHttpRequest - проблемка с юникодом
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Это никакая кодировка. Изи зашифрованное, или просто запакованное (типа gz) - deflate. Может не все заголовки серверу задал при запросе?
Доб. Или скрипт его расшифровывает (раскодирует) и потом возвращает читаемый текст. Надо сниферить (узнать заголовки), может даже с текстом конечным скоррелировать (может простой XOR с чем нибудь)
Вот тут пишут про 78 9С - habrahabr.ru



Исправлено 3 раз(а). Последнее : of63, 13.03.18 19:06
Ratings: 0 negative/0 positive
Re: WinHttp.WinHttpRequest - проблемка с юникодом
AndyNigmatec
Автор

Сообщений: 1574
Откуда: Волгоград
Дата регистрации: 28.06.2015
Огромное спасибо - offzip - оно самое :beer2:

почитаю - может как-то в заголовке можно передать чтоб уже распакованным скачивался

P/S/
посмотрел какие заголовки мозила шлет при скачивании
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:59.0) Gecko/20100101 Firefox/59.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive

зафигачил такие же ... все равно запакованным вытягивается програмно ... наверное потому что из .responseBody забираю а не из .responseText ... ну фиг с ним - способ то есть теперь пусть и через одно место )))



Исправлено 3 раз(а). Последнее : AndyNigmatec, 13.03.18 20:11
Ratings: 0 negative/0 positive
Re: WinHttp.WinHttpRequest - проблемка с юникодом
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Accept-Encoding: identity - отменяет сжатие на стороне сервера. Если он, конечно, согласится слать данные без сжатия, а не даст отлуп 406.
А так - ну ты явно сказал что готов и gzip и deflate варианты сжатия принять - чего возмущаццо то что сервер тебе ответ так и запаковал
Браузер то умеет сам распаковывать эти форматы - а указанный контрол, нет.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: WinHttp.WinHttpRequest - проблемка с юникодом
AndyNigmatec
Автор

Сообщений: 1574
Откуда: Волгоград
Дата регистрации: 28.06.2015
Accept-Encoding: identity - попробовал ради интереса ... не соглашается сволочь без сжатия
Ratings: 0 negative/0 positive
Re: WinHttp.WinHttpRequest - проблемка с юникодом
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Это логично - там же по сути не текст, а бинарные данные, которые по HTTP не ходят, разве что в base64 их кодировать... Ну или научиться распаковывать эти типа-"архивы".


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: WinHttp.WinHttpRequest - проблемка с юникодом
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Ничего логичного. Сервер ответил
Content-Encoding: deflate

Может, в соглашениях по http где-то написано, что если Content-Encoding="deflate", то это значит "распаковывайте согласно 'общеочевидным' типам данных (по начальным байтам пакованного кода)". Это так?
Ratings: 0 negative/0 positive
Re: WinHttp.WinHttpRequest - проблемка с юникодом
AndyNigmatec
Автор

Сообщений: 1574
Откуда: Волгоград
Дата регистрации: 28.06.2015
в любом случае, подсказка Олега про offzip решила данную конкретную проблкму - за что спасибо ))) - ну немного "через задницу" получилось - что ж поделать.
Ratings: 0 negative/0 positive
Re: WinHttp.WinHttpRequest - проблемка с юникодом
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Нет, Андрей, ИК говорит, что есть способ получить искомое "через передницу" )

Доб. Мтк, что ответы с сервера пишут такие же как мы, Андреи, Олеги, Игори, (и разрабы среды разработки, типа ПХП, АСП... я в них не понимаю, просто интересно "изучать") вот так и получается "непонятный ответ сервера"



Исправлено 1 раз(а). Последнее : of63, 13.03.18 23:15
Ratings: 0 negative/0 positive
Re: WinHttp.WinHttpRequest - проблемка с юникодом
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
of63
Может, в соглашениях по http где-то написано, что если Content-Encoding="deflate", то это значит "распаковывайте согласно 'общеочевидным' типам данных (по начальным байтам пакованного кода)". Это так?
Конечно. ru.wikipedia.org


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: WinHttp.WinHttpRequest - проблемка с юникодом
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Игорь, ты не ленив, это точно! Наверняка это 78 9C означали это типа (из твоей ссылки):

Deflate-поток содержит серии блоков. Перед каждым блоком находится трёхбитовый заголовок:
Один бит: флаг последнего блока.
1: блок последний.
0: блок не последний.
Два бита: метод, с помощью которого были закодированы данные.
00: данные не закодированы (в блоке находятся непосредственно выходные данные).
01: данные закодированы по методу статического Хаффмана.
10: данные закодированы по методу динамического Хаффмана.
11: зарезервированное значение (ошибка).

ПС. Андрей, AndyNigmatec, почему ты так долго копался?!

Игорь, а дальше (после 2х первых бит), где выйти на собственно алгоритм кодирования (не сомневаюсь, что он где-то описан), и еще, как вообще определить этот набор байтов как "закодированный deflate", а не просто бинарный файл...



Исправлено 4 раз(а). Последнее : of63, 13.03.18 23:32
Ratings: 0 negative/0 positive
Re: WinHttp.WinHttpRequest - проблемка с юникодом
AndyNigmatec
Автор

Сообщений: 1574
Откуда: Волгоград
Дата регистрации: 28.06.2015
поэтому и вопрос тут задал что сам "не в теме" ))) - и ответ вот получил быстро - что весьма радует
Ratings: 0 negative/0 positive
Re: WinHttp.WinHttpRequest - проблемка с юникодом
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Блин. Как в анеке старом, не нашел в ие. А нашел! )
Убитый Кеннеди приходит на тот свет. Открывает дверь и в ужасе шарахается от Сталина, стоящего за дверью с поднятым топором. — Нэ бойся, прахады, нэ тэбя жду!

humornet.ru - оттуда

> сам "не в теме"
Все не в теме, до тех пор, пока этим не позанимались. Никто не родился "в теме".



Исправлено 2 раз(а). Последнее : of63, 13.03.18 23:56
Ratings: 0 negative/0 positive
Re: WinHttp.WinHttpRequest - проблемка с юникодом
Рома

Сообщений: 1079
Дата регистрации: 06.06.2001
AndyNigmatec
в любом случае, подсказка Олега про offzip решила данную конкретную проблкму - за что спасибо ))) - ну немного "через задницу" получилось - что ж поделать.

Чтобы не через задницу, то надо использовать WinInet вместо WinHttp, в котором есть Decompression support (см. отличия msdn.microsoft.com)
Для этого есть флаг INTERNET_OPTION_HTTP_DECODING (см. здесь msdn.microsoft.com)



Исправлено 1 раз(а). Последнее : Рома, 14.03.18 02:01
Ratings: 0 negative/0 positive
Re: WinHttp.WinHttpRequest - проблемка с юникодом
AndyNigmatec
Автор

Сообщений: 1574
Откуда: Волгоград
Дата регистрации: 28.06.2015
как-то типа такого что ли ...

Declare Integer InternetOpen In WinInet.dll ;
String lpcAgent, ;
Integer nAccessType, ;
String lpcProxyName, ;
String lpcProxyBypass, ;
Integer nFlags
Declare Integer InternetCloseHandle In WinInet.dll ;
Integer nHandle
DECLARE INTEGER InternetSetOption IN WININET.DLL ;
INTEGER HINTERNET,;
INTEGER dwFlags,;
INTEGER @ dwValue,;
INTEGER dwBufferLength
Declare integer InternetOpenUrl in WinInet.dll ;
integer hInternet,;
string lpszUrl,;
string lpszHeaders,;
integer dwHeadersLength,;
integer dwFlags,;
integer dwContext
Declare integer InternetReadFile in WinInet.dll ;
Integer hFile,;
String @ lpBuffer,;
Integer dwNumberOfBytesToRead,;
Integer @ lpdwNumberOfBytesRead
&&Enables WinINet to perform decoding for the gzip and deflate encoding schemes.
#DEFINE INTERNET_OPTION_HTTP_DECODING 65
lnInetHandle = InternetOpen("VisualFoxPro", 1, .NULL., .NULL., 0)
IF lnInetHandle>0
dwFlagDecoding = 1
InternetSetOption(lnInetHandle, INTERNET_OPTION_HTTP_DECODING, @dwFlagDecoding, 4)
hUrl = InternetOpenUrl(lnInetHandle, lcUrl, 0, 0, 0, 0)
lcContent=CAST('' as blob)
hFile=-1
lnReaded=-1
m.lnBuffer=32
lcBuffer=REPLICATE(CHR(0), m.lnBuffer*1024)
jk=0
DO WHILE lnReaded#0 AND hFile#0
jk=jk+1
IF jk>1000
EXIT
ENDIF
hFile=InternetReadFile(hUrl, @lcBuffer, len(lcBuffer), @lnReaded)
lcContent=lcContent+left(lcBuffer, lnReaded)
ENDDO
IF !EMPTY(lcContent)
SET SAFETY OFF
StrToFile(lcContent, m.lcFile)
SET SAFETY ON
ENDIF
InternetCloseHandle(hFile)
InternetCloseHandle(hUrl)
ENDIF
InternetCloseHandle(lnInetHandle)

не взлетело ... тако же зажатый файл получаю



Исправлено 1 раз(а). Последнее : AndyNigmatec, 14.03.18 14:30
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 21 (Гостей: 21)

© 2000-2024 Fox Club 
Яндекс.Метрика