I'm saying that if you need to change HTTP headers, you don't need to do an HTTP::collect and handle in HTTP_RESPONSE_DATA. The headers will be available in the HTTP_RESPONSE event. You would do an HTTP::collect if you're trying to replace text in the response payload (after the headers).
But I see maybe you're trying to replace headers AND payload. Again, headers are visible in HTTP_RESPONSE, so change those there. For the payload, without testing I'm assuming there's just something incorrect about your string replace logic. The following works for me to replace the ending "}}}}":
when HTTP_REQUEST {
set doWrite 0
if { [string tolower [HTTP::path]] eq "/website/generate3dview.wcr" } {
set doWrite 1
}
}
when HTTP_RESPONSE {
if { ( [info exists doWrite] ) and ( $doWrite ) } {
HTTP::collect [HTTP::header Content-Length]
set clen [HTTP::header Content-Length]
set doWrite 0
}
}
when HTTP_RESPONSE_DATA {
set payload [string map [list "\}\}\}\}" "\}\}"] [HTTP::payload]]
HTTP::payload replace 0 $clen $payload
HTTP::release
}