mirror of
https://github.com/moparisthebest/curl
synced 2024-12-22 08:08:50 -05:00
Enable test cases to provide sections base64-encoded to be able to test
with binary data.
This commit is contained in:
parent
09717d3fc8
commit
0eb8414750
@ -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:
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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,
|
||||||
@ -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;
|
||||||
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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"
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user