nginx Python:readline()直到hex 0D 0A 0D 0A(两个换行符+回车)出现

rkkpypqq  于 2023-08-03  发布在  Nginx
关注(0)|答案(1)|浏览(123)

我想读取NGINX缓存文件并提取“KEY:”和HTTP头。
我阅读了钥匙:通过在十六进制编辑器中分析几个nginx缓存文件来分析nginx缓存文件。我看到了钥匙:总是从0x00000150开始。下面是一个nginx缓存文件的截图:

的数据
我现在的代码是:

import os

def process_file(file_path):
    with open(file_path, 'r', encoding = "ISO-8859-1") as f:
        f.seek(0x00000150)    # skip nginx identification header
        key_magic = f.read(6)
        if key_magic != '\nKEY: ':
            raise ValueError('Not a cache file: ' + str(file_path))
        key = f.readline()[:-1]  

def main():
    nginx_cache_path = "/usr/share/nginx/cache/"

    for path, dirs, files in os.walk(nginx_cache_path):
        for file in files:
            process_file(path + '/' + file)

if __name__ == "__main__":
    main()

字符串
正如你所看到的,我读了整个KEY:readline()方法。
现在,我的下一个目标是读取该高速缓存文件的HTTP头。它们出现在KEY之后:以一个换行(0A)结束,并以两个换行+回车(0D 0A 0D 0A)结束。参见十六进制编辑器的屏幕截图:



我的目标:

  • 我想读的一切结束之间的关键:(0A之后的开始,如屏幕截图中所标记的)并且直到第一次出现两个“0D 0A”。两次“0D 0A”很重要,因为HTTP头本身就有“0D 0A”,但不是两次,每一个新行只有一次。我该怎么办?

到目前为止我所知道的:

  • 在KEY:的值之后,它执行一次换行符(0A)。
  • HTTP标头长度未知。
  • HTTP标头包含0D 0A几次,但在这种组合中总是只有一次,如(AA AA AA AA0D 0AAA AA AA ...),而不是两次。
  • 当HTTP头部分结束时,它以两个换行符+回车符结束。(0D 0A 0D 0A)。这就是我想停止阅读的地方。
ghg1uchk

ghg1uchk1#

如果你能把整个文件读入内存,你就能找到KEY的结束位置,然后使用find

end_position = hex_string.find(bytes.fromhex('0D0A0D0A'), key_end_position)

字符串
如果你不能把整个文件读到内存中,你就必须一步一步地读,无论你使用的缓冲区大小是多少,你都应该存储上一次读,上一次读和当前读,以避免在2次连续读中阅读到你要找的字符串而错过它。
这样行吗?我也不知道。

last_three = ['', '', '']
text_to_find = bytes.fromhex('0D0A0D0A')
found_position = 0
while True:
    chunk = f.read(4096)
    if not chunk:
        break
    
    current_file_position = f.tell()
    last_three.append(chunk)
    last_three = last_three[-3]
    text_to_search = last_three.join('')

    position = text_to_search.find(text_to_find)

    if position != -1:
        extra_length = len(last_three) - position + len(text_to_find)
        found_position = current_file_position - len(last_three)
        break

相关问题