blob: a16f7092b30461197d79ebfc4b08c966699cc02e [file] [log] [blame]
#!/usr/bin/env perl
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
use strict;
use warnings;
use bytes;
use IO::Socket qw( :crlf );
use Getopt::Long;
use URI;
die ("Use --help for options\n") unless GetOptions (
"f|file=s" => \my $f_name,
"u|url=s" => \my $url,
"v|verbose" => \my $debug,
"h|help" => sub {
print <<HELP;
Usage: $0 OPTIONS
OPTIONS
-f|--file Which file to PUSH
-u|--url URL where to PUSH
-v|--verbose Print the PUSHed content to stdout
Example
$0 -f foo.txt -u http://localhost:8080/foo.txt
HELP
exit;
}
);
die ("--file and --url must be given!" ) unless ( $f_name && $url) ;
open (my $fh, '<', $f_name) or die $!;
chomp (my $f_type = `file -b --mime $f_name`);
my $uri = URI->new($url);
#
# read the file in one go:
#
binmode $fh;
my $f = do { local $/; <$fh> };
my $len_content = length($f) + 2;
my $response = "HTTP/1.0 200 OK${CRLF}Content-type: ${f_type}${CRLF}Content-length: ${len_content}${CRLF}${CRLF}${f}${CRLF}";
my $len_push = length $response;
my $push = "PUSH ${url} HTTP/1.0${CRLF}Content-Length: ${len_push}${CRLF}${CRLF}${response}";
print $push if ($debug);
my $sock = IO::Socket::INET->new(PeerAddr => $uri->host, PeerPort => $uri->port, Proto => 'tcp') or die "Error creating socket: $!";
print $sock $push;
print do { local $/; <$sock> };