summaryrefslogtreecommitdiffstats
path: root/debian/perl-framework/Apache-Test/lib/Apache/TestCommonPost.pm
diff options
context:
space:
mode:
Diffstat (limited to 'debian/perl-framework/Apache-Test/lib/Apache/TestCommonPost.pm')
-rw-r--r--debian/perl-framework/Apache-Test/lib/Apache/TestCommonPost.pm199
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);
+ }
+}