Akop Akopov
Akop Akopov

Reputation: 85

Python: How to get HTTP header using RAW_Sockets

I'm beginner in Python and I would like to build simple port sniffer. For this purpose I'm using code from this site, as example: Simple packege snffer using python And I would like to unpack bites from socket to exctract http header, using function struct.unpack()

What format of string should I use in unpack HTTP header, (e.g '!BBH', "!BBHHHBBH4s4s",'!HHLLBBHHH')

Upvotes: 0

Views: 484

Answers (1)

EmilioPeJu
EmilioPeJu

Reputation: 406

the HTTP header is not fixed-length, so you'll need to parse it other way, for example:

import logging
log = logging.getLogger(__name__)


def parse_http(data):
        lines = data.split(b'\r\n')
        if len(lines) < 1:
            log.error('Invalid http header: %s', lines)
            return
        request = lines[0]
        header = {}
        rest = []
        in_header = True

        for line in lines[1:]:
            if line == b'':
                in_header = False
                continue
            if in_header:
                try:
                    key, val = line.split(b': ')
                except ValueError:
                    log.error('Invalid header line: %s', line)
                    continue
                header[key] = val
            else:
                rest.append(line)

        return request, header, b'\r\n'.join(rest)

In order to detect a HTTP packet, you could check if the payload starts with POST, GET, HTTP ... etc

Upvotes: 3

Related Questions