I’m using a a script to inject a <script> tag at the end of the <head> section of the response, and this works fine:
test_tag = b'<script src="test-fakeurl.js"></script></head>'
flow.response.content = flow.response.content.replace(b"</head>", test_tag)
I would like the option to do this replacement only the first time that the </head> match is found on the page, because otherwise the script will be injected into frames/iframes too, if they also have <head> sections. Initially, I tired using the optional count parameter for str.replace:
flow.response.content = flow.response.content.replace(b"</head>", test_tag, 1)
This does not work; all matches are still replaced. I then found closed ticket #1495 for this, where someone else confirms this doesn’t work. So I tried re.sub, which also has a count option:
flow.response.content = re.sub(b"</head>", test_tag, flow.response.content, count=1, flags=re.IGNORECASE)
Again, this doesn’t work. I’m wondering if each frame/iframe is actually being treated as a separate flow? If that’s the case, any ideas on how I could limit a replace operation to just the first <head> section?
Thanks!