diff options
Diffstat (limited to 'debian/perl-framework/Apache-Test/lib/Apache/TestCommonPost.pm')
-rw-r--r-- | debian/perl-framework/Apache-Test/lib/Apache/TestCommonPost.pm | 199 |
1 files changed, 199 insertions, 0 deletions
diff --git a/debian/perl-framework/Apache-Test/lib/Apache/TestCommonPost.pm b/debian/perl-framework/Apache-Test/lib/Apache/TestCommonPost.pm new file mode 100644 index 0000000..dda2b31 --- /dev/null +++ b/debian/perl-framework/Apache-Test/lib/Apache/TestCommonPost.pm @@ -0,0 +1,199 @@ +# 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. +# +package Apache::TestCommonPost; + +use strict; +use warnings FATAL => 'all'; + +use constant POST_HUGE => $ENV{APACHE_TEST_POST_HUGE} || 0; + +use Apache::TestRequest (); +use Apache::TestUtil qw(t_cmp t_debug); +use Apache::Test qw(sok); + +BEGIN { + my $use_inline = 0; + + eval { + #if Inline.pm and libcurl are available + #we can make this test about 3x faster, + #after the inlined code is compiled that is. + require Inline; + Inline->import(C => 'DATA', LIBS => ['-lcurl'], + #CLEAN_AFTER_BUILD => 0, + PREFIX => 'aptest_post_'); + *request_init = \&curl_init; + *request_do = \&curl_do; + $use_inline = 1; + } if POST_HUGE; + + if (POST_HUGE) { + if ($@) { + t_debug "tests will run faster with Inline and curl installed"; + print $@; + } + else { + t_debug "using Inline and curl client"; + } + } + + unless ($use_inline) { + t_debug "using LWP client"; + #fallback to lwp + *request_init = \&lwp_init; + *request_do = \&lwp_do; + } +} + +sub lwp_init { + use vars qw($UA $Location); + $UA = Apache::TestRequest::user_agent(); + $Location = shift; +} + +sub lwp_do { + my $length = shift; + + my $request = HTTP::Request->new(POST => $Location); + $request->header('Content-length' => $length); + + if (LWP->VERSION >= 5.800) { + $request->content_ref(\('a' x $length)); + } else { + # before LWP 5.800 there was no way to tell HTTP::Message not + # to copy the string, there is a settable content_ref since + # 5.800 + use constant BUF_SIZE => 8192; + + my $remain = $length; + my $content = sub { + my $bytes = $remain < BUF_SIZE ? $remain : BUF_SIZE; + my $buf = 'a' x $bytes; + $remain -= $bytes; + $buf; + }; + + $request->content($content); + } + + + + my $response = $UA->request($request); + + Apache::TestRequest::lwp_trace($response); + + return $response->content; +} + +my @run_post_test_small_sizes = + #1k..9k, 10k..50k, 100k + (1..9, 10..50, 100); + +my @run_post_test_sizes = @run_post_test_small_sizes; + +if (POST_HUGE) { + push @run_post_test_sizes, + #300k, 500k, 2Mb, 4Mb, 6Mb, 10Mb + 300, 500, 2000, 4000, 6000, 10_000; +} + +sub Apache::TestCommon::run_post_test_sizes { @run_post_test_sizes } + +sub Apache::TestCommon::run_post_test { + my $module = shift; + my $sizes = shift || \@run_post_test_sizes; + + my $location = Apache::TestRequest::resolve_url("/$module"); + + request_init($location); + + for my $size (@$sizes) { + sok { + my $length = ($size * 1024); + + my $str = request_do($length); + chomp $str; + + t_cmp($length, $str, "length posted"); + }; + } +} + +1; +__DATA__ + +__C__ + +#include <curl/curl.h> +#include <curl/easy.h> + +static CURL *curl = NULL; +static SV *response = (SV *)NULL; +static long total = 0; + +static size_t my_curl_read(char *buffer, size_t size, + size_t nitems, void *data) +{ + size_t bytes = nitems < total ? nitems : total; + memset(buffer, 'a', bytes); + total -= bytes; + return bytes; +} + +static size_t my_curl_write(char *buffer, size_t size, + size_t nitems, void *data) +{ + sv_catpvn(response, buffer, nitems); + return nitems; +} + +void aptest_post_curl_init(char *url) +{ + char *proto = "HTTP/1.1"; /* curl default */ + curl = curl_easy_init(); + curl_easy_setopt(curl, CURLOPT_MUTE, 1); + curl_easy_setopt(curl, CURLOPT_URL, url); + curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "POST"); + curl_easy_setopt(curl, CURLOPT_UPLOAD, 1); + curl_easy_setopt(curl, CURLOPT_READFUNCTION, my_curl_read); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, my_curl_write); + if (!getenv("APACHE_TEST_HTTP11")) { + curl_easy_setopt(curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0); + proto = "HTTP/1.0"; + } + fprintf(stdout, "#CURL using protocol %s\n", proto); + fflush(stdout); + response = newSV(0); +} + +SV *aptest_post_curl_do(long len) +{ + sv_setpv(response, ""); + total = len; + curl_easy_setopt(curl, CURLOPT_INFILESIZE, len); + curl_easy_perform(curl); + return SvREFCNT_inc(response); +} + +void aptest_post_END(void) +{ + if (response) { + SvREFCNT_dec(response); + } + if (curl) { + curl_easy_cleanup(curl); + } +} |