Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности

Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
05.07.2014, 17:33
|
|||
|---|---|---|---|
Распаковка gzip ответа Http сервера на лету c++ Builder6 |
|||
|
#18+
День добрый. Долго гуглил, но результата особо никакого, благодаря архивы gzip - распаковка сжатого файла распаковка файла при помощи zlib получилась, но интересует не файл переданный в функцию, а ответ сервера например в виде TMemoryStream . Нашел решение но на Delphi Используем GZip в Synapse . Там есть модуль в котором описаны функции как раз решающие мою задачу. Меня временно бы устроило если бы сервер всегда слал не сжатые данные. Но почему-то не получается сказать серверу что мне нужны не сжатые данные. Тестировал программу на разных ПК, с каких-то ответ приходит сжатый, с каких-то нет, с чем связано не понятно. Кто сталкивался с подобными задачами что можете посоветовать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
05.07.2014, 17:41
|
|||
|---|---|---|---|
Распаковка gzip ответа Http сервера на лету c++ Builder6 |
|||
|
#18+
Кстати пробовал ещё функцию описанную здесь приспособить, для своих нужд, но безрезультатно, хотя ошибок никаких не возникало, на выходе 0. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
05.07.2014, 18:04
|
|||
|---|---|---|---|
|
|||
Распаковка gzip ответа Http сервера на лету c++ Builder6 |
|||
|
#18+
yura-007распаковка файла при помощи zlib получилась Вообще-то zlib работает с буферами в памяти. Как ты ей умудрился скормить файл - непонятно. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
05.07.2014, 18:36
|
|||
|---|---|---|---|
Распаковка gzip ответа Http сервера на лету c++ Builder6 |
|||
|
#18+
Я видимо плохо понимаю как это работает, но: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. len = gzread ( gfile , cb, KILOB); тогда как в это gzFile gfile загрузить не файл, а буфер в памяти? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
05.07.2014, 18:40
|
|||
|---|---|---|---|
|
|||
Распаковка gzip ответа Http сервера на лету c++ Builder6 |
|||
|
#18+
yura-007тогда как в это gzFile gfile загрузить не файл, а буфер в памяти? В одном клике от тобой же приведённой главной страницы zlib находится и подробно расписанный пример и полная документация . Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
06.07.2014, 01:09
|
|||
|---|---|---|---|
Распаковка gzip ответа Http сервера на лету c++ Builder6 |
|||
|
#18+
Спасибо, пример действительно пригодился, не заметил. В общем после долгих танцев с бубном, слепил функцию, она конечно далека от идеала, т.к. я практически полный NULL в Builder'е, но тем не менее делает почти то что требуется: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. тестирую так, сторонним архиватором сделал архив README.gz и: Код: plaintext 1. 2. 3. 4. 5. Но задача разархивировать ответ от сервера и тут скорей всего тоже не все так просто, если я правильно понимаю нужно будет извлечь именно сжатую часть, удалив заголовок и TMemoryStream'ом передать в функцию. Любые комментарии, замечания, баги в функции приветствуются! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
06.07.2014, 06:32
|
|||
|---|---|---|---|
|
|||
Распаковка gzip ответа Http сервера на лету c++ Builder6 |
|||
|
#18+
Ответ http-сервера упакован, если это указано в заголовке Content-Encoding. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
06.07.2014, 18:38
|
|||
|---|---|---|---|
Распаковка gzip ответа Http сервера на лету c++ Builder6 |
|||
|
#18+
Basil A. Sidorov, Может я что-то делал не так, пробовал разные варианты, сейчас данный участок кода выглядит так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Протокол поставил 1.0, вычитал что с ним тоже сжиматься не должно, но тем не менее на одном ПК не сжимается, на другом сжимается. Нужно будет снифером проверить отличаются ли заголовки. Когда я такую же программу писал на С#, то там у меня получилось сказать серверу вот так: Код: c# 1. 2. Даже если получится заставить сервер слать не запакованный ответ, это временное решение пока не научусь распаковывать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
07.07.2014, 09:41
|
|||
|---|---|---|---|
Распаковка gzip ответа Http сервера на лету c++ Builder6 |
|||
|
#18+
Basil A. Sidorov, Заголовок запроса на ПК с Win7 32-bit: Код: xml 1. 2. 3. 4. 5. 6. 7. 8. команды в целях экономии места обрезал. Вот заголовок на другом ПК с Win XP 32-bit: Код: xml 1. 2. 3. 4. 5. 6. 7. 8. не смотря на то что Content-Length немного отличается, внешне один в один. А вот ответы от одного и того же сервера на этот запрос ПК Win7 32-bit: Код: xml 1. 2. 3. 4. 5. Win XP 32-bit: Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. Content-Encoding в запросе отсутствует, тем не менее сервер разным клиентам отвечает по разному. Передав в ранее опубликованную мной здесь функцию сжатый ответ, ничего расшифровать не получилось, капаю дальше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
07.07.2014, 10:52
|
|||
|---|---|---|---|
Распаковка gzip ответа Http сервера на лету c++ Builder6 |
|||
|
#18+
Прошу прощение, ранее был не точен, на С# что бы все работало нужно написать так: Код: c# 1. 2. В результате ответ от сервера все равно приходит запакованный(в снифере), зависит от ПК пославшего запрос, AutomaticDecompression распаковывает и уже в нормальном виде с ответом можно работать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
07.07.2014, 15:55
|
|||
|---|---|---|---|
Распаковка gzip ответа Http сервера на лету c++ Builder6 |
|||
|
#18+
Капнув глубже в спецификацию gzip , стало понятно что ничего не понятно. Чтоб хоть как-то понять структуру архива создал текстовый документ "1.txt", следующего содержания: "1", сжал его в gzip и посмотрел на полученный файл "1.gzip" в far manager'е (скрин прикрепил) [img=Структура gzipJPG.JPG] Если я правильно все понял, то благодаря спецификации, со структурой данного файла разобрался. Далее создал текстовый файл который заполнил сжатым ответом сервера, переименовал расширение на gz , в результате архив открывается 7зипом в таблице отображается 1 файл: Код: xml 1. 2. 3. 4. 5. 6. но при извлечении файла получаю ошибку "Ошибка в данных. Файл 2 испорчен". Подозреваю что CRC EACB9E24 и Размер не корректны. Хотя заголовок у данного архива в far'е похож на заголовок из спецификации. Собственно сжатое содержимое с которым экспериментировал: Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. В общем не понятно на правильном ли я пути, но капаю дальше. Подсказки приветствуются! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
07.07.2014, 22:35
|
|||
|---|---|---|---|
|
|||
Распаковка gzip ответа Http сервера на лету c++ Builder6 |
|||
|
#18+
Тип компрессора (gzip или deflate) указан в заголовке серверного ответа. Поэтому: 1. По заголовку серверного ответа выбираем распаковщик; 2. Если выбранный распаковщик вернул ошибку - реально битые данные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
08.07.2014, 09:29
|
|||
|---|---|---|---|
Распаковка gzip ответа Http сервера на лету c++ Builder6 |
|||
|
#18+
Basil A. SidorovТип компрессора (gzip или deflate) указан в заголовке серверного ответа. Поэтому: 1. По заголовку серверного ответа выбираем распаковщик; Так и делаю, условие отрабатывает как положено: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. но README.txt забивается в основном пробелами, т.к. в функции его размер задан константой. Пока не знаю как его сделать динамическим. Basil A. Sidorov2. Если выбранный распаковщик вернул ошибку - реально битые данные. Не исключено, т.к. я ковырял данные взятые из снифера копи пастом, хотя программа принявшая данные (на с# написанная) с ними отработала корректно. Сейчас попробую файл README_2.txt ковырнуть. И никогда раньше не пользовался, но наверняка есть программы для восстановления битых архивов, попробую найти такую и скормить ей ответ сервера, интересно что получится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
08.07.2014, 10:16
|
|||
|---|---|---|---|
Распаковка gzip ответа Http сервера на лету c++ Builder6 |
|||
|
#18+
Аллилуйя! Переименовав README_2.txt в README_2.gz, архиватор открыл архив и без ошибок извлекся файл без расширения README_2, открыв который блокнотом я увидел нормальный ответ http сервера. Осталось допилить функцию. Ситуация осложнена тем что на ПК, которому сервер отвечает архивом, не установлен Builder, приходится всячески извращаться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
08.07.2014, 11:44
|
|||
|---|---|---|---|
Распаковка gzip ответа Http сервера на лету c++ Builder6 |
|||
|
#18+
yura-007не установлен Builder, приходится всячески извращаться.чего там извращаться? собери комплект dll и bpl, необходимых твоей программе и подложи их рядом с exe. Делов то. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
08.07.2014, 12:46
|
|||
|---|---|---|---|
Распаковка gzip ответа Http сервера на лету c++ Builder6 |
|||
|
#18+
egorychyura-007не установлен Builder, приходится всячески извращаться.чего там извращаться? собери комплект dll и bpl, необходимых твоей программе и подложи их рядом с exe. Делов то. Расшифровать gzip тоже делов то, когда знаешь. А когда в данной среде работаешь пару недель, не понятно... Хорошо бы ссылку! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
08.07.2014, 16:40
|
|||
|---|---|---|---|
Распаковка gzip ответа Http сервера на лету c++ Builder6 |
|||
|
#18+
В общем в таком виде функция работает: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. требуется довести её до ума, чем и займусь в ближайшее время. Вызывается она у меня вот так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. и запакованный ответ от сервера распаковывается! Единственное, вызов функции в моей программе происходит в цикле и всегда на 15-й итерации catch выдает access violation. но это уже другая история. Спасибо всем кто пытался помочь, тема закрыта. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=57&mobile=1&tid=2019383]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
69ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
| others: | 11ms |
| total: | 170ms |

| 0 / 0 |
