---
name: "HTTP::Proxy::BodyFilter::htmlparser"
section: "3pm"
platform: "linux"
package: "libhttp-proxy-perl"
version: "0.304-5"
release: "Debian 13 (Trixie)"
platforms: ["linux"]
url: "https://new.carta.tech/HTTP::Proxy::BodyFilter::htmlparser"
---

# HTTP::Proxy::BodyFilter::htmlparser(3pm)

Filter using HTML::Parser

## NAME

HTTP::Proxy::BodyFilter::htmlparser - Filter using HTML::Parser

## SYNOPSIS

```
    use HTTP::Proxy::BodyFilter::htmlparser;
    # $parser is a HTML::Parser object
    $proxy->push_filter(
        mime     => 'text/html',
        response => HTTP::Proxy::BodyFilter::htmlparser->new( $parser );
    );
```

## DESCRIPTION

The HTTP::Proxy::BodyFilter::htmlparser lets you create a filter based on the HTML::Parser object of your choice.

This filter takes a HTML::Parser object as an argument to its constructor. The filter is either read-only or read-write. A read-only filter will not allow you to change the data on the fly. If you request a read-write filter, you'll have to rewrite the response-body completely.

With a read-write filter, you **must** recreate the whole body data. This is mainly due to the fact that the HTML::Parser has its own buffering system, and that there is no easy way to correlate the data that triggered the HTML::Parser event and its original position in the chunk sent by the origin server. See below for details.

Note that a simple filter that modify the HTML text (not the tags) can be created more easily with HTTP::Proxy::BodyFilter::htmltext.

### Creating a HTML::Parser that rewrites pages

A read-write filter is declared by passing `"rw => 1"` to the constructor:

```
     HTTP::Proxy::BodyFilter::htmlparser->new( $parser, rw => 1 );
```

To be able to modify the body of a message, a filter created with HTTP::Proxy::BodyFilter::htmlparser must rewrite it completely. The HTML::Parser object can update a special attribute named `"output"`. To do so, the HTML::Parser handler will have to request the `"self"` attribute (that is to say, require access to the parser itself) and update its `"output"` key.

The following attributes are added to the HTML::Parser object by this filter:

- output

  A string that will hold the data sent back by the proxy.

  This string will be used as a replacement for the body data only if the filter is read-write, that is to say, if it was initialised with `"rw => 1"`.

  Data should always be **appended** to `"$parser->{output}"`.

- message

  A reference to the HTTP::Message that triggered the filter.

- protocol

  A reference to the HTTP::Protocol object.

## METHODS

This filter defines three methods, called automatically:

- **filter()**

  The `"filter()"` method handles all the interactions with the HTML::Parser object.

- **init()**

  Initialise the filter with the HTML::Parser object passed to the constructor.

- **will\_modify()**

  This method returns a boolean value that indicates to the system if it will modify the data passing through. The value is actually the value of the `"rw"` parameter passed to the constructor.

## SEE ALSO

HTTP::Proxy, HTTP::Proxy::Bodyfilter, HTTP::Proxy::BodyFilter::htmltext.

## AUTHOR

Philippe "BooK" Bruhat, \<book@cpan.org\>.

## COPYRIGHT

Copyright 2003-2015, Philippe Bruhat.

## LICENSE

This module is free software; you can redistribute it or modify it under the same terms as Perl itself.
