8 use Digest::MD5 qw(md5_hex);
9 use Data::Dump qw(dump);
12 my ($class, $host, $port, $options) = @_;
14 my $ua = LWP::UserAgent->new;
22 base_uri => "http://$host:$port/",
26 sub ua { shift->{ua} }
27 sub base { shift->{base_uri} }
30 my ($self, $method, $uri, $content) = @_;
32 my $full_uri = $self->base . $uri;
35 if (defined $content) {
36 #Content-Type: application/json
38 $req = HTTP::Request->new( $method, $full_uri, undef, encode_json $content );
39 $req->header('Content-Type' => 'application/json');
41 $req = HTTP::Request->new( $method, $full_uri );
44 my $response = $self->ua->request($req);
46 if ($response->is_success) {
47 return decode_json $response->content;
49 die($response->status_line . ":" . $response->content);
54 my ($self, $url) = @_;
56 $self->request(DELETE => $url);
60 my ($self, $url) = @_;
63 $self->request(GET => $url);
67 my ($self, $url, $json) = @_;
70 $self->request(PUT => $url, $json);
74 my ($self, $url, $json) = @_;
76 $self->request(POST => $url, $json);
80 my ($self, $url, $json) = @_;
82 warn "# update_doc $url";
84 my $json_md5 = md5_hex encode_json $json;
85 $json->{x_sync}->{json_md5} = $json_md5;
87 if ( my $old = eval { $self->get( $url ) } ) {
88 warn "# old ", $old->{_rev}; #dump($old);
90 if ( $json_md5 ne $old->{x_sync}->{json_md5} ) {
91 $json->{_rev} = $old->{_rev};
92 warn :"# update $url";
93 $self->put( $url => $json );
95 warn "# unchanged $url";
98 warn "# insert $url ", dump($json);
99 $self->put( $url => $json );