LINUX.ORG.RU

Not a gzipped file

 , ,


0

1

Используя scapy (2.2.0-9) и python (2.7.7) пытаюсь распарсить gzipнутые респонзы. Такой код не работает, выдает Not a gzipped file:

#!/usr/bin/env python
# coding: utf-8

...
        s = findall(r"(\\x1f\\x8b.*?\\x00\\x00)\\r\\n0", prev_body)[0]
        gzip.GzipFile(fileobj = StringIO.StringIO(s)).read()

А вот такой вполне себе выдает то, что нужно:

#! /usr/bin/env python
# -*- coding: utf-8 -*-
import gzip
import StringIO

s = '\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03\xd5Y\xdbn' + ... + '\xc2\x1f\x00\x00'
print gzip.GzipFile(fileobj = StringIO.StringIO(s)).read()
s в обоих случаях один и тот же, но во втором я его задаю явно, а в первом получаю с помощью findall.


r"(\\x

И как по-твоему hex-последовательности будут передаваться в re-движок?

anonymous
()

s в обоих случаях один и тот же, но во втором я его задаю явно, а в первом получаю с помощью findall.

Скорей всего вот это утверждение неверно.

provaton ★★★★★
()
Ответ на: комментарий от provaton

Да, вероятнее всего, но в чем конкретно причина может быть ?

И как по-твоему hex-последовательности будут передаваться в re-движок?

А как они должны передаваться ? Если это <class 'str'>, то почему оно должно чем-то отличаться от, например строки 'asdasd' ?

Samu
() автор топика
Ответ на: комментарий от anonymous

// Чуть более «дружелюбный» намек: list(r"\\t") = ['\\','\\','t'], re преобразует (внуренний «парсинг» строки) в два ['\\','t'], он бы нашел в "".join(последний список), но не '\t'.

anonymous
()
Ответ на: комментарий от anonymous

А это ничего, что если после findall вывести print-ом s, то получится то же самое, что и во втором скрипте ?

        s = findall(r"(\\x1f\\x8b.*?\\x00\\x00)\\r\\n0", prev_body)[0]
        print type(s)
        print s
s = '\x1f\x8b ...'
print type(s)
print s
Выводят одно и то же.

Samu
() автор топика

#!/usr/bin/pythonURL = 'checkgzipcompression.com'def test1(): import urllib2 response = urllib2.urlopen("http://%s/" % URL) return response.read()def test2(): import socket remote_ip = socket.gethostbyname( URL ) s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((remote_ip, 80)) s.send('GET / HTTP/1.0\r\n') s.send('Host: %s\r\n' % URL) s.send('Accept-Encoding: gzip, deflate\r\n') s.send('\r\n') data = "" while True: chunk = s.recv(4096) if not chunk: break data += chunk s.close() pos = data.index('\r\n\r\n') data = data[pos+4:] open('test2.gzip', 'w').write(data) import zlib return zlib.decompress(data, 16+zlib.MAX_WBITS)open('test1.html','wb').write(test1()) open('test2.html','wb').write(test2())

anonymous
()
Ответ на: комментарий от anonymous
#!/usr/bin/python

URL = 'checkgzipcompression.com'

def test1():
  import urllib2
  response = urllib2.urlopen("http://%s/" % URL)
  return response.read()

def test2():
  import socket

  remote_ip = socket.gethostbyname( URL )

  s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  s.connect((remote_ip, 80))
  s.send('GET / HTTP/1.0\r\n')
  s.send('Host: %s\r\n' % URL)
  s.send('Accept-Encoding: gzip, deflate\r\n')
  s.send('\r\n')

  data = ""
  while True:
    chunk = s.recv(4096)
    if not chunk:
      break
    data += chunk
  s.close()

  pos = data.index('\r\n\r\n')
  data = data[pos+4:]
  open('test2.gzip', 'w').write(data)

  import zlib
  return zlib.decompress(data, 16+zlib.MAX_WBITS)

open('test1.html','wb').write(test1())
open('test2.html','wb').write(test2())
anonymous
()
Ответ на: комментарий от Samu

Выводят одно и то же.

Даже если прямо приравнять будет True? Есть сомнения в чистоте экперимента, а есть минимальный (не)рабочий пример?

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.