我想读取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)。这就是我想停止阅读的地方。
1条答案
按热度按时间ghg1uchk1#
如果你能把整个文件读入内存,你就能找到KEY的结束位置,然后使用find
字符串
如果你不能把整个文件读到内存中,你就必须一步一步地读,无论你使用的缓冲区大小是多少,你都应该存储上一次读,上一次读和当前读,以避免在2次连续读中阅读到你要找的字符串而错过它。
这样行吗?我也不知道。
型