CVSROOT: /sources/gnash Module name: gnash Changes by: Rob Savoye <rsavoye> 07/12/11 03:23:03
Modified files: . : configure.ac ChangeLog cygnal : Makefile.am cygnal.cpp http.cpp http.h netstats.cpp netstats.h stream.cpp Added files: cygnal/testsuite: Makefile.am simple.exp cygnal/testsuite/cygnal.all: Makefile.am test_http.cpp Removed files: cygnal : Change_Log.txt Log message: * cygnal/cygnal.cpp: Use a cygnal-dbg.log file instead of gnash-dbg.log. Use boost bind variables for all threads. * cygnal/http.{cpp,h}: Add methods for encoding HTTP header fields. Use a real date, instead of the bogus one. Check the file types to set the Content-Type HTTP field correctly. * cygnal/stream.cpp: Comment out lotsa debug messages. * cygnal/Makefile.am: Drop DIST_SUBDIRS, they don't compile for anything but win32 anyway. Add testsuite directory. * cygnal/testsuite: New testsuite directory. It's here rather than in gnash/testsuite since these tests are very different from ones gnash needs for most things. * cygnal/testsuite/Makefile.am: New Makefile for Cygnal test directories. * cygnal/testsuite/cygnal.all: Cygnal specific test cases live here. * cygnal/testsuite/cygnal.all/Makefile.am: Build the test cases and run DejaGnu on them. * cygnal/testsuite/cygnal.all/test_http.cpp: Test case for HTTP protocol. * configure.ac: Add new cygnal/testsuite Makefiles. * cygnal/testsuite/simpe.exp: clone the one used currently for Gnash testing. CVSWeb URLs: http://cvs.savannah.gnu.org/viewcvs/gnash/configure.ac?cvsroot=gnash&r1=1.454&r2=1.455 http://cvs.savannah.gnu.org/viewcvs/gnash/ChangeLog?cvsroot=gnash&r1=1.5124&r2=1.5125 http://cvs.savannah.gnu.org/viewcvs/gnash/cygnal/Makefile.am?cvsroot=gnash&r1=1.8&r2=1.9 http://cvs.savannah.gnu.org/viewcvs/gnash/cygnal/cygnal.cpp?cvsroot=gnash&r1=1.14&r2=1.15 http://cvs.savannah.gnu.org/viewcvs/gnash/cygnal/http.cpp?cvsroot=gnash&r1=1.9&r2=1.10 http://cvs.savannah.gnu.org/viewcvs/gnash/cygnal/http.h?cvsroot=gnash&r1=1.7&r2=1.8 http://cvs.savannah.gnu.org/viewcvs/gnash/cygnal/netstats.cpp?cvsroot=gnash&r1=1.7&r2=1.8 http://cvs.savannah.gnu.org/viewcvs/gnash/cygnal/netstats.h?cvsroot=gnash&r1=1.4&r2=1.5 http://cvs.savannah.gnu.org/viewcvs/gnash/cygnal/stream.cpp?cvsroot=gnash&r1=1.7&r2=1.8 http://cvs.savannah.gnu.org/viewcvs/gnash/cygnal/Change_Log.txt?cvsroot=gnash&r1=1.1&r2=0 http://cvs.savannah.gnu.org/viewcvs/gnash/cygnal/testsuite/Makefile.am?cvsroot=gnash&rev=1.1 http://cvs.savannah.gnu.org/viewcvs/gnash/cygnal/testsuite/simple.exp?cvsroot=gnash&rev=1.1 http://cvs.savannah.gnu.org/viewcvs/gnash/cygnal/testsuite/cygnal.all/Makefile.am?cvsroot=gnash&rev=1.1 http://cvs.savannah.gnu.org/viewcvs/gnash/cygnal/testsuite/cygnal.all/test_http.cpp?cvsroot=gnash&rev=1.1 Patches: Index: configure.ac =================================================================== RCS file: /sources/gnash/gnash/configure.ac,v retrieving revision 1.454 retrieving revision 1.455 diff -u -b -r1.454 -r1.455 --- configure.ac 4 Dec 2007 23:50:06 -0000 1.454 +++ configure.ac 11 Dec 2007 03:23:01 -0000 1.455 @@ -15,7 +15,7 @@ dnl Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA dnl -dnl $Id: configure.ac,v 1.454 2007/12/04 23:50:06 strk Exp $ +dnl $Id: configure.ac,v 1.455 2007/12/11 03:23:01 rsavoye Exp $ AC_PREREQ(2.50) AC_INIT(gnash, cvs) @@ -269,7 +269,6 @@ build_alp=yes dnl AC_DEFINE(USE_ALP, [1], [Use the ALP framework]) build_gtk=yes -dnl AC_DEFINE(USE_GTK, [1], [Use the GTK GUI]) ;; gtk|GTK|gtk2|GTK2) dnl AC_DEFINE(USE_GTK, [1], [Use the GTK GUI]) @@ -709,10 +708,10 @@ if test x"${build_alp}" = xyes; then GNASH_PATH_ALP if test x"${have_alp}" = x"yes"; then - AC_DEFINE([HAVE_ALP], [], [Access Linux Platform framework]) + AC_DEFINE([HAVE_ALP], 1, [Access Linux Platform framework]) fi cross_compiling=yes - build_gtk=yes +dnl build_gtk=yes build_kde=no build_ogl=no build_agg=yes @@ -741,7 +740,7 @@ dnl disable build of the GUIS for which deps are NOT met dnl ------------------------------------------------------------ -if test x$build_gtk = xyes; then +if test x$build_gtk = xyes -o $build_alp = xyes -o x$build_hildon = xyes; then GNASH_PATH_GTK2 GNASH_PATH_PANGO GNASH_PKG_FIND(atk, [atk/atk.h], [atk library], atk_focus_tracker_init, [1.0]) @@ -749,6 +748,7 @@ GNASH_PATH_GLEXT fi + GNASH_PKG_FIND(cairo, [cairo.h], [cairo render library], cairo_status) dnl if gtk isn't installed, even if it's specified, don't try to build dnl the GTK gui. if test x$has_gtk2 = xno; then @@ -786,6 +786,7 @@ AC_CHECK_FUNCS(mallinfo) AC_PATH_TOOL([AUTOTRACE], [autotrace]) +AC_PATH_TOOL([NETCAT], [netcat]) AC_HEADER_DIRENT dnl ----------------------------------------------------------------- @@ -1608,13 +1609,13 @@ plugin/Makefile plugin/klash/Makefile cygnal/Makefile -cygnal/ACT/Makefile -cygnal/ACT/test_support/Makefile -cygnal/ACT/unit_tests/Makefile -cygnal/IO/Makefile -cygnal/HTTP/Makefile -cygnal/Net/Makefile -cygnal/unit_tests/Makefile +cygnal/testsuite/Makefile +cygnal/testsuite/cygnal.all/Makefile +dnl cygnal/ACT/unit_tests/Makefile +dnl cygnal/IO/Makefile +dnl cygnal/HTTP/Makefile +dnl cygnal/Net/Makefile +dnl cygnal/unit_tests/Makefile ) ### Index: ChangeLog =================================================================== RCS file: /sources/gnash/gnash/ChangeLog,v retrieving revision 1.5124 retrieving revision 1.5125 diff -u -b -r1.5124 -r1.5125 --- ChangeLog 11 Dec 2007 00:14:22 -0000 1.5124 +++ ChangeLog 11 Dec 2007 03:23:01 -0000 1.5125 @@ -1,5 +1,35 @@ +2007-12-10 Rob Savoye <[EMAIL PROTECTED]> + + * cygnal/cygnal.cpp: Use a cygnal-dbg.log file instead of + gnash-dbg.log. Use boost bind variables for all threads. + * cygnal/http.{cpp,h}: Add methods for encoding HTTP header + fields. Use a real date, instead of the bogus one. Check the file + types to set the Content-Type HTTP field correctly. + * cygnal/stream.cpp: Comment out lotsa debug messages. + * cygnal/Makefile.am: Drop DIST_SUBDIRS, they don't compile + for anything but win32 anyway. Add testsuite directory. + * cygnal/testsuite: New testsuite directory. It's here rather than + in gnash/testsuite since these tests are very different from + + ones gnash needs for most things. + * cygnal/testsuite/Makefile.am: New Makefile for Cygnal test + directories. + * cygnal/testsuite/cygnal.all: Cygnal specific test cases live + here. + * cygnal/testsuite/cygnal.all/Makefile.am: Build the test cases + and run DejaGnu on them. + * cygnal/testsuite/cygnal.all/test_http.cpp: Test case for HTTP + protocol. + * configure.ac: Add new cygnal/testsuite Makefiles. + * cygnal/testsuite/simpe.exp: clone the one used currently for + Gnash testing. + 2007-12-10 Sandro Santilli <[EMAIL PROTECTED]> + * testsuite/actionscript.all/Makefile.am: fix abs_mediadir to + contain quotes. Prior version failed building XML-*.swf files, + dunno if this patch breaks POSIX compatibility. + * utilities/processor.cpp: check for quit request right after calling movie_root::setRootMovie, as that would execute actions in first frame. Index: cygnal/Makefile.am =================================================================== RCS file: /sources/gnash/gnash/cygnal/Makefile.am,v retrieving revision 1.8 retrieving revision 1.9 diff -u -b -r1.8 -r1.9 --- cygnal/Makefile.am 18 Jul 2007 14:26:34 -0000 1.8 +++ cygnal/Makefile.am 11 Dec 2007 03:23:02 -0000 1.9 @@ -16,13 +16,15 @@ # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # -# $Id: Makefile.am,v 1.8 2007/07/18 14:26:34 strk Exp $ - ## Process this file with automake to generate Makefile.in AUTOMAKE_OPTIONS = dejagnu -DIST_SUBDIRS = ACT IO HTTP Net unit_tests +SUBDIRS = \ + . \ + testsuite + +#DIST_SUBDIRS = ACT IO HTTP Net unit_tests AM_CPPFLAGS = # -Wall @@ -79,7 +81,3 @@ mudflap: @echo "Rebuilding with GCC Mudflap support" $(MAKE) CXXFLAGS="$(CXXFLAGS) $(MUDFLAP_OPT)" LIBS="$(LIBS) $(MUDFLAP_LIB)" - -# EXTRA_PROGRAMS = talloc -# talloc_SOURCES = talloc.cpp -# talloc_LDADD = $(AM_LDFLAGS) Index: cygnal/cygnal.cpp =================================================================== RCS file: /sources/gnash/gnash/cygnal/cygnal.cpp,v retrieving revision 1.14 retrieving revision 1.15 diff -u -b -r1.14 -r1.15 --- cygnal/cygnal.cpp 5 Sep 2007 16:53:34 -0000 1.14 +++ cygnal/cygnal.cpp 11 Dec 2007 03:23:02 -0000 1.15 @@ -17,7 +17,6 @@ // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA // -/* $Id: cygnal.cpp,v 1.14 2007/09/05 16:53:34 nihilus Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -30,9 +29,9 @@ #include <cerrno> extern "C"{ - #include <unistd.h> +# include <unistd.h> #ifdef HAVE_GETOPT_H - #include <getopt.h> +# include <getopt.h> #endif #ifndef __GNUC__ extern int optind, getopt(int, char *const *, const char *); @@ -40,7 +39,6 @@ #endif } -#include "stream.h" #include "network.h" #include "log.h" #include "rc.h" @@ -49,6 +47,7 @@ #include "limits.h" #include "netstats.h" #include "statistics.h" +#include "stream.h" #include <sys/types.h> #include <sys/stat.h> @@ -59,8 +58,10 @@ #include <locale.h> #endif +#include <boost/date_time/gregorian/gregorian.hpp> +//#include <boost/date_time/local_time/local_time.hpp> +#include <boost/date_time/time_zone_base.hpp> #include <boost/date_time/posix_time/posix_time.hpp> - #include <boost/thread/thread.hpp> #include <boost/bind.hpp> @@ -75,10 +76,11 @@ static void cntrlc_handler(int sig); //static void start_thread(); -static void rtmp_thread(); -static void http_thread(); -static void ssl_thread(); +static void rtmp_thread(struct thread_params *conndata); +static void http_thread(struct thread_params *conndata); +static void ssl_thread(struct thread_params *conndata); static void stream_thread(struct thread_params *sendfile); +static void dispatch_thread(struct thread_params *params); namespace { gnash::LogFile& dbglogfile = gnash::LogFile::getDefaultInstance(); @@ -87,6 +89,7 @@ struct thread_params { int netfd; + int port; char filespec[256]; Statistics *statistics; }; @@ -115,6 +118,8 @@ int main(int argc, char *argv[]) { + dbglogfile.openLog("cygnal-dbg.log"); + // Initialize national language support #ifdef ENABLE_NLS setlocale (LC_MESSAGES, ""); @@ -160,7 +165,7 @@ log_msg (_("Document Root for media files is: %s"), docroot); } else { - docroot = "/var/www"; + docroot = "/var/www/html/software/gnash/tests/"; } while ((c = getopt (argc, argv, "hvwp:")) != -1) { @@ -198,14 +203,28 @@ act.sa_handler = cntrlc_handler; sigaction (SIGINT, &act, NULL); - boost::thread rtmp_port(&rtmp_thread); - boost::thread http_port(&http_thread); - boost::thread ssl_port(&ssl_thread); + struct thread_params rtmp_data; + struct thread_params http_data; + struct thread_params ssl_data; + rtmp_data.port = 1935; +// boost::thread rtmp_port(boost::bind(&rtmp_thread, &rtmp_data)); + + http_data.port = 4080; + Statistics st; + http_data.statistics = &st; + boost::thread http_port(boost::bind(&http_thread, &http_data)); + + ssl_data.port = 4443; +// boost::thread ssl_port(boost::bind(&ssl_thread, &ssl_data)); + +// boost::thread rtmp_port(&rtmp_thread); +// boost::thread http_port(&http_thread); +// boost::thread ssl_port(&ssl_thread); // wait for the thread to finish - rtmp_port.join(); +// rtmp_port.join(); http_port.join(); - ssl_port.join(); +// ssl_port.join(); log_msg (_("All done I think...")); @@ -213,56 +232,35 @@ } static void -rtmp_thread() +dispatch_thread(struct thread_params *params) { GNASH_REPORT_FUNCTION; - int retries = 0; - RTMPproto proto; - - Statistics st; - st.setFileType(NetStats::RTMP); - - proto.createServer(RTMP); - while (retries++ < thread_retries) { - log_msg(_("%s: Thread for RTMP port looping..."), __PRETTY_FUNCTION__); - proto.newConnection(true); - st.startClock(); - proto.handShakeWait(); - proto.handShakeResponse(); - proto.serverFinish(); - - // Keep track of the network statistics - st.stopClock(); - log_msg (_("Bytes read: %d"), proto.getBytesIn()); - log_msg (_("Bytes written: %d"), proto.getBytesOut()); - st.setBytes(proto.getBytesIn() + proto.getBytesOut()); - st.addStats(); - proto.resetBytesIn(); - proto.resetBytesOut(); - } + log_msg("Param port is: %d", params->port); } static void -http_thread() +http_thread(struct thread_params *conndata) { GNASH_REPORT_FUNCTION; int retries = 0; HTTP www; - struct thread_params thread_data; +// struct thread_params thread_data; string url, filespec, parameters; string::size_type pos; int port = RTMPT + port_offset; int filesize; struct stat filestats; + www.toggleDebug(true); + www.createServer(port); while (retries++ < thread_retries) { log_msg(_("%s: Thread for port %d looping..."), __PRETTY_FUNCTION__, port); www.newConnection(true); - Statistics st; - st.setFileType(NetStats::RTMPT); - st.startClock(); - thread_data.netfd = www.getFileFd(); + + conndata->statistics->setFileType(NetStats::RTMPT); + conndata->statistics->startClock(); + conndata->netfd = www.getFileFd(); url = docroot; url += www.waitForGetRequest(); pos = url.find("?"); @@ -274,36 +272,73 @@ } else { filesize = 0; } + + www.getFileType(filespec); www.sendGetReply(filesize); - strcpy(thread_data.filespec, filespec.c_str()); - thread_data.statistics = &st; +// strcpy(thread_data.filespec, filespec.c_str()); +// thread_data.statistics = conndata->statistics; // Keep track of the network statistics - st.stopClock(); + conndata->statistics->stopClock(); // log_msg (_("Bytes read: %d"), www.getBytesIn()); // log_msg (_("Bytes written: %d"), www.getBytesOut()); // st.setBytes(www.getBytesIn() + www.getBytesOut()); - st.addStats(); + conndata->statistics->addStats(); // www.resetBytesIn(); // www.resetBytesOut(); if (url != docroot) { log_msg (_("File to load is: %s"), filespec.c_str()); log_msg (_("Parameters are: %s"), parameters.c_str()); - memcpy(thread_data.filespec, filespec.c_str(), filespec.size()); - boost::thread sendthr(boost::bind(&stream_thread, &thread_data)); + memset(conndata->filespec, 0, 256); + memcpy(conndata->filespec, filespec.c_str(), filespec.size()); + boost::thread sendthr(boost::bind(&stream_thread, conndata)); sendthr.join(); } // See if this is a persistant connection - if (!www.keepAlive()) { - www.closeConnection(); +// if (!www.keepAlive()) { +// www.closeConnection(); +// } + conndata->statistics->dump(); } +} + +static void +rtmp_thread(struct thread_params *conndata) +{ + GNASH_REPORT_FUNCTION; + int retries = 0; + RTMPproto proto; + + Statistics st; + st.setFileType(NetStats::RTMP); + + log_msg("Param port is: %d", conndata->port); + + proto.createServer(RTMP); + while (retries++ < thread_retries) { + log_msg(_("%s: Thread for RTMP port looping..."), __PRETTY_FUNCTION__); + proto.newConnection(true); + st.startClock(); + proto.handShakeWait(); + proto.handShakeResponse(); + proto.serverFinish(); + + // Keep track of the network statistics + st.stopClock(); + log_msg (_("Bytes read: %d"), proto.getBytesIn()); + log_msg (_("Bytes written: %d"), proto.getBytesOut()); + st.setBytes(proto.getBytesIn() + proto.getBytesOut()); + st.addStats(); + proto.resetBytesIn(); + proto.resetBytesOut(); + + st.dump(); } -// st.dump(); } static void -ssl_thread() +ssl_thread(struct thread_params *conndata) { GNASH_REPORT_FUNCTION; int retries = 0; @@ -318,6 +353,7 @@ www.createServer(port); + log_msg("Param port is: %d", conndata->port); while (retries++ < thread_retries) { log_msg (_("%s: Thread for port %d looping..."), __PRETTY_FUNCTION__, port); www.newConnection(true); @@ -328,7 +364,6 @@ } } - static void stream_thread(struct thread_params *params) { @@ -342,8 +377,10 @@ Stream str; str.open(params->filespec, params->netfd, params->statistics); str.play(); +// ::close(params->netfd); } + // Trap Control-C so we can cleanly exit static void cntrlc_handler (int /*sig*/) Index: cygnal/http.cpp =================================================================== RCS file: /sources/gnash/gnash/cygnal/http.cpp,v retrieving revision 1.9 retrieving revision 1.10 diff -u -b -r1.9 -r1.10 --- cygnal/http.cpp 1 Jul 2007 10:53:49 -0000 1.9 +++ cygnal/http.cpp 11 Dec 2007 03:23:02 -0000 1.10 @@ -17,16 +17,20 @@ // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA // -/* $Id: http.cpp,v 1.9 2007/07/01 10:53:49 bjacques Exp $ */ - #ifdef HAVE_CONFIG_H #include "config.h" #endif #include <boost/thread/mutex.hpp> +#include <boost/date_time/gregorian/gregorian.hpp> +//#include <boost/date_time/local_time/local_time.hpp> +#include <boost/date_time/posix_time/posix_time.hpp> +//#include <boost/date_time/time_zone_base.hpp> #include <string> #include <iostream> #include <cstring> +#include <sys/types.h> +#include <sys/stat.h> #include "http.h" #include "log.h" @@ -35,7 +39,6 @@ static boost::mutex stl_mutex; - namespace cygnal { @@ -85,15 +88,15 @@ } extractMethod(buffer); -// extractReferer(buffer); -// extractHost(buffer); + extractReferer(buffer); + extractHost(buffer); extractAgent(buffer); extractLanguage(buffer); extractCharset(buffer); extractConnection(buffer); -// extractEncoding(buffer); -// extractTE(buffer); -// dump(); + extractEncoding(buffer); + extractTE(buffer); + dump(); // See if we got a legit GET request if (strncmp(buffer, "GET ", 4) == 0) { @@ -106,40 +109,221 @@ } bool -HTTP::sendGetReply(int filesize) +HTTP::formatHeader(const short type) +{ + GNASH_REPORT_FUNCTION; + + formatHeader(0, type); +} + + +bool +HTTP::formatHeader(int filesize, const short type) +{ + GNASH_REPORT_FUNCTION; + + _header << "HTTP/1.1 200 OK" << endl; +// _header << "Server: Cygnal/0.8.1 (Linux)" << endl; + this->formatDate(); + this->formatConnection("close"); +// _header << "Accept-Ranges: bytes" << endl; + this->formatContentLength(filesize); + this->formatContentType(); + // All HTTP messages are followed by a blank line. + this->terminateHeader(); +} + +bool +HTTP::formatDate() +{ + GNASH_REPORT_FUNCTION; + boost::posix_time::ptime now = boost::posix_time::second_clock::local_time(); + +// cout << now.time_of_day() << endl; + + boost::gregorian::date d(now.date()); +// boost::gregorian::date d(boost::gregorian::day_clock::local_day()); +// cout << boost::posix_time::to_simple_string(now) << endl; +// cout << d.day_of_week() << endl; +// cout << d.day() << endl; +// cout << d.year() << endl; +// cout << d.month() << endl; + +// boost::date_time::time_zone_ptr zone(new posix_time_zone("MST")); +// boost::date_time::time_zone_base b(now "MST"); +// cout << zone.dst_zone_abbrev() << endl; + + _header << "Date: " << d.day_of_week(); + _header << ", " << d.day(); + _header << " " << d.month(); + _header << " " << d.year(); + _header << " " << now.time_of_day(); + _header << " GMT" << endl; + +} + +bool +HTTP::formatMethod(const char *data) +{ + GNASH_REPORT_FUNCTION; + _header << "Method: " << data << endl; +} + +bool +HTTP::formatReferer(const char *refer) +{ + GNASH_REPORT_FUNCTION; + _header << "Referer: " << refer << endl; +} + +bool +HTTP::formatConnection(const char *options) +{ + GNASH_REPORT_FUNCTION; + _header << "Connection: " << options << endl; +} + +bool +HTTP::formatContentType() +{ + return formatContentType(_filetype); +} + +bool +HTTP::formatContentType(filetype_e filetype) +{ + GNASH_REPORT_FUNCTION; + + switch (filetype) { + case HTML: + _header << "Content-Type: text/html; charset=UTF-8" << endl; + break; + case SWF: +// _header << "Content-Type: application/x-shockwave-flash" << endl; + _header << "Content-Type: application/futuresplash" << endl; + break; + case VIDEO: + _header << "Content-Type: video/flv" << endl; + break; + case MP3: + _header << "Content-Type: audio/mpeg" << endl; + break; + default: + _header << "Content-Type: text/html; charset=UTF-8" << endl; + } +} + +bool +HTTP::formatContentLength(int filesize) +{ + GNASH_REPORT_FUNCTION; + _header << "Content-Length: " << filesize << endl; +} + +bool +HTTP::formatHost(const char *host) +{ + GNASH_REPORT_FUNCTION; + _header << "Host: " << host << endl; +} + +bool +HTTP::formatAgent(const char *agent) +{ + GNASH_REPORT_FUNCTION; + _header << "User-Agent: " << agent << endl; +} + +bool +HTTP::formatLanguage(const char *lang) { GNASH_REPORT_FUNCTION; - boost::posix_time::ptime now = boost::posix_time::microsec_clock::local_time(); - now.time_of_day(); + // For some browsers this appears to also be Content-Language + _header << "Accept-Language: " << lang << endl; +} - const char reply[] = - "HTTP/1.1 200 OK\r\n" - "Date: Sun, 20 Apr 2006 04:20:00 GMT\r\n" - "Content-Type: application/futuresplash\r\n" - "Connection: close\r\n" - "Content-Length: XX \r\n" - "\r\n" // All HTTP messages are followed by a blank line. - ; - - // This is a bit ugly, but we splice the file size onto the request string - // without any memory allocation, which could incur a small performance hit. - char *length = strstr(reply, " XX"); - sprintf(length, " %d", filesize); -// FIXME: Doesn't this write to a const array? And doesn't it fail to -// supply the two \r\n's needed to finish the string? --gnu +bool +HTTP::formatCharset(const char *set) +{ + GNASH_REPORT_FUNCTION; + // For some browsers this appears to also be Content-Charset + _header << "Accept-Charset: " << set << endl; +} - int ret = writeNet(reply, strlen(reply)); +bool +HTTP::formatEncoding(const char *code) +{ + GNASH_REPORT_FUNCTION; + _header << "Accept-Encoding: " << code << endl; +} - if (ret >= 0 && (unsigned)ret == strlen(reply)) { - log_msg (_("Sent GET Reply: %s"), reply); +bool +HTTP::formatTE(const char *te) +{ + GNASH_REPORT_FUNCTION; + _header << "TE: " << te << endl; +} + +bool +HTTP::sendGetReply(int filesize) +{ + GNASH_REPORT_FUNCTION; + +// const char reply[] = +// "HTTP/1.1 200 OK\r\n" +// "Date: Sun, 20 Apr 2006 04:20:00 GMT\r\n" +// "Content-Type: application/futuresplash\r\n" +// "Connection: close\r\n" +// "Content-Length: XX \r\n" +// "\r\n" // All HTTP messages are followed by a blank line. +// ; + +// // // This is a bit ugly, but we splice the file size onto the request string +// // // without any memory allocation, which could incur a small performance hit. +// char *length = strstr(reply, " XX"); +// sprintf(length, " %d", filesize); +// case SWF: +// _header << "Content-Type: application/futuresplash" << endl; +// break; + // // FIXME: Doesn't this write to a const array? And doesn't it fail to +// // // supply the two \r\n's needed to finish the string? --gnu + + formatHeader(filesize, RTMP); + int ret = writeNet(_header.str().c_str(), _header.str().size()); + + if (ret >= 0 && (unsigned)ret == _header.str().size()) { + log_msg (_("Sent GET Reply")); +// log_msg (_("Sent GET Reply: %s"), _header.str().c_str()); } else { log_msg (_("Couldn't send GET Reply, writeNet returned %d"), ret); - // TODO: FIXME: shouldn't we return false here ? + return false; } +// cout << "GET Header is:" << endl << _header.str() << endl; return true; // Default to true } +bool +HTTP::formatRequest(const char *url, http_method_e req) +{ + GNASH_REPORT_FUNCTION; + + _header.str(""); + + _header << req << " " << url << "HTTP/1.1" << endl; + _header << "User-Agent: Opera/9.01 (X11; Linux i686; U; en)" << endl; + _header << "Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1" << endl; + + _header << "Accept-Language: en" << endl; + _header << "Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1" << endl; + + _header << "Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0" << endl; + _header << "Referer: " << url << endl; + + _header << "Connection: Keep-Alive, TE" << endl; + _header << "TE: deflate, gzip, chunked, identity, trailers" << endl; + +} // bool // HTTP::sendGetReply(Network &net) // { @@ -373,6 +557,58 @@ return keepAlive(_connection.c_str()); } + // Get the file type, so we know how to set the + // Content-type in the header. +HTTP::filetype_e +HTTP::getFileType(std::string filespec) +{ + GNASH_REPORT_FUNCTION; + bool try_again = true; + string actual_filespec = filespec; + struct stat st; + + while (try_again) { + try_again = false; + if (stat(actual_filespec.c_str(), &st) == 0) { + // If it's a directory, then we emulate what apache + // does, which is to load the index.html file in that + // directry if it exists. + if (S_ISDIR(st.st_mode)) { + log_msg("%s is a directory\n", actual_filespec.c_str()); + if (actual_filespec[actual_filespec.size()-1] != '/') { + actual_filespec += '/'; + } + actual_filespec += "index.html"; + try_again = true; + continue; + } else { // not a directory + log_msg("%s is not a directory\n", actual_filespec.c_str()); + string::size_type pos; + pos = filespec.rfind("."); + if (pos != string::npos) { + string suffix = filespec.substr(pos, filespec.size()); + if (suffix == "html") { + _filetype = HTML; + log_msg("HTML content found"); + } + if (suffix == "swf") { + _filetype = SWF; + log_msg("SWF content found"); + } + if (suffix == "flv") { + _filetype = VIDEO; + log_msg("FLV content found"); + } + if (suffix == "mp3") { + _filetype = AUDIO; + log_msg("MP3 content found"); + } + } + } + } // end of stat() + } // end of try_waiting +} + void HTTP::dump() { GNASH_REPORT_FUNCTION; Index: cygnal/http.h =================================================================== RCS file: /sources/gnash/gnash/cygnal/http.h,v retrieving revision 1.7 retrieving revision 1.8 diff -u -b -r1.7 -r1.8 --- cygnal/http.h 1 Jul 2007 10:53:49 -0000 1.7 +++ cygnal/http.h 11 Dec 2007 03:23:02 -0000 1.8 @@ -24,9 +24,6 @@ #endif #include "network.h" - -#include <boost/date_time/posix_time/posix_time.hpp> //include all types plus i/o - #include <string> #include <map> @@ -100,6 +97,15 @@ const char *code; const char *msg; }; + typedef enum { + NONE, + HTML, + SWF, + VIDEO, + AUDIO, + MP3, + OSCP + } filetype_e; HTTP(); ~HTTP(); std::string waitForGetRequest(); @@ -122,10 +128,41 @@ std::string extractCharset(const char *data); std::string extractEncoding(const char *data); std::string extractTE(const char *data); + + // These methods add data to the fields in the HTTP header. + bool clearHeader() { _header.str(""); }; + bool formatHeader(int filesize, const short type); + bool formatHeader(const short type); + bool formatRequest(const char *url, http_method_e req); + bool formatMethod(const char *data); + bool formatDate(); + bool formatReferer(const char *data); + bool formatConnection(const char *data); + bool formatContentLength(int filesize); + bool formatContentType(); + bool formatContentType(filetype_e type); + bool formatHost(const char *data); + bool formatAgent(const char *data); + bool formatLanguage(const char *data); + bool formatCharset(const char *data); + bool formatEncoding(const char *data); + bool formatTE(const char *data); + bool keepAlive(const char *data); bool keepAlive(); + + // All HTTP messages are terminated with a blank line + void terminateHeader() { _header << std::endl; }; + + // Return the header that's been built up. + std::string getHeader() { return _header.str(); }; + + // Get the file type, so we know how to set the + // Content-type in the header. + filetype_e getFileType(std::string filespec); void dump(); private: + filetype_e _filetype; std::string _filespec; std::string _url; std::map<int, struct status_codes *> _status_codes; @@ -134,11 +171,13 @@ std::string _referer; std::string _connection; std::string _host; + int _port; std::string _agent; std::string _language; std::string _charset; std::string _encoding; std::string _te; + std::stringstream _header; }; } // end of cygnal namespace Index: cygnal/netstats.cpp =================================================================== RCS file: /sources/gnash/gnash/cygnal/netstats.cpp,v retrieving revision 1.7 retrieving revision 1.8 diff -u -b -r1.7 -r1.8 --- cygnal/netstats.cpp 1 Jul 2007 10:53:50 -0000 1.7 +++ cygnal/netstats.cpp 11 Dec 2007 03:23:02 -0000 1.8 @@ -16,7 +16,7 @@ // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA // -/* $Id: netstats.cpp,v 1.7 2007/07/01 10:53:50 bjacques Exp $ */ +/* $Id: netstats.cpp,v 1.8 2007/12/11 03:23:02 rsavoye Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -31,25 +31,29 @@ namespace cygnal { -NetStats::NetStats() { - GNASH_REPORT_FUNCTION; +NetStats::NetStats() +{ +// GNASH_REPORT_FUNCTION; } -NetStats::~NetStats() { - GNASH_REPORT_FUNCTION; +NetStats::~NetStats() +{ +// GNASH_REPORT_FUNCTION; } boost::posix_time::ptime -NetStats::startClock() { - GNASH_REPORT_FUNCTION; +NetStats::startClock() +{ +// GNASH_REPORT_FUNCTION; _starttime = boost::posix_time::microsec_clock::local_time(); return _stoptime; } boost::posix_time::ptime -NetStats::stopClock() { - GNASH_REPORT_FUNCTION; +NetStats::stopClock() +{ +// GNASH_REPORT_FUNCTION; _stoptime = boost::posix_time::microsec_clock::local_time(); return _stoptime; Index: cygnal/netstats.h =================================================================== RCS file: /sources/gnash/gnash/cygnal/netstats.h,v retrieving revision 1.4 retrieving revision 1.5 diff -u -b -r1.4 -r1.5 --- cygnal/netstats.h 1 Jul 2007 10:53:50 -0000 1.4 +++ cygnal/netstats.h 11 Dec 2007 03:23:02 -0000 1.5 @@ -23,7 +23,8 @@ #include "config.h" #endif -#include <boost/date_time/posix_time/posix_time.hpp> //include all types plus i/o +//include all types plus i/o +#include <boost/date_time/posix_time/posix_time.hpp> namespace cygnal { Index: cygnal/stream.cpp =================================================================== RCS file: /sources/gnash/gnash/cygnal/stream.cpp,v retrieving revision 1.7 retrieving revision 1.8 diff -u -b -r1.7 -r1.8 --- cygnal/stream.cpp 1 Jul 2007 10:53:50 -0000 1.7 +++ cygnal/stream.cpp 11 Dec 2007 03:23:03 -0000 1.8 @@ -17,8 +17,6 @@ // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA // -/* $Id: stream.cpp,v 1.7 2007/07/01 10:53:50 bjacques Exp $ */ - #ifdef HAVE_CONFIG_H #include "config.h" #endif @@ -53,7 +51,7 @@ static void sendfile_thread() { - GNASH_REPORT_FUNCTION; +// GNASH_REPORT_FUNCTION; struct stat stats; struct filedes loadfile; @@ -84,6 +82,8 @@ (void *)fdptr); } + printf("FIXME: st_dev is: %d\n", stats.st_dev); + // if (stats.st_size > 1024*8) { // } @@ -132,23 +132,23 @@ _seekptr(0), _filesize(0) { - GNASH_REPORT_FUNCTION; +// GNASH_REPORT_FUNCTION; } Stream::~Stream() { - GNASH_REPORT_FUNCTION; +// GNASH_REPORT_FUNCTION; if (_filefd) { close(_filefd); } if (_netfd) { - close(_netfd); + ::close(_netfd); } } bool Stream::open(const char *filespec) { - GNASH_REPORT_FUNCTION; +// GNASH_REPORT_FUNCTION; return open(filespec, _netfd); } @@ -156,7 +156,7 @@ bool Stream::open(const char *filespec, int /*netfd*/) { - GNASH_REPORT_FUNCTION; +// GNASH_REPORT_FUNCTION; //struct stat stats; // TODO: should we use the 'netfd' passed as parameter instead ? @@ -199,6 +199,7 @@ _state = OPEN; return true; } + ::close(_filefd); // if (stats.st_size > 1024*8) { // } @@ -217,14 +218,14 @@ // Stream the movie bool Stream::play() { - GNASH_REPORT_FUNCTION; +// GNASH_REPORT_FUNCTION; return play(_netfd); } bool Stream::play(int netfd) { - GNASH_REPORT_FUNCTION; +// GNASH_REPORT_FUNCTION; _netfd = netfd; _state = PLAY; @@ -276,7 +277,7 @@ // Stream a preview, instead of the full movie. bool Stream::preview(const char* /*filespec*/, int /*frames*/) { - GNASH_REPORT_FUNCTION; +// GNASH_REPORT_FUNCTION; _state = PREVIEW; return true; // Default to true @@ -285,7 +286,7 @@ // Stream a series of thumbnails bool Stream::thumbnail(const char* /*filespec*/, int /*quantity*/) { - GNASH_REPORT_FUNCTION; +// GNASH_REPORT_FUNCTION; _state = THUMBNAIL; return true; // Default to true @@ -294,7 +295,7 @@ // Pause the stream bool Stream::pause(int /*frame*/) { - GNASH_REPORT_FUNCTION; +// GNASH_REPORT_FUNCTION; _state = PAUSE; return true; // Default to true @@ -303,7 +304,7 @@ // Seek within the stream bool Stream::seek(int /*frame*/) { - GNASH_REPORT_FUNCTION; +// GNASH_REPORT_FUNCTION; _state = SEEK; return true; // Default to true @@ -312,7 +313,7 @@ // Upload a stream into a sandbox bool Stream::upload(const char* /*filespec*/) { - GNASH_REPORT_FUNCTION; +// GNASH_REPORT_FUNCTION; _state = UPLOAD; return true; // Default to true @@ -320,7 +321,7 @@ // Stream a single "real-time" source. bool Stream::multicast(const char* /*filespec*/) { - GNASH_REPORT_FUNCTION; +// GNASH_REPORT_FUNCTION; _state = MULTICAST; return true; // Default to true Index: cygnal/testsuite/Makefile.am =================================================================== RCS file: cygnal/testsuite/Makefile.am diff -N cygnal/testsuite/Makefile.am --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ cygnal/testsuite/Makefile.am 11 Dec 2007 03:23:03 -0000 1.1 @@ -0,0 +1,24 @@ +# +# Copyright (C) 2005, 2006, 2007 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# + +## Process this file with automake to generate Makefile.in + +AUTOMAKE_OPTIONS = + +SUBDIRS = cygnal.all + Index: cygnal/testsuite/simple.exp =================================================================== RCS file: cygnal/testsuite/simple.exp diff -N cygnal/testsuite/simple.exp --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ cygnal/testsuite/simple.exp 11 Dec 2007 03:23:03 -0000 1.1 @@ -0,0 +1,110 @@ + +load_lib "dejagnu.exp" + + +# If tracing has been enabled at the top level, then turn it on here +# too. +if $tracelevel { + strace $tracelevel +} + +# After these many seconds of execution the test script is aborted with a failure. +# This is to handle deadlocks. We don't reset the timeout when a match is +# found to avoid hanging in case of a testcase sending matches in an infinite loops. +# (not unlikely as it seems, think about flash movies...) +set timeout 600 +set file all +set params "" + +# testcases is set by the Makefile in the site.exp data file. +foreach file $testcases { + + verbose "Running test $file" + + # spawn the executable and look for the DejaGnu output messages from the + # test case. + + # this version of the call allows use of 'wait' to check return code + # -open [open "|cmd" "r"] doesn't work for that + spawn -noecho ./$file + + expect { + -re "^\[^\n]*NOTE:\[^\n]*\n" { + regsub ".*NOTE: " $expect_out(0,string) "" output + set output [string range $output 0 end-2] + verbose "${file} $output" + exp_continue -continue_timer + } + -re "^\[^\n]*XPASSED:\[^\n]*\n" { + regsub ".*XPASSED: " $expect_out(0,string) "" output + set output [string range $output 0 end-2] + xpass "${file}: $output" + exp_continue -continue_timer + } + -re "^\[^\n]*PASSED:\[^\n]*\n" { + regsub ".*PASSED: " $expect_out(0,string) "" output + set output [string range $output 0 end-2] + pass "${file}: $output" + exp_continue -continue_timer + } + -re "^\[^\n]*XFAILED:\[^\n]*\n" { + regsub ".*XFAILED: " $expect_out(0,string) "" output + set output [string range $output 0 end-2] + xfail "${file}: $output" + exp_continue -continue_timer + } + -re "^\[^\n]*FAILED:\[^\n]*\n" { + regsub ".*FAILED: " $expect_out(0,string) "" output + set output [string range $output 0 end-2] + fail "${file}: $output" + exp_continue -continue_timer + } + -re "^\[^\n]*UNTESTED:\[^\n]*\n" { + regsub ".*UNTESTED: " $expect_out(0,string) "" output + set output [string range $output 0 end-2] + untested "${file}: $output" + exp_continue -continue_timer + } + -re "^\[^\n]*UNRESOLVED:\[^\n]*\n" { + regsub ".*UNRESOLVED: " $expect_out(0,string) "" output + set output [string range $output 0 end-2] + unresolved "${file}: $output" + exp_continue -continue_timer + } + -re "^\[^\n]*\n" { + # just remove non-matching lines! + exp_continue -continue_timer + } + eof { + # unresolved "${file} died prematurely" + # catch close + # return "${file} died prematurely" + } + timeout { + fail "Test case ${file} still running after ${timeout} seconds, killing it (deadlock?)" + catch close + continue; + } + } + + # wait for the process to coplete to + # check return code + set retcode [wait] + + # debugging + #set i 0; foreach j $retcode { print "${file} wait($i) $j"; incr i } + + if { [ llength $retcode ] > 5 } { + fail "${file} died prematurely ([lindex $retcode 6])" + } + if { [ lindex $retcode 3 ] != 0 } { + fail "${file} exited with non-zero code ([lindex $retcode 3])" + } + + + + # force a close of the executable to be safe. + catch close +} + + Index: cygnal/testsuite/cygnal.all/Makefile.am =================================================================== RCS file: cygnal/testsuite/cygnal.all/Makefile.am diff -N cygnal/testsuite/cygnal.all/Makefile.am --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ cygnal/testsuite/cygnal.all/Makefile.am 11 Dec 2007 03:23:03 -0000 1.1 @@ -0,0 +1,69 @@ +# +# Copyright (C) 2005, 2006, 2007 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# + +## Process this file with automake to generate Makefile.in + +AUTOMAKE_OPTIONS = dejagnu + +AM_CPPFLAGS = # -Wall + +AM_LDFLAGS = \ + $(top_builddir)/libbase/libgnashbase.la \ + $(top_builddir)/libamf/libgnashamf.la \ + $(BOOST_LIBS) \ + $(PTHREAD_LIBS) + +localedir = $(datadir)/locale + +INCLUDES = -I.. \ + -I$(top_srcdir) \ + -I$(top_srcdir)/libamf \ + -I$(top_srcdir)/libbase \ + -I$(top_srcdir)/cygnal \ + -DLOCALEDIR=\"$(localedir)\" \ + $(BOOST_CFLAGS) \ + $(PTHREAD_CFLAGS) + +check_PROGRAMS = test_http +test_http_SOURCES = test_http.cpp ../../http.o +test_http_LDADD = $(AM_LDFLAGS) ../../http.o +test_http_DEPENDENCIES = site-update +# Rebuild with GCC 4.x Mudflap support +mudflap: + @echo "Rebuilding with GCC Mudflap support" + $(MAKE) CXXFLAGS="$(CXXFLAGS) $(MUDFLAP_OPT)" LIBS="$(LIBS) $(MUDFLAP_LIB)" + +TEST_DRIVERS = ../simple.exp + +check-DEJAGNU: site-update + @runtest=$(RUNTEST); \ + if $(SHELL) -c "$$runtest --version" > /dev/null 2>&1; then \ + $$runtest $(RUNTESTFLAGS) $(TEST_DRIVERS); true; \ + else \ + echo "WARNING: could not find \`runtest'" 1>&2; \ + for i in "$(check_PROGRAMS)"; do \ + $(SHELL) $$i; \ + done; \ + fi + +site-update: site.exp + @rm -fr site.exp.bak + @cp site.exp site.exp.bak + @sed -e '/testcases/d' site.exp.bak > site.exp + @echo "# This is a list of the pre-compiled testcases" >> site.exp + @echo "set testcases \"$(check_PROGRAMS)\"" >> site.exp Index: cygnal/testsuite/cygnal.all/test_http.cpp =================================================================== RCS file: cygnal/testsuite/cygnal.all/test_http.cpp diff -N cygnal/testsuite/cygnal.all/test_http.cpp --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ cygnal/testsuite/cygnal.all/test_http.cpp 11 Dec 2007 03:23:03 -0000 1.1 @@ -0,0 +1,302 @@ + // +// Copyright (C) 2005, 2006, 2007 Free Software Foundation, Inc. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#ifdef HAVE_DEJAGNU_H + +#include <string> + +#include <unistd.h> +#ifdef HAVE_GETOPT_H + #include <getopt.h> +#endif + +#ifndef __GNUC__ +extern int optind, getopt(int, char *const *, const char *); +#endif + +#include <sys/types.h> +#include <iostream> +#include <string> +#include <regex.h> + +#include "log.h" +#include "http.h" +#include "dejagnu.h" + +using namespace cygnal; +using namespace gnash; +using namespace std; + +static void usage (void); + +static int verbosity; + +static TestState runtest; + +int +main(int argc, char *argv[]) +{ + int c; + + while ((c = getopt (argc, argv, "hdvsm:")) != -1) { + switch (c) { + case 'h': + usage (); + break; + + case 'v': + verbosity++; + break; + + default: + usage (); + break; + } + } + + HTTP http; + + http.clearHeader(); + http.formatDate(); +// cerr << "FIXME: " << http.getHeader() << endl; + + regex_t regex_pat; + + // Check the Date field + // The date should look something like this: + // Date: Mon, 10 Dec 2007 GMT + regcomp (®ex_pat, "[A-Z][a-z]*, [0-9]* [A-Z][a-z]* [0-9]* *GMT$", + REG_NOSUB|REG_NEWLINE); + if (regexec (®ex_pat, http.getHeader().c_str(), 0, (regmatch_t *)0, 0)) { + runtest.fail ("Date::formatDate()"); + } else { + runtest.pass ("Date::formatDate()"); + } + regfree(®ex_pat); + + // Check the Content-Length field + http.clearHeader(); + http.formatContentLength(12345); +// cerr << "FIXME: " << http.getHeader() << endl; + regcomp (®ex_pat, "Content-Length: [0-9]*$", + REG_NOSUB|REG_NEWLINE); + if (regexec (®ex_pat, http.getHeader().c_str(), 0, (regmatch_t *)0, 0)) { + runtest.fail ("Date::formatContentLength()"); + } else { + runtest.pass ("Date::formatContentLength()"); + } + regfree(®ex_pat); + + + // Check the Connection field +// bool formatConnection(const char *data); + http.clearHeader(); + const char *data = "Keep-Alive"; + http.formatConnection(data); +// cerr << "FIXME: " << http.getHeader() << endl; + regcomp (®ex_pat, "Connection: [A-za-z-]*", + REG_NOSUB|REG_NEWLINE); + if (regexec (®ex_pat, http.getHeader().c_str(), 0, (regmatch_t *)0, 0)) { + runtest.fail ("Date::formatConnection()"); + } else { + runtest.pass ("Date::formatConnection()"); + } + regfree(®ex_pat); + + // Check the Host field +// bool formatHost(const char *data); + http.clearHeader(); + data = "localhost:4080"; + http.formatHost(data); +// cerr << "FIXME: " << http.getHeader() << endl; + regcomp (®ex_pat, "Host: [A-za-z-]*:[0-9]*$", + REG_NOSUB|REG_NEWLINE); + if (regexec (®ex_pat, http.getHeader().c_str(), 0, (regmatch_t *)0, 0)) { + runtest.fail ("Date::formatHost()"); + } else { + runtest.pass ("Date::formatHost()"); + } + regfree(®ex_pat); + +// Check the Language field +// bool formatLanguage(const char *data); + http.clearHeader(); + data = "en-US,en;q=0.9"; + http.formatLanguage(data); +// cerr << "FIXME: " << http.getHeader() << endl; + regcomp (®ex_pat, "Accept-Language: en-US,en;q=0.9$", + REG_NOSUB|REG_NEWLINE); + if (regexec (®ex_pat, http.getHeader().c_str(), 0, (regmatch_t *)0, 0)) { + runtest.fail ("Date::formatLanguage()"); + } else { + runtest.pass ("Date::formatLanguage()"); + } + regfree(®ex_pat); + +// bool formatCharset(const char *data); +// Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r + http.clearHeader(); + data = "iso-8859-1, utf-8, utf-16, *;q=0.1"; + http.formatCharset(data); +// cerr << "FIXME: " << http.getHeader() << endl; + regcomp (®ex_pat, "Accept-Charset: iso-8859-1.*$", + REG_NOSUB|REG_NEWLINE); + if (regexec (®ex_pat, http.getHeader().c_str(), 0, (regmatch_t *)0, 0)) { + runtest.fail ("Date::formatCharset()"); + } else { + runtest.pass ("Date::formatCharset()"); + } + regfree(®ex_pat); + +// bool formatEncoding(const char *data); + http.clearHeader(); + data = "deflate, gzip, x-gzip, identity, *;q=0"; + http.formatEncoding(data); +// cerr << "FIXME: " << http.getHeader() << endl; + regcomp (®ex_pat, "Accept-Encoding: deflate, gzip.*$", + REG_NOSUB|REG_NEWLINE); + if (regexec (®ex_pat, http.getHeader().c_str(), 0, (regmatch_t *)0, 0)) { + runtest.fail ("Date::formatEncoding()"); + } else { + runtest.pass ("Date::formatEncoding()"); + } + regfree(®ex_pat); + + +// bool formatTE(const char *data); + http.clearHeader(); + data = "deflate, gzip, chunked, identity, trailers"; + http.formatTE(data); +// cerr << "FIXME: " << http.getHeader() << endl; + regcomp (®ex_pat, "TE: deflate, gzip,.*$", + REG_NOSUB|REG_NEWLINE); + if (regexec (®ex_pat, http.getHeader().c_str(), 0, (regmatch_t *)0, 0)) { + runtest.fail ("Date::formatTE()"); + } else { + runtest.pass ("Date::formatTE()"); + } + regfree(®ex_pat); + +// bool formatAgent(const char *data); + http.clearHeader(); + data = "Gnash 0.8.1-cvs (X11; Linux i686; U; en)"; + http.formatAgent(data); +// cerr << "FIXME: " << http.getHeader() << endl; + regcomp (®ex_pat, "User-Agent: Gnash 0.8.1-cvs.*$", + REG_NOSUB|REG_NEWLINE); + if (regexec (®ex_pat, http.getHeader().c_str(), 0, (regmatch_t *)0, 0)) { + runtest.fail ("Date::formatAgent()"); + } else { + runtest.pass ("Date::formatAgent()"); + } + regfree(®ex_pat); + + // Check the Content Type field. First we check with a + // specified field, then next to see if the default works. +// bool formatContentType(); + http.clearHeader(); + http.formatContentType(HTTP::SWF); +// cerr << "FIXME: " << http.getHeader() << endl; + regcomp (®ex_pat, "Content-Type: application/futuresplash.*$", + REG_NOSUB|REG_NEWLINE); + if (regexec (®ex_pat, http.getHeader().c_str(), 0, (regmatch_t *)0, 0)) { + runtest.fail ("Date::formatContentType(type)"); + } else { + runtest.pass ("Date::formatConetnType(type)"); + } + regfree(®ex_pat); + + http.clearHeader(); + http.formatContentType(); +// cerr << "FIXME: " << http.getHeader() << endl; + regcomp (®ex_pat, "Content-Type: text/html.*$", + REG_NOSUB|REG_NEWLINE); + if (regexec (®ex_pat, http.getHeader().c_str(), 0, (regmatch_t *)0, 0)) { + runtest.fail ("Date::formatContentType()"); + } else { + runtest.pass ("Date::formatContenType()"); + } + regfree(®ex_pat); + +// bool formatReferer(const char *data); + http.clearHeader(); + data = "http://localhost/software/gnash/tests/index.html"; + http.formatReferer(data); +// cerr << "FIXME: " << http.getHeader() << endl; + regcomp (®ex_pat, "Referer: http://localhost.*index.html.*$", + REG_NOSUB|REG_NEWLINE); + if (regexec (®ex_pat, http.getHeader().c_str(), 0, (regmatch_t *)0, 0)) { + runtest.fail ("Date::formatReferer()"); + } else { + runtest.pass ("Date::formatReferer()"); + } + regfree(®ex_pat); + + // Check formatHeader() + http.clearHeader(); + http.formatHeader(RTMP); +// cerr << "FIXME: " << http.getHeader() << endl; + regcomp (®ex_pat, "HTTP/1.1 200 OK.*Date:.*Connection:.*-Length.*-Type:.*$", + REG_NOSUB); // note that we do want to look for NL + if (regexec (®ex_pat, http.getHeader().c_str(), 0, (regmatch_t *)0, 0)) { + runtest.fail ("Date::formatHeader(port)"); + } else { + runtest.pass ("Date::formatheader(port)"); + } + regfree(®ex_pat); + + +// http.formatHeader(666, RTMP); +// http.formatRequest("http://localhost:4080", HTTP::GET); + +// bool formatMethod(const char *data); + + +// void *out = amf_obj.encodeNumber(*num); + +// if (memcmp(out, buf, 9) == 0) { +// runtest.pass("Encoded AMF Number"); +// } else { +// runtest.fail("Encoded AMF Number"); +// } + +// delete num; +} +static void +usage (void) +{ + cerr << "This program tests HTTP protocol support." << endl; + cerr << "Usage: test_http [hv]" << endl; + cerr << "-h\tHelp" << endl; + cerr << "-v\tVerbose" << endl; + exit (-1); +} + +#else // no DejaGnu support + +int +main(int /*argc*/, char /* *argv[]*/) +{ + // nop + return 0; +} + +#endif Index: cygnal/Change_Log.txt =================================================================== RCS file: cygnal/Change_Log.txt diff -N cygnal/Change_Log.txt --- cygnal/Change_Log.txt 10 Jul 2007 14:09:11 -0000 1.1 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,24 +0,0 @@ -Change Log for GNU Cygnal -========================= - -2007-07-09 Eric Hughes <[EMAIL PROTECTED]> - * ACT/ACT.hpp: Changed ACT_State::Waiting to Would_Block. Modified convenience methods accordingly. - * ACT/Pause_Service.cpp, ACT/test_support/Listening_Actions.cpp, HTTP/HTTP_Behavior.cpp: followed ACT.hpp changes. - * ACT/unit_tests/Test_ACT.cpp: Improved act_twice to ensure guard on run() is in effect. - * IO/Stream_Consumer.cpp: Removed defect that was masking failures in scanning. Change causes an HTTP unit test to fail. - -2007-07-06 Eric Hughes <[EMAIL PROTECTED]> - * ACT/ACT.hpp: Converted ACT_State from an enumeration to a class. Removed convenience typedef. - * IO/Stream_Consumer.hpp: Added source_state() to assist in writing parsing filters. - * Lots and lots of files: Renamed act_state to ACT_State everywhere. Changed constant references to Working to either Waiting or Ready, as appropriate. Changed set_working() to set_ready(), set_waiting(), or source_state(), as appropriate. - -2007-07-06 Eric Hughes <[EMAIL PROTECTED]> - * doc/Doxyfile: Converted all paths to relative form. - * doc/mainpage.doxygen.txt: Wrote new main page. - * ACT/ACT.doxygen.txt: Wrote new page with overview of ACT. - -2007-06-28 Eric Hughes <[EMAIL PROTECTED]> - * doc/Doxyfile: New file. - -2007-06-17 Eric Hughes <[EMAIL PROTECTED]> - * ACT/*: Got listener wakeup working correctly in scheduler. _______________________________________________ Gnash-commit mailing list Gnash-commit@gnu.org http://lists.gnu.org/mailman/listinfo/gnash-commit