199 lines
5.1 KiB
Perl
199 lines
5.1 KiB
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.
|
|
#
|
|
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);
|
|
}
|
|
}
|