You are viewing a plain text version of this content. The canonical link for it is here.
Posted to test-cvs@httpd.apache.org by do...@apache.org on 2002/01/19 05:23:39 UTC

cvs commit: httpd-test/perl-framework/t/http11 post.t

dougm       02/01/18 20:23:39

  Added:       perl-framework/t/http11 post.t
  Log:
  add test for POSTs larger that t/apache/post
  also run over a single connection with keepalive
  
  Revision  Changes    Path
  1.1                  httpd-test/perl-framework/t/http11/post.t
  
  Index: post.t
  ===================================================================
  use strict;
  use warnings FATAL => 'all';
  
  use constant POST_HUGE => $ENV{APACHE_TEST_POST_HUGE} || 0;
  
  use vars '$client_module';
  
  BEGIN {
      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 => 'http11_post_');
          *request_init = \&curl_init;
          *request_do   = \&curl_do;
          $client_module = 'Inline';
      } if POST_HUGE;
  
      unless ($client_module) {
          #fallback to lwp
          *request_init = \&lwp_init;
          *request_do   = \&lwp_do;
          $client_module = 'LWP';
      }
  }
  
  use Apache::Test;
  use Apache::TestRequest;
  use Apache::TestUtil;
  
  #test some sizes too large for mod_echo_post
  #and keep the connection alive for kicks
  
  #1k..9k, 10k..50k, 100k, 300k, 500k, 2Mb
  my @sizes = (1..9, 10..50, 100, 300, 500, 2000);
  
  #these are too slow to be on by default
  #4Mb, 6Mb, 10Mb, 50Mb, 100Mb
  my @huge_sizes = (4000, 6000, 10_000, 50_000, 100_000);
  
  push @sizes, @huge_sizes if POST_HUGE;
  
  plan tests => scalar @sizes, [qw(eat_post), $client_module];
  
  my $location = Apache::TestRequest::resolve_url("/eat_post");
  
  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");
      };
  }
  
  sub lwp_init {
      use vars '$UA';
      $UA = Apache::TestRequest::user_agent(keep_alive => 1);
  }
  
  sub lwp_do {
      my $length = shift;
      my $remain = $length;
  
      use constant BUF_SIZE => 8192;
  
      my $content = sub {
          my $bytes = $remain < BUF_SIZE ? $remain : BUF_SIZE;
          my $buf = 'a' x $bytes;
          $remain -= $bytes;
          $buf;
      };
  
      my $request = HTTP::Request->new(POST => $location);
      $request->header('Content-length' => $length);
      $request->content($content);
  
      my $response = $UA->request($request);
  
      #t_debug $request->headers_as_string;
      #t_debug $response->headers_as_string;
  
      return $response->content;
  }
  
  __DATA__
  
  __C__
  
  #include <curl/curl.h>
  #include <curl/easy.h>
  
  static CURL *curl = NULL;
  static SV *response = Nullsv;
  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 http11_post_curl_init(char *url)
  {
      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);
      response = newSV(0);
  }
  
  SV *http11_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 http11_post_END(void)
  {
      if (response) {
          SvREFCNT_dec(response);
      }
      if (curl) {
          curl_easy_cleanup(curl);
      }
  }