Утилита синхронизации файлов с HTTP в локальную папку

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16475
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Утилита синхронизации файлов с HTTP в локальную папку

Сообщение Хакер » 24.12.2015 (Чт) 18:51

Adam Smith писал(а):После закрытия сокета создаю новый байт-массив под считанное кол-во байт, собираю в него скачанный "массив" байт-массивов.

На кой чёрт это нужно?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Adam Smith
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 219
Зарегистрирован: 25.04.2008 (Пт) 9:04
Откуда: ЧР. Грозный

Re: Утилита синхронизации файлов с HTTP в локальную папку

Сообщение Adam Smith » 24.12.2015 (Чт) 20:47

А иначе их не передать для парсинга. Сейчас как раз в разработке:
Код: Выделить всё
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

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16475
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Утилита синхронизации файлов с HTTP в локальную папку

Сообщение Хакер » 24.12.2015 (Чт) 21:48

Adam Smith писал(а):А иначе их не передать для парсинга

Чем парсишь?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Adam Smith
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 219
Зарегистрирован: 25.04.2008 (Пт) 9:04
Откуда: ЧР. Грозный

Re: Утилита синхронизации файлов с HTTP в локальную папку

Сообщение Adam Smith » 24.12.2015 (Чт) 22:20

MSHTML в черновике внизу CreateObject("htmlfile")

Это просто охренеть как сильно на разных серверах отличается Transfer-Encoding: chunked.
Вроде есть размер куска и искать нужно сразу после него, но один сервер лепит туда перенос строки, а другой нет.

Adam Smith
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 219
Зарегистрирован: 25.04.2008 (Пт) 9:04
Откуда: ЧР. Грозный

Re: Утилита синхронизации файлов с HTTP в локальную папку

Сообщение Adam Smith » 26.12.2015 (Сб) 18:48

Неправильно организовал и у меня получается лишнее копирование большого байт-массива. нужно резать chunks на этапе закачки.
Заранее извиняюсь, нижеследующая смесь может вызвать приступ батхэрта. Думаю переделать вот так
Dim arrBuffer(0 To 8191) As Byte. Принял текущий байт-массив (arrBuffer), переменную MaxBytes увеличил на reBytes (кол-во принятых байт).
IF принят 1й байт-массив, то:
Преобразую его в строчную, временную строку и проверяю на наличие "* 200 ok" & vbCrLf & "*", тут возможно буду отслеживать редирект.
Флаг Chunked ("куски") приравниваю к наличию в строке "*" & vbCrLf & "transfer-encoding: chunked" & vbCrLf & "*"
Если флага нет, то понятное дело можно работать по старинке, как по HTTP/1.0. Иначе отслеживаю куски и вырезаю их заголовки.
1й байт-массив это заголовок ответа и начало первого куска. Ищу четверку 0D 0A 0D 0A и присваиваю это смещение переменной LShift.
End IF

Теперь действия для каждого байт-массива в т.ч. и 1го:
IF Chunked
Если LShift не равно нулю, то увеличиваю LShift и собираю байты во временную строку сначала пока не дойду до байта неравного 0D и 0A,
это должно бы происходить на первом же байте (но иногда сервера гадят парами 0D 0A), я собираю дальше пока не дойду до пары 0D 0A
теперь заголовок куска во временной строке, от текущего байта смещаюсь ещё пока не дойду до байта неравного 0D или 0A, это кусок.
End IF

Очередной элемент "массива" байт-массивов делаю размером reBytes - LShift (который должен бы указывать на начало чистого куска)
Копирую байт-массив в элемент "массива" байт-массивов RtlMoveMemory RecBytes(CurChunk).BytesArr(0), arrBuffer(LShift), reBytes - LShift

Пропущены некоторые моменты типа корректировки MaxBytes. Объяснил как смог, а смог штука неприятная.
Есть конкретный вопрос, сработает ли RtlMoveMemory RecBytes(CurChunk).BytesArr(0), arrBuffer(LShift), reBytes - LShift с нужного мне байта?

Adam Smith
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 219
Зарегистрирован: 25.04.2008 (Пт) 9:04
Откуда: ЧР. Грозный

Re: Утилита синхронизации файлов с HTTP в локальную папку

Сообщение Adam Smith » 27.12.2015 (Вс) 2:12

Всё таки это всё полная ахинея, проще скачивать как есть, а с кусками разбираться потом,
после закрытия сокета. Например на этапе копирования всех байт-массивов в общий байт-массив.
И контролировать ответ сервера 200 ОК и возвращаемый charset тоже имеет смысл только после закрытия.

Adam Smith
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 219
Зарегистрирован: 25.04.2008 (Пт) 9:04
Откуда: ЧР. Грозный

Re: Утилита синхронизации файлов с HTTP в локальную папку

Сообщение Adam Smith » 28.12.2015 (Пн) 16:32

Первым в процедуре Parse выполняется объявление переменных не смотря на то, что я поставил вначале условие? И что в этом коде вообще неприемлемо и нужно изменить?
Код: Выделить всё
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 31.12.2015 (Чт) 13:30, всего редактировалось 1 раз.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 29.12.2015 (Вт) 0:07

Adam Smith писал(а):это должно бы происходить на первом же байте (но иногда сервера гадят парами 0D 0A), я собираю дальше пока не дойду до пары 0D 0A

Так делать неправильно. И не верю, что сервера могут так поступать. Скорее в твоём коде что-то не то.

Adam Smith писал(а):vbUnicode

Какой ещё Unicode? :shock:

Adam Smith писал(а):TmpStr2 = "* 200 ok" & vbCrLf & "*"

Надо код проверять, там текст не обязан быть OK.

Adam Smith писал(а):
Код: Выделить всё
Open "!!.tmp" For Output As #1
  Print #1, StrConv(ByteData, vbUnicode)
Close #1

Зачем? о_О

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16475
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Утилита синхронизации файлов с HTTP в локальную папку

Сообщение Хакер » 29.12.2015 (Вт) 1:10

Adam Smith писал(а):IF принят 1й байт-массив, то:
Преобразую его в строчную, временную строку и проверяю на наличие "* 200 ok" & vbCrLf & "*", тут возможно буду отслеживать редирект.

Лажа.

Код я даже не смотрел, потому что боюсь ко мне в 4 утра скорая не успеет приехать.

Это всё бесконечно далеко от того, как это должно быть. Да и напомню ещё раз, что склеивать всё в один большой кусок вообще не нужно и вредно. Хотя точно не помню, но практически уверен, что
MSHTML в черновике внизу CreateObject("htmlfile")
умеет принять входные данные по кускам.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Adam Smith
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 219
Зарегистрирован: 25.04.2008 (Пт) 9:04
Откуда: ЧР. Грозный

Re: Утилита синхронизации файлов с HTTP в локальную папку

Сообщение Adam Smith » 29.12.2015 (Вт) 11:16

Qwertiy писал(а):Так делать неправильно. И не верю, что сервера могут так поступать. Скорее в твоём коде что-то не то.
А как правильно? Ты не веришь, что сервера нарушают стандарт? Так это код и есть, что-же в нём не то?
Qwertiy писал(а):Надо код проверять, там текст не обязан быть OK.
В rfc2616 умники понапишут всякое, ну тебе виднее конечно. И главное, ты вдруг уверовал, что сервера таки могут нарушить стандарт! Ну это уже прогресс))
Qwertiy писал(а):Какой ещё Unicode? :shock:
О чём этот вопрос? Что такое Unicode или что такое vbUnicode? Или это был саркастический намёк, что конвертировать байт-массив в строку не надо? Определись как-то, чтоле
Qwertiy писал(а):
Adam Smith писал(а):
Код: Выделить всё
Open "!!.tmp" For Output As #1
  Print #1, StrConv(ByteData, vbUnicode)
Close #1
Зачем? о_О
Это очевидно. Затем, чтобы открыть файл хэкс-редактором и убедится, что моё представление о действиях моего кода с байт-массивом правильное. Для начальных тестов я выбрал 4 разных сервера из этого своего шортлиста
(не знаю, как сделать список раскрывающимся):
    dealer.telepayural.ru
    cp.unipay.ru
    tasks.pay-logic.ru
    tvquran.com
    smallchurchmusic.com
    1488.unknownsecret.info
    staff.ustc.edu.cn
    borchali.net
    dl3.5farskids.com
    l29ah.blasux.ru
    mhoerner.dyndns.org
    dl.smusic.ir
    alldjshere.com
    aurgasm.us
    listen77.com
    maslovd.no-ip.org
    tylergrund.com
    blackout.com
    lzcenter.com
    fmlatina.com.uy
    hypem.com
    hogomp3.angelfire.com
    jeffgreenbank.net
    dl.ahang-film.com
    epatha.com
    search.cl
    132.248.192.201
    sprott.physics.wisc.edu
Это я к тому, что мне было на что посмотреть и из чего делать выводы о поведении самых разных серверов.
Такие посты рождаются когда по сути сказать то нечего, а тяга плюнуть непреодолима. Хакер хоть честно ответил, не читал вообще.
Не представляю, как ты с такими психическими патологиями до этих лет то дожил. Наверное в идеальном мире живёшь. Завидую.
Хакер писал(а):Это всё бесконечно далеко от того, как это должно быть. Да и напомню ещё раз, что склеивать всё в один большой кусок вообще не нужно и вредно. Хотя точно не помню, но практически уверен, что MSHTML умеет принять входные данные по кускам.
В философские теоремы укладывается огромное разнообразие даже самых плохих решений, но тут похоже идёт сравнение с неким конкретным, хотя и бесконечно далеким светычем истины))
Прошу показать пример на vb6, который передаёт массив байт-массивов (или как-то иначе) в MSHTML (объект созданный CreateObject("htmlfile")) без всяких вредных слияний и преобразований. Думаю, такого не найдётся))

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16475
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Утилита синхронизации файлов с HTTP в локальную папку

Сообщение Хакер » 29.12.2015 (Вт) 12:25

Adam Smith писал(а):Это очевидно. Затем, чтобы открыть файл хэкс-редактором и убедится, что моё представление о действиях моего кода с байт-массивом правильное. Для начальных тестов я выбрал 4 разных сервера из этого своего шортлиста

Это не очевидно. Это адский трешак.

Можно просто записать байт-массив в файл без всяких конвертаций в строку.

Adam Smith писал(а):Прошу показать пример на vb6, который передаёт массив байт-массивов (или как-то иначе) в MSHTML (объект созданный CreateObject("htmlfile")) без всяких вредных слияний и преобразований. Думаю, такого не найдётся))

Ну как время появится, так попробую.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Adam Smith
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 219
Зарегистрирован: 25.04.2008 (Пт) 9:04
Откуда: ЧР. Грозный

Re: Утилита синхронизации файлов с HTTP в локальную папку

Сообщение Adam Smith » 29.12.2015 (Вт) 13:17

Хакер писал(а):Это не очевидно. Это адский трешак.
Естественно это мусор для отладки и это было очевидно.
Хакер писал(а):Можно просто записать байт-массив в файл без всяких конвертаций в строку.
Я в курсе, но в файле разницы нет НИКАКОЙ, поэтому меньше букаф.
Хакер писал(а):Ну как время появится, так попробую.
Понимаю, что время не появится никогда и это мешает моей искренней вере)))

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16475
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Утилита синхронизации файлов с HTTP в локальную папку

Сообщение Хакер » 29.12.2015 (Вт) 14:27

Adam Smith писал(а):Естественно это мусор для отладки и это было очевидно.

Мусор для отладки может быть красивым, а может быть поганым. У тебя второе?

Adam Smith писал(а):Я в курсе, но в файле разницы нет НИКАКОЙ, поэтому меньше букаф.

Где меньше буков?

Тупейшее Print #1, StrConv(ByteData, vbUnicode) это меньше букв, чем
правильное Put #1, , ByteData?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Adam Smith
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 219
Зарегистрирован: 25.04.2008 (Пт) 9:04
Откуда: ЧР. Грозный

Re: Утилита синхронизации файлов с HTTP в локальную папку

Сообщение Adam Smith » 29.12.2015 (Вт) 18:11

Никому не сметь упоминать тот факт, что для корректной бинарной записи нового файла нужно удалять старый! Это разрушит баланс вселенной!!! Хакер прав)))
Красивый мусор?! Вау, я запомню это выражение. Неужели не к чему придраться кроме этого уродливого, отладочного мусора? Ну знаете ли это комплимент :lol:

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16475
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Утилита синхронизации файлов с HTTP в локальную папку

Сообщение Хакер » 29.12.2015 (Вт) 19:28

Adam Smith писал(а):Неужели не к чему придраться кроме этого уродливого, отладочного мусора?

Я не читал его. Если окинуть его взглядом не вчитываясь, то уже видно, что это далеко от того, что должно быть.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 30.12.2015 (Ср) 1:54

Adam Smith писал(а):Ты не веришь, что сервера нарушают стандарт?

Если нарушение приводит к невозможности однозначно восстановить данные, то не верю.

Adam Smith писал(а):В rfc2616 умники понапишут всякое, ну тебе виднее конечно. И главное, ты вдруг уверовал, что сервера таки могут нарушить стандарт! Ну это уже прогресс))

Покажи место в rfc, где говорится, что текст статуса не может быть изменён. Что-то у меня этот момент вызывает сомнения.

Adam Smith писал(а):О чём этот вопрос? Что такое Unicode или что такое vbUnicode?

Как минимум, что ты там распознаёшь заголовок с кодировкой, а потом ать и не используешь его.
Да и вообще, кажется, это неправильное конвертирование...

Adam Smith писал(а):конвертировать байт-массив в строку не надо?

Да. Но это говорилось в следующей цитате. Чтобы сохранить в файл, не надо превращать в строку.
Если только это для проверки преобразования в строку, но тогда не ясно, зачем в файл записывать...

Adam Smith писал(а):Хакер хоть честно ответил, не читал вообще.

А я читал. И прокомментировал. Но тебе не понравилось...

Adam Smith писал(а):Наверное в идеальном мире живёшь. Завидую.

.NET умеет разбирать http сам. Вот сжатие не прикручивал только, но для него тоже что-то готовое есть.
Но что из себя представляет chunked я в курсе.

Adam Smith
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 219
Зарегистрирован: 25.04.2008 (Пт) 9:04
Откуда: ЧР. Грозный

Re:

Сообщение Adam Smith » 31.12.2015 (Чт) 13:28

Qwertiy писал(а):Если нарушение приводит к невозможности однозначно восстановить данные, то не верю.
Бывали у людей и такие случаи, но это хардкор конечно, исправлять косяки серверов я не собираюсь.
Qwertiy писал(а):Покажи место в rfc, где говорится, что текст статуса не может быть изменён. Что-то у меня этот момент вызывает сомнения.
Прям серьезно имелось ввиду то, что новые rfc заменяют старые? Типа заявления, что весь интернет давно в работе использует черновик бинарного протокола HTTP/2?
В содержании "10.2.1 200 OK" и в главе 10.2.1 буквально написано. Видите ли я ссылок не держу, есть гугл и бла бла бла. Но я допускаю, что возможно и без ОК.
Qwertiy писал(а):Как минимум, что ты там распознаёшь заголовок с кодировкой, а потом ать и не используешь его.
Да и вообще, кажется, это неправильное конвертирование...
Ааа, ну да, это ведь неправильные пчёлы, а значит они делают неправильный мёд. А что ещё тебе кажется? Расскажи, это прикольно :lol:
Ну правда, смахивает на пост под кайфом, в первой строке я как-то "распознаю" заголовок с кодировкой, а во второй уже отпустило и я всё же конвертирую.
Qwertiy писал(а):Да. Но это говорилось в следующей цитате. Чтобы сохранить в файл, не надо превращать в строку.
Если только это для проверки преобразования в строку, но тогда не ясно, зачем в файл записывать...
И опять, эти грабли нам так нравятся, давайте наступим на них ещё разок, ну и ещё, ну и, ладно, предпоследний раз, перед пред-предпоследним разом.
Мне жаль время потраченное вами на осуждение куска мусора, который оказался незакоментирован перед публикацией в тему, удаляю его оттуда.
Qwertiy писал(а):А я читал. И прокомментировал. Но тебе не понравилось...
Нравится мне или нет не имеет отношения к тому, что коммент цитат пишется не для развития темы, не для пользы, а просто потому, что хочется что-то...
Ну вот следующая цитата и коммент, в каком сознании они вдруг взаимосвязаны? Это написано Хакеру, в ответ на то, что его хватил бы удар от просмотра кода.
Qwertiy писал(а):
Adam Smith писал(а):Наверное в идеальном мире живёшь. Завидую.
.NET умеет разбирать http сам. Вот сжатие не прикручивал только, но для него тоже что-то готовое есть.
Но что из себя представляет chunked я в курсе.
Причём тут дотнэт? Где я говорил, что ты не представляешь себе, что такое chunked? Тут только я скатываюсь в оффтоп, нет?
Если не ради оффтопа, то на кой вообще это здесь? В общем, я так понял, на новый год писать трезвые посты не обязательно :lol:

Adam Smith
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 219
Зарегистрирован: 25.04.2008 (Пт) 9:04
Откуда: ЧР. Грозный

Re: Утилита синхронизации файлов с HTTP в локальную папку

Сообщение Adam Smith » 31.12.2015 (Чт) 13:34

Я всё таки собираю всё в общий байт-массив и даже передаю его в MSHTML
Код: Выделить всё
    html.open
    html.write ByteData
    html.Close
Но в html.body.innerHTML оказывается полная ахинея
U????•????†????•???†????†????†????‰????•???†????†????†????•???†????†????†????•???†????†????•???†????†????†????•???†????†????†????‰????
значит всё таки нужно конвертировать

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 31.12.2015 (Чт) 23:29

Adam Smith писал(а):Прям серьезно имелось ввиду то, что новые rfc заменяют старые?

Имелось в виду, что при наличии числа и дополнительного текста, надо проверять число.
А в том rfc и 302 Moved Temporarily нет.

Остальное комментировать даже желания нет.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16475
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Утилита синхронизации файлов с HTTP в локальную папку

Сообщение Хакер » 01.01.2016 (Пт) 0:46

Adam Smith писал(а):Я всё таки собираю всё в общий байт-массив и даже передаю его в MSHTML
Код: Выделить всё
    html.open
    html.write ByteData
    html.Close
Но в html.body.innerHTML оказывается полная ахинея
U????•????†????•???†????†????†????‰????•???†????†????†????•???†????†????†????•???†????†????•???†????†????†????•???†????†????†????‰????
значит всё таки нужно конвертировать


1) Это значит, что тебе нужно изучить, как конвертируется байт-массив в BSTR.
2) Ну и что, даже не возникло желания попробовать серией write-ов забабахать кусочки в объектную модель, вместо дурацкого склеивания кусочков в мега-кусок?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Adam Smith
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 219
Зарегистрирован: 25.04.2008 (Пт) 9:04
Откуда: ЧР. Грозный

Re: Утилита синхронизации файлов с HTTP в локальную папку

Сообщение Adam Smith » 01.01.2016 (Пт) 1:59

1. Для этого мне придется лезть внутрь VB, а этого я не хочу.
2. Не возникло. Это не спасает от конвертирования и уверен, это не спасет от заголовков кусков.

Конечно я попробовал бы, если бы упомянутая объектная модель показала мне, что ты был прав, а не кучу вопросительных знаков.
Есть стандартный способ конвертирования байт-массива, знаю я как он работает внутри или не знаю, но вы хором его похоронили.
С самими байт-массивами ничего сделать не удастся, их нужно будет конвертировать в строку и строку записывать в объект html.
И снова, при этом придется отслеживать заголовки кусков и удалять их, или хотя бы затирать чем-то вроде vbLf (&H0A) потому,
что MSHTML включает их в текст. А отслеживать и затирать заголовки кусков оказывается проще в пределах общего байт-массива.

Adam Smith
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 219
Зарегистрирован: 25.04.2008 (Пт) 9:04
Откуда: ЧР. Грозный

Re: Утилита синхронизации файлов с HTTP в локальную папку

Сообщение Adam Smith » 01.01.2016 (Пт) 2:17

Блин, ладно я не пью и не праздную НГ, но вы то чего? Народ идите праздновать :lol:

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16475
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Утилита синхронизации файлов с HTTP в локальную папку

Сообщение Хакер » 01.01.2016 (Пт) 2:18

Adam Smith писал(а):. Для этого мне придется лезть внутрь VB, а этого я не хочу.

Нет, для этого тебе надо почитать доку и поставить несколько экспериментов.

Adam Smith писал(а):2. Не возникло. Это не спасает от конвертирования и уверен, это не спасет от заголовков кусков.

Это не спасёт от конвертирования, но это спасёт при конвертировании, потому что конвертировать кучу маленьких кусочков проще, чем один гигантский.

Adam Smith писал(а):Конечно я попробовал бы, если бы упомянутая объектная модель показала мне, что ты был прав, а не кучу вопросительных знаков.

Это преподносится не как мера по избавлению от вопросиков. Как мера по избавлению от вопросиков тебе нужно читать это.

Adam Smith писал(а):А отслеживать и затирать заголовки кусков оказывается проще в пределах общего байт-массива.

При нормальном подходе не проще, а одинаково легко. То, что ты утверждаешь, что тебе проще, свидетельствует о том, что твой подход ненормален.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Adam Smith
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 219
Зарегистрирован: 25.04.2008 (Пт) 9:04
Откуда: ЧР. Грозный

Re: Утилита синхронизации файлов с HTTP в локальную папку

Сообщение Adam Smith » 01.01.2016 (Пт) 2:20

Ссылка буксует, да и не мастер я в английском.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16475
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Утилита синхронизации файлов с HTTP в локальную папку

Сообщение Хакер » 01.01.2016 (Пт) 2:21

Adam Smith писал(а):Ссылка буксует, да и не мастер я в английском.

Починится в будущем. Там статья локализованная (переведённая).
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Adam Smith
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 219
Зарегистрирован: 25.04.2008 (Пт) 9:04
Откуда: ЧР. Грозный

Re: Утилита синхронизации файлов с HTTP в локальную папку

Сообщение Adam Smith » 01.01.2016 (Пт) 2:26

Познавательно, хотя тема не раскрыта. Я знал про 2 байта на букву, ну выяснил про low-endian и что? Как это помогает при конвертировании байт-массивов?
Я и раньше успешно их конвертировал, может вы не поняли просто. Я не знаю, что принимает MSHTML и почему нормально не принял страницу на латинице.
low-endian в high-endian перекодировать надо было или что? Самому разрядить байт-массив нулевыми байтами, а не вызывать StrConv? Или API использовать?
Похоже на данном этапе вообще нет смысла морочиться с кодировкой потому, что HTML тэги в ASCII символах, из парсера я по-любому получу ссылки href,
а текстовые отображения названий файлов будут в charset'е страницы(сервера), в интерфейсной части буду мудохаться с юзерконтролами с Unicode.

Вообще, нельзя ли по-проще? С таким ОПЫТОМ тебе же понятно заранее, что в части получения с HTTP-сервера списка ссылок на файлы кодировка не важна.
Или я не прав? HTML тэги на ASCII, значит если в парсер передать полученное не искажая (я проверял, VB Unicode не искажает), то получишь нормальные URI.
Главное забить заголовки кусков служебными символами, которые парсер уничтожит, и вернет чистый текст названий файлов, а URI перекодировать не надо.

Кстати, если неправильно контролировать ответ сервера по содержимому конвертированной строки, то как правильно, так?
Код: Выделить всё
  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"

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 01.01.2016 (Пт) 14:57

Adam Smith писал(а):что в части получения с HTTP-сервера списка ссылок на файлы кодировка не важна

1. Для нахождения именно тегов, в большинстве случаев, не важна. Хотя формально это неверно, ведь кого-то может угораздить послать страницу в utf-16.
2. Для получения ссылок важна, поскольку ссылки могут содержать в адресе юникодные символы.

Adam Smith
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 219
Зарегистрирован: 25.04.2008 (Пт) 9:04
Откуда: ЧР. Грозный

Re: Утилита синхронизации файлов с HTTP в локальную папку

Сообщение Adam Smith » 01.01.2016 (Пт) 17:30

VB6 Unicode уничтожит данные в utf-16, я правильно понял меседж?
Ссылки чаще всего кроме адреса содержат ещё текст, отображаемое название.
Вот это название в utf-16 может пострадать при передаче его в парсер, при отсутствии тэга перед парсером мне придётся самому добавлять в html head тэг meta с указанием charset'а.
Я видел адреса с нац.алфавитом, но они кодируются специальным образом, пример сейчас не под рукой, но думаю все знают о чем я, видели наверняка не раз. Но я уже написал об этом, их нельзя перекодировать, их нужно передавать серверу в запросе как есть, неизменными, и всё будет ок.

Если кто непонял, зачем их снова передавать серверу, с которого они получены, уточняю.
По полученному списку снова будут коннекты и HEAD запросы, чтобы выяснить тип, размер и время файла.

Adam Smith
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 219
Зарегистрирован: 25.04.2008 (Пт) 9:04
Откуда: ЧР. Грозный

Re: Утилита синхронизации файлов с HTTP в локальную папку

Сообщение Adam Smith » 03.01.2016 (Вс) 2:39

Нет, что-то загнул с добавлением тэга <meta content="text/html; charset={Content-Type charset}" http-equiv="content-type">, этож нужно менять версию HTML.
Или правильная идея была и реализовать нужно было напрямую в лоб, как думаете?

Adam Smith
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 219
Зарегистрирован: 25.04.2008 (Пт) 9:04
Откуда: ЧР. Грозный

Re: Утилита синхронизации файлов с HTTP в локальную папку

Сообщение Adam Smith » 04.01.2016 (Пн) 0:34

Короче, на словах всё легко кажется, а на деле эти заголовки отследить и затереть оборачивается невозможным гемором. Вернусь я лучше к встроенному IE.

Пред.След.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3

    TopList