1
0
mirror of https://github.com/moparisthebest/curl synced 2024-12-21 23:58:49 -05:00

Enable test cases to provide sections base64-encoded to be able to test

with binary data.
This commit is contained in:
Daniel Stenberg 2004-11-29 12:10:09 +00:00
parent 09717d3fc8
commit 0eb8414750
7 changed files with 105 additions and 26 deletions

View File

@ -14,7 +14,7 @@ specified, that will be checked/used if specified. This document includes all
the subsections currently supported. the subsections currently supported.
<reply> <reply>
<data [nocheck=1] [sendzero=yes]> <data [nocheck=1] [sendzero=yes] [base64=yes]>
§data to sent to the client on its request and later verified that it arrived §data to sent to the client on its request and later verified that it arrived
safely. Set the nocheck=1 to prevent the test script to verify the arrival safely. Set the nocheck=1 to prevent the test script to verify the arrival
of this data. of this data.
@ -31,6 +31,11 @@ for auth tests and similar.
'sendzero' set to yes means that the (FTP) server will "send" the data even if 'sendzero' set to yes means that the (FTP) server will "send" the data even if
the size is zero bytes. Used to verify curl's behaviour on zero bytes the size is zero bytes. Used to verify curl's behaviour on zero bytes
transfers. transfers.
'base64' set to yes means that the data provided in the test-file is a chunk
of data encoded with base64. It is the only way a test case can contain binary
data. (This attribute can in fact be used on any section, but it doesn't make
much sense for other sections than "data").
</data> </data>
<dataNUM> <dataNUM>
Send back this contents instead of the <data> one. The num is set by: Send back this contents instead of the <data> one. The num is set by:

View File

@ -56,6 +56,7 @@ sub getpart {
my @this; my @this;
my $inside=0; my $inside=0;
my $base64=0;
# print "Section: $section, part: $part\n"; # print "Section: $section, part: $part\n";
@ -65,6 +66,10 @@ sub getpart {
$inside++; $inside++;
} }
elsif((1 ==$inside) && ($_ =~ /^ *\<$part[ \>]/)) { elsif((1 ==$inside) && ($_ =~ /^ *\<$part[ \>]/)) {
if($_ =~ /$part .*base64=/) {
# attempt to detect base64 encoded parts
$base64=1;
}
$inside++; $inside++;
} }
elsif((2 ==$inside) && ($_ =~ /^ *\<\/$part/)) { elsif((2 ==$inside) && ($_ =~ /^ *\<\/$part/)) {
@ -77,6 +82,13 @@ sub getpart {
if(!@this && $warning) { if(!@this && $warning) {
print STDERR "*** getpart.pm: $section/$part returned empty!\n"; print STDERR "*** getpart.pm: $section/$part returned empty!\n";
} }
if($base64) {
# decode the whole array before returning it!
for(@this) {
my $decoded = decode_base64($_);
$_ = $decoded;
}
}
return @this; return @this;
} }
elsif(2==$inside) { elsif(2==$inside) {
@ -138,16 +150,31 @@ sub compareparts {
my $sizefirst=scalar(@$firstref); my $sizefirst=scalar(@$firstref);
my $sizesecond=scalar(@$secondref); my $sizesecond=scalar(@$secondref);
my $first;
my $second;
for(1 .. $sizefirst) { for(1 .. $sizefirst) {
my $index = $_ - 1; my $index = $_ - 1;
if($firstref->[$index] ne $secondref->[$index]) { if($firstref->[$index] ne $secondref->[$index]) {
(my $aa = $firstref->[$index]) =~ s/\r+\n$/\n/; (my $aa = $firstref->[$index]) =~ s/\r+\n$/\n/;
(my $bb = $secondref->[$index]) =~ s/\r+\n$/\n/; (my $bb = $secondref->[$index]) =~ s/\r+\n$/\n/;
if($aa ne $bb) {
return 1+$index; $first .= $firstref->[$index];
} $second .= $secondref->[$index];
} }
} }
# we cannot compare arrays index per index since with the base64 chunks,
# they may not be "evenly" distributed
# NOTE: this no longer strips off carriage returns from the arrays. Is that
# really necessary? It ruins the testing of newlines. I believe it was once
# added to enable tests on win32.
if($first ne $second) {
return 1;
}
return 0; return 0;
} }

View File

@ -23,6 +23,7 @@
########################################################################### ###########################################################################
# These should be the only variables that might be needed to get edited: # These should be the only variables that might be needed to get edited:
use MIME::Base64;
use strict; use strict;
#use warnings; #use warnings;

View File

@ -29,9 +29,16 @@ AUTOMAKE_OPTIONS = foreign
INCLUDES = -I$(top_srcdir)/lib -I$(top_srcdir)/include INCLUDES = -I$(top_srcdir)/lib -I$(top_srcdir)/include
noinst_PROGRAMS = sws noinst_PROGRAMS = sws getpart
sws_SOURCES= sws.c getpart.c getpart.h $(top_srcdir)/lib/strequal.c sws_SOURCES= sws.c getpart.c getpart.h $(top_srcdir)/lib/strequal.c \
$(top_srcdir)/lib/base64.c $(top_srcdir)/lib/mprintf.c \
$(top_srcdir)/lib/memdebug.c
extra_DIST = config.h.in extra_DIST = base64.pl
getpart_CPPFLAGS = -DGETPART_TEST
getpart_SOURCES= getpart.c getpart.h $(top_srcdir)/lib/strequal.c \
$(top_srcdir)/lib/base64.c $(top_srcdir)/lib/mprintf.c \
$(top_srcdir)/lib/memdebug.c

View File

@ -1,8 +1,8 @@
/*************************************************************************** /***************************************************************************
* _ _ ____ _ * _ _ ____ _
* Project ___| | | | _ \| | * Project ___| | | | _ \| |
* / __| | | | |_) | | * / __| | | | |_) | |
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2004, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2004, Daniel Stenberg, <daniel@haxx.se>, et al.
@ -10,7 +10,7 @@
* This software is licensed as described in the file COPYING, which * This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms * you should have received as part of this distribution. The terms
* are also available at http://curl.haxx.se/docs/copyright.html. * are also available at http://curl.haxx.se/docs/copyright.html.
* *
* You may opt to use, copy, modify, merge, publish, distribute and/or sell * You may opt to use, copy, modify, merge, publish, distribute and/or sell
* copies of the Software, and permit persons to whom the Software is * copies of the Software, and permit persons to whom the Software is
* furnished to do so, under the terms of the COPYING file. * furnished to do so, under the terms of the COPYING file.
@ -27,6 +27,14 @@
#include <stdlib.h> #include <stdlib.h>
#include "getpart.h" #include "getpart.h"
#define _MPRINTF_REPLACE /* use our functions only */
#include <curl/mprintf.h>
#include "base64.h"
/* include memdebug.h last */
#include "memdebug.h"
#define EAT_SPACE(ptr) while( ptr && *ptr && isspace((int)*ptr) ) ptr++ #define EAT_SPACE(ptr) while( ptr && *ptr && isspace((int)*ptr) ) ptr++
#define EAT_WORD(ptr) while( ptr && *ptr && !isspace((int)*ptr) && ('>' != *ptr)) ptr++ #define EAT_WORD(ptr) while( ptr && *ptr && !isspace((int)*ptr) && ('>' != *ptr)) ptr++
@ -36,14 +44,29 @@
#define show(x) #define show(x)
#endif #endif
curl_malloc_callback Curl_cmalloc = (curl_malloc_callback)malloc;
curl_free_callback Curl_cfree = (curl_free_callback)free;
curl_realloc_callback Curl_crealloc = (curl_realloc_callback)realloc;
curl_strdup_callback Curl_cstrdup = (curl_strdup_callback)strdup;
curl_calloc_callback Curl_ccalloc = (curl_calloc_callback)calloc;
static static
char *appendstring(char *string, /* original string */ char *appendstring(char *string, /* original string */
char *buffer, /* to append */ char *buffer, /* to append */
size_t *stringlen, /* length of string */ size_t *stringlen, /* length of string */
size_t *stralloc) /* allocated size */ size_t *stralloc, /* allocated size */
char base64) /* 1 if base64 encoded */
{ {
size_t len = strlen(buffer); size_t len = strlen(buffer);
size_t needed_len = len + *stringlen; size_t needed_len = len + *stringlen;
char buf64[256]; /* big enough? */
if(base64) {
/* decode the given buffer first */
len = Curl_base64_decode(buffer, buf64); /* updated len */
buffer = buf64;
needed_len = len + *stringlen; /* recalculate */
}
if(needed_len >= *stralloc) { if(needed_len >= *stralloc) {
char *newptr; char *newptr;
@ -57,7 +80,8 @@ char *appendstring(char *string, /* original string */
else else
return NULL; return NULL;
} }
strcpy(&string[*stringlen], buffer); /* memcpy to support binary blobs */
memcpy(&string[*stringlen], buffer, len);
*stringlen += len; *stringlen += len;
return string; return string;
@ -77,6 +101,7 @@ const char *spitout(FILE *stream,
char *string; char *string;
size_t stringlen=0; size_t stringlen=0;
size_t stralloc=256; size_t stralloc=256;
char base64 = 0; /* set to 1 if true */
enum { enum {
STATE_OUTSIDE, STATE_OUTSIDE,
@ -90,7 +115,7 @@ const char *spitout(FILE *stream,
return NULL; return NULL;
string[0] = 0; /* zero first byte in case of no data */ string[0] = 0; /* zero first byte in case of no data */
while(fgets(buffer, sizeof(buffer), stream)) { while(fgets(buffer, sizeof(buffer), stream)) {
ptr = buffer; ptr = buffer;
@ -101,7 +126,7 @@ const char *spitout(FILE *stream,
if('<' != *ptr) { if('<' != *ptr) {
if(display) { if(display) {
show(("=> %s", buffer)); show(("=> %s", buffer));
string = appendstring(string, buffer, &stringlen, &stralloc); string = appendstring(string, buffer, &stringlen, &stralloc, base64);
show(("* %s\n", buffer)); show(("* %s\n", buffer));
} }
continue; continue;
@ -138,7 +163,7 @@ const char *spitout(FILE *stream,
/* this is the beginning of a section */ /* this is the beginning of a section */
end = ptr; end = ptr;
EAT_WORD(end); EAT_WORD(end);
*end = 0; *end = 0;
switch(state) { switch(state) {
case STATE_OUTSIDE: case STATE_OUTSIDE:
@ -152,9 +177,19 @@ const char *spitout(FILE *stream,
default: default:
break; break;
} }
if(!end[1] != '>') {
/* There might be attributes here. Check for those we know of and care
about. */
if(strstr(&end[1], "base64=")) {
/* rought and dirty, but "mostly" functional */
/* Treat all data as base64 encoded */
base64 = 1;
}
}
} }
if(display) { if(display) {
string = appendstring(string, buffer, &stringlen, &stralloc); string = appendstring(string, buffer, &stringlen, &stralloc, base64);
show(("* %s\n", buffer)); show(("* %s\n", buffer));
} }
@ -174,15 +209,16 @@ const char *spitout(FILE *stream,
return string; return string;
} }
#ifdef TEST #ifdef GETPART_TEST
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
if(argc< 3) { if(argc< 3) {
printf("./moo main sub\n"); printf("./moo main sub\n");
} }
else { else {
int size; size_t size;
char *buffer = spitout(stdin, argv[1], argv[2], &size); const char *buffer = spitout(stdin, argv[1], argv[2], &size);
printf("%s", buffer);
} }
return 0; return 0;
} }

View File

@ -1,8 +1,8 @@
/*************************************************************************** /***************************************************************************
* _ _ ____ _ * _ _ ____ _
* Project ___| | | | _ \| | * Project ___| | | | _ \| |
* / __| | | | |_) | | * / __| | | | |_) | |
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2004, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2004, Daniel Stenberg, <daniel@haxx.se>, et al.
@ -10,7 +10,7 @@
* This software is licensed as described in the file COPYING, which * This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms * you should have received as part of this distribution. The terms
* are also available at http://curl.haxx.se/docs/copyright.html. * are also available at http://curl.haxx.se/docs/copyright.html.
* *
* You may opt to use, copy, modify, merge, publish, distribute and/or sell * You may opt to use, copy, modify, merge, publish, distribute and/or sell
* copies of the Software, and permit persons to whom the Software is * copies of the Software, and permit persons to whom the Software is
* furnished to do so, under the terms of the COPYING file. * furnished to do so, under the terms of the COPYING file.

View File

@ -81,6 +81,9 @@
static void win32_cleanup(void); static void win32_cleanup(void);
#endif #endif
/* include memdebug.h last */
#include "memdebug.h"
#define REQBUFSIZ 150000 #define REQBUFSIZ 150000
#define REQBUFSIZ_TXT "149999" #define REQBUFSIZ_TXT "149999"