Adam Smith писал(а):После закрытия сокета создаю новый байт-массив под считанное кол-во байт, собираю в него скачанный "массив" байт-массивов.
На кой чёрт это нужно?
Adam Smith писал(а):После закрытия сокета создаю новый байт-массив под считанное кол-во байт, собираю в него скачанный "массив" байт-массивов.
Private Type ArrArr
ArrLenght As Long
BytesArr() As Byte
End Type
Private RecBytes() As ArrArr
-------------
dim lShift as long
dim lChunk as long
dim Received as string
MaxChunk = кол-во принятых байт-массивов
MaxBytes = кол-во принятых байт
ReDim ByteData(MaxBytes)
Received = StrConv(RecBytes(0).BytesArr, vbUnicode)
MsgBox Received, , Received Like "*Transfer-Encoding: chunked*"
For lChunk = 0 To MaxChunk
RtlMoveMemory ByteData(lShift), RecBytes(lChunk).BytesArr(0), RecBytes(lChunk).ArrLenght
lShift = lShift + RecBytes(lChunk).ArrLenght
Next
Received = StrConv(ByteData, vbUnicode)
lShift = InStr(Received, vbCrLf & vbCrLf)
Logging "Received chunks =" & Str$(MaxChunk) & vbTab & "Received bytes =" & Str$(MaxBytes) & vbTab & "Header bytes =" & Str$(lShift)
If lShift <= 0 Then
'Logging Received
Else
Logging Received
lShift = lShift + 4
Received = Right$(Received, Len(Received) - lShift)
'Logging Received
Dim html As Object
Dim tmpElem As HTMLAreaElement
Set html = CreateObject("htmlfile")
'Logging "htmlfile = " & html.body.innerHTML
html.body.innerHTML = ByteData 'Received
Adam Smith писал(а):А иначе их не передать для парсинга
Private Type ArrArr
ArrLenght As Long
BytesArr() As Byte
End Type
Private RecBytes() As ArrArr 'полученные байт-массивы
Private NotParse As Boolean 'флаг отключения хоста
Private RecHeader As String 'заголовок ответа хоста
'эта процедура запрашивается по ходу синхронного скачивания
'и только после скачивания, по флагу она реально выполняется
Public Function Parse() As Boolean
If NotParse Then Exit Function Else Parse = True
Dim ByteData() As Byte 'полученный байт-массив
Dim lShift As Long 'смещение от начала массива
Dim lChunk As Long 'смещение от начала массива
Dim CurChunk As Long 'текущий индекс куска
Dim TmpStr1 As String
Dim TmpStr2 As String
Dim bChunked As Boolean 'флаг transfer-encoding: chunked
'если парсинг возможен, то преобразуем первый байт-массив в строку
TmpStr1 = StrConv(RecBytes(0).BytesArr, vbUnicode)
TmpStr1 = LCase$(TmpStr1) 'переводим в нижний регистр чтобы исключить варианты
'проверяем ответ хоста
TmpStr2 = "* 200 ok" & vbCrLf & "*"
'если 200 ok отсутствует, то проверяем альтернативный ответ
If Not TmpStr1 Like TmpStr2 Then TmpStr2 = "* 203 non-authoritative information" & vbCrLf & "*": MsgBox TmpStr2, , TmpStr1 Like TmpStr2
'если проверки не успешны, то прекращаем парсинг
If Not TmpStr1 Like TmpStr2 Then Exit Function
'если ответ положительный, то проверяем какое содержимое мы получили
TmpStr2 = "*" & vbCrLf & "content-type:*text/html*"
'если проверки не успешны, то прекращаем парсинг
If Not TmpStr1 Like TmpStr2 Then Exit Function
'если в ответе есть charset, то проверяем
If TmpStr1 Like TmpStr2 Then TmpStr2 = "*" & vbCrLf & "*charset=*" & vbCrLf & "*"
If TmpStr1 Like TmpStr2 Then
'проверяем utf-8
If TmpStr1 Like TmpStr2 Then TmpStr2 = "*" & vbCrLf & "*charset=utf-8*"
'если utf-8 отсутствует, то проверяем iso-8859-1
If Not TmpStr1 Like TmpStr2 Then TmpStr2 = "*" & vbCrLf & "*charset=iso-8859-1*" ': MsgBox TmpStr2, , TmpStr1 Like TmpStr2
'если проверки не успешны, то не факт, что содержимое будет читабельно, прекращаем парсинг
If Not TmpStr1 Like TmpStr2 Then Exit Function
End If
'определяем, что нужно делать с кусками
TmpStr2 = "*" & vbCrLf & "transfer-encoding: chunked" & vbCrLf & "*"
bChunked = TmpStr1 Like TmpStr2
MsgBox "Chunked " & CStr(bChunked)
'запоминаем заголовок ответа
TmpStr1 = StrConv(RecBytes(0).BytesArr, vbUnicode)
lChunk = FindShift(0, RecBytes(0).BytesArr)
RecHeader = Left$(TmpStr1, lChunk)
MsgBox "|" & RecHeader & "|"
If bChunked Then
'ищем четверку 0D 0A 0D 0A и присваиваем это смещение переменной lChunk
Else
ReDim ByteData(MaxBytes)
For CurChunk = 0 To MaxChunk
With RecBytes(CurChunk)
RtlMoveMemory ByteData(lShift), .BytesArr(0), .ArrLenght
lShift = lShift + .ArrLenght
End With
Next
End If
дальше код поиска и забивания нулями заголовков с размерами chunks
Adam Smith писал(а):это должно бы происходить на первом же байте (но иногда сервера гадят парами 0D 0A), я собираю дальше пока не дойду до пары 0D 0A
Adam Smith писал(а):vbUnicode
Adam Smith писал(а):TmpStr2 = "* 200 ok" & vbCrLf & "*"
Adam Smith писал(а):
- Код: Выделить всё
Open "!!.tmp" For Output As #1
Print #1, StrConv(ByteData, vbUnicode)
Close #1
Adam Smith писал(а):IF принят 1й байт-массив, то:
Преобразую его в строчную, временную строку и проверяю на наличие "* 200 ok" & vbCrLf & "*", тут возможно буду отслеживать редирект.
умеет принять входные данные по кускам.MSHTML в черновике внизу CreateObject("htmlfile")
А как правильно? Ты не веришь, что сервера нарушают стандарт? Так это код и есть, что-же в нём не то?Qwertiy писал(а):Так делать неправильно. И не верю, что сервера могут так поступать. Скорее в твоём коде что-то не то.
В rfc2616 умники понапишут всякое, ну тебе виднее конечно. И главное, ты вдруг уверовал, что сервера таки могут нарушить стандарт! Ну это уже прогресс))Qwertiy писал(а):Надо код проверять, там текст не обязан быть OK.
О чём этот вопрос? Что такое Unicode или что такое vbUnicode? Или это был саркастический намёк, что конвертировать байт-массив в строку не надо? Определись как-то, чтолеQwertiy писал(а):Какой ещё Unicode?
Это очевидно. Затем, чтобы открыть файл хэкс-редактором и убедится, что моё представление о действиях моего кода с байт-массивом правильное. Для начальных тестов я выбрал 4 разных сервера из этого своего шортлистаQwertiy писал(а):Зачем? о_ОAdam Smith писал(а):
- Код: Выделить всё
Open "!!.tmp" For Output As #1
Print #1, StrConv(ByteData, vbUnicode)
Close #1
В философские теоремы укладывается огромное разнообразие даже самых плохих решений, но тут похоже идёт сравнение с неким конкретным, хотя и бесконечно далеким светычем истины))Хакер писал(а):Это всё бесконечно далеко от того, как это должно быть. Да и напомню ещё раз, что склеивать всё в один большой кусок вообще не нужно и вредно. Хотя точно не помню, но практически уверен, что MSHTML умеет принять входные данные по кускам.
Adam Smith писал(а):Это очевидно. Затем, чтобы открыть файл хэкс-редактором и убедится, что моё представление о действиях моего кода с байт-массивом правильное. Для начальных тестов я выбрал 4 разных сервера из этого своего шортлиста
Adam Smith писал(а):Прошу показать пример на vb6, который передаёт массив байт-массивов (или как-то иначе) в MSHTML (объект созданный CreateObject("htmlfile")) без всяких вредных слияний и преобразований. Думаю, такого не найдётся))
Естественно это мусор для отладки и это было очевидно.Хакер писал(а):Это не очевидно. Это адский трешак.
Я в курсе, но в файле разницы нет НИКАКОЙ, поэтому меньше букаф.Хакер писал(а):Можно просто записать байт-массив в файл без всяких конвертаций в строку.
Понимаю, что время не появится никогда и это мешает моей искренней вере)))Хакер писал(а):Ну как время появится, так попробую.
Adam Smith писал(а):Естественно это мусор для отладки и это было очевидно.
Adam Smith писал(а):Я в курсе, но в файле разницы нет НИКАКОЙ, поэтому меньше букаф.
Adam Smith писал(а):Неужели не к чему придраться кроме этого уродливого, отладочного мусора?
Adam Smith писал(а):Ты не веришь, что сервера нарушают стандарт?
Adam Smith писал(а):В rfc2616 умники понапишут всякое, ну тебе виднее конечно. И главное, ты вдруг уверовал, что сервера таки могут нарушить стандарт! Ну это уже прогресс))
Adam Smith писал(а):О чём этот вопрос? Что такое Unicode или что такое vbUnicode?
Adam Smith писал(а):конвертировать байт-массив в строку не надо?
Adam Smith писал(а):Хакер хоть честно ответил, не читал вообще.
Adam Smith писал(а):Наверное в идеальном мире живёшь. Завидую.
Бывали у людей и такие случаи, но это хардкор конечно, исправлять косяки серверов я не собираюсь.Qwertiy писал(а):Если нарушение приводит к невозможности однозначно восстановить данные, то не верю.
Прям серьезно имелось ввиду то, что новые rfc заменяют старые? Типа заявления, что весь интернет давно в работе использует черновик бинарного протокола HTTP/2?Qwertiy писал(а):Покажи место в rfc, где говорится, что текст статуса не может быть изменён. Что-то у меня этот момент вызывает сомнения.
Ааа, ну да, это ведь неправильные пчёлы, а значит они делают неправильный мёд. А что ещё тебе кажется? Расскажи, это прикольноQwertiy писал(а):Как минимум, что ты там распознаёшь заголовок с кодировкой, а потом ать и не используешь его.
Да и вообще, кажется, это неправильное конвертирование...
И опять, эти грабли нам так нравятся, давайте наступим на них ещё разок, ну и ещё, ну и, ладно, предпоследний раз, перед пред-предпоследним разом.Qwertiy писал(а):Да. Но это говорилось в следующей цитате. Чтобы сохранить в файл, не надо превращать в строку.
Если только это для проверки преобразования в строку, но тогда не ясно, зачем в файл записывать...
Нравится мне или нет не имеет отношения к тому, что коммент цитат пишется не для развития темы, не для пользы, а просто потому, что хочется что-то...Qwertiy писал(а):А я читал. И прокомментировал. Но тебе не понравилось...
Причём тут дотнэт? Где я говорил, что ты не представляешь себе, что такое chunked? Тут только я скатываюсь в оффтоп, нет?Qwertiy писал(а):.NET умеет разбирать http сам. Вот сжатие не прикручивал только, но для него тоже что-то готовое есть.Adam Smith писал(а):Наверное в идеальном мире живёшь. Завидую.
Но что из себя представляет chunked я в курсе.
html.open
html.write ByteData
html.Close
значит всё таки нужно конвертироватьU????•????†????•???†????†????†????‰????•???†????†????†????•???†????†????†????•???†????†????•???†????†????†????•???†????†????†????‰????
Adam Smith писал(а):Прям серьезно имелось ввиду то, что новые rfc заменяют старые?
Adam Smith писал(а):Я всё таки собираю всё в общий байт-массив и даже передаю его в MSHTMLНо в html.body.innerHTML оказывается полная ахинея
- Код: Выделить всё
html.open
html.write ByteData
html.Closeзначит всё таки нужно конвертироватьU????•????†????•???†????†????†????‰????•???†????†????†????•???†????†????†????•???†????†????•???†????†????†????•???†????†????†????‰????
Adam Smith писал(а):. Для этого мне придется лезть внутрь VB, а этого я не хочу.
Adam Smith писал(а):2. Не возникло. Это не спасает от конвертирования и уверен, это не спасет от заголовков кусков.
Adam Smith писал(а):Конечно я попробовал бы, если бы упомянутая объектная модель показала мне, что ты был прав, а не кучу вопросительных знаков.
Adam Smith писал(а):А отслеживать и затирать заголовки кусков оказывается проще в пределах общего байт-массива.
Adam Smith писал(а):Ссылка буксует, да и не мастер я в английском.
Do
lShift = lShift + 1
Loop While lShift + 4 < MaxBytes And RecBytes(0).BytesArr(lShift) <> 32
If lShift + 4 < MaxBytes Then
If Not (RecBytes(0).BytesArr(lShift) = 32 And _
RecBytes(0).BytesArr(lShift + 1) = 50 And _
RecBytes(0).BytesArr(lShift + 2) = 48 And _
RecBytes(0).BytesArr(lShift + 3) = 48 And _
RecBytes(0).BytesArr(lShift + 4) = 32) Then _
If Not (RecBytes(0).BytesArr(lShift) = 32 And _
RecBytes(0).BytesArr(lShift + 1) = 50 And _
RecBytes(0).BytesArr(lShift + 2) = 48 And _
RecBytes(0).BytesArr(lShift + 3) = 51 And _
RecBytes(0).BytesArr(lShift + 4) = 32) Then Exit Function
Else
Exit Function
End If
MsgBox "OK"
Adam Smith писал(а):что в части получения с HTTP-сервера списка ссылок на файлы кодировка не важна
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 82