# 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 #include 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); } }