File libsoup-2.2.100-r924.patch of Package libsoup
diff -ruNp /home/jacob/Scratch/libsoup-2.2.100/aclocal.m4 libsoup-2.2.100/aclocal.m4
--- /home/jacob/Scratch/libsoup-2.2.100/aclocal.m4 2007-02-12 10:34:08.000000000 -0500
+++ libsoup-2.2.100/aclocal.m4 2007-05-01 15:49:07.000000000 -0400
@@ -11,6 +11,331 @@
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE.
+# Configure paths for GLIB
+# Owen Taylor 1997-2001
+
+dnl AM_PATH_GLIB_2_0([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND [, MODULES]]]])
+dnl Test for GLIB, and define GLIB_CFLAGS and GLIB_LIBS, if gmodule, gobject or
+dnl gthread is specified in MODULES, pass to pkg-config
+dnl
+AC_DEFUN([AM_PATH_GLIB_2_0],
+[dnl
+dnl Get the cflags and libraries from pkg-config
+dnl
+AC_ARG_ENABLE(glibtest, [ --disable-glibtest do not try to compile and run a test GLIB program],
+ , enable_glibtest=yes)
+
+ pkg_config_args=glib-2.0
+ for module in . $4
+ do
+ case "$module" in
+ gmodule)
+ pkg_config_args="$pkg_config_args gmodule-2.0"
+ ;;
+ gmodule-no-export)
+ pkg_config_args="$pkg_config_args gmodule-no-export-2.0"
+ ;;
+ gobject)
+ pkg_config_args="$pkg_config_args gobject-2.0"
+ ;;
+ gthread)
+ pkg_config_args="$pkg_config_args gthread-2.0"
+ ;;
+ esac
+ done
+
+ AC_PATH_PROG(PKG_CONFIG, pkg-config, no)
+
+ no_glib=""
+
+ if test x$PKG_CONFIG != xno ; then
+ if $PKG_CONFIG --atleast-pkgconfig-version 0.7 ; then
+ :
+ else
+ echo *** pkg-config too old; version 0.7 or better required.
+ no_glib=yes
+ PKG_CONFIG=no
+ fi
+ else
+ no_glib=yes
+ fi
+
+ min_glib_version=ifelse([$1], ,2.0.0,$1)
+ AC_MSG_CHECKING(for GLIB - version >= $min_glib_version)
+
+ if test x$PKG_CONFIG != xno ; then
+ ## don't try to run the test against uninstalled libtool libs
+ if $PKG_CONFIG --uninstalled $pkg_config_args; then
+ echo "Will use uninstalled version of GLib found in PKG_CONFIG_PATH"
+ enable_glibtest=no
+ fi
+
+ if $PKG_CONFIG --atleast-version $min_glib_version $pkg_config_args; then
+ :
+ else
+ no_glib=yes
+ fi
+ fi
+
+ if test x"$no_glib" = x ; then
+ GLIB_GENMARSHAL=`$PKG_CONFIG --variable=glib_genmarshal glib-2.0`
+ GOBJECT_QUERY=`$PKG_CONFIG --variable=gobject_query glib-2.0`
+ GLIB_MKENUMS=`$PKG_CONFIG --variable=glib_mkenums glib-2.0`
+
+ GLIB_CFLAGS=`$PKG_CONFIG --cflags $pkg_config_args`
+ GLIB_LIBS=`$PKG_CONFIG --libs $pkg_config_args`
+ glib_config_major_version=`$PKG_CONFIG --modversion glib-2.0 | \
+ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'`
+ glib_config_minor_version=`$PKG_CONFIG --modversion glib-2.0 | \
+ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'`
+ glib_config_micro_version=`$PKG_CONFIG --modversion glib-2.0 | \
+ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'`
+ if test "x$enable_glibtest" = "xyes" ; then
+ ac_save_CFLAGS="$CFLAGS"
+ ac_save_LIBS="$LIBS"
+ CFLAGS="$CFLAGS $GLIB_CFLAGS"
+ LIBS="$GLIB_LIBS $LIBS"
+dnl
+dnl Now check if the installed GLIB is sufficiently new. (Also sanity
+dnl checks the results of pkg-config to some extent)
+dnl
+ rm -f conf.glibtest
+ AC_TRY_RUN([
+#include <glib.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+int
+main ()
+{
+ int major, minor, micro;
+ char *tmp_version;
+
+ system ("touch conf.glibtest");
+
+ /* HP/UX 9 (%@#!) writes to sscanf strings */
+ tmp_version = g_strdup("$min_glib_version");
+ if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) {
+ printf("%s, bad version string\n", "$min_glib_version");
+ exit(1);
+ }
+
+ if ((glib_major_version != $glib_config_major_version) ||
+ (glib_minor_version != $glib_config_minor_version) ||
+ (glib_micro_version != $glib_config_micro_version))
+ {
+ printf("\n*** 'pkg-config --modversion glib-2.0' returned %d.%d.%d, but GLIB (%d.%d.%d)\n",
+ $glib_config_major_version, $glib_config_minor_version, $glib_config_micro_version,
+ glib_major_version, glib_minor_version, glib_micro_version);
+ printf ("*** was found! If pkg-config was correct, then it is best\n");
+ printf ("*** to remove the old version of GLib. You may also be able to fix the error\n");
+ printf("*** by modifying your LD_LIBRARY_PATH enviroment variable, or by editing\n");
+ printf("*** /etc/ld.so.conf. Make sure you have run ldconfig if that is\n");
+ printf("*** required on your system.\n");
+ printf("*** If pkg-config was wrong, set the environment variable PKG_CONFIG_PATH\n");
+ printf("*** to point to the correct configuration files\n");
+ }
+ else if ((glib_major_version != GLIB_MAJOR_VERSION) ||
+ (glib_minor_version != GLIB_MINOR_VERSION) ||
+ (glib_micro_version != GLIB_MICRO_VERSION))
+ {
+ printf("*** GLIB header files (version %d.%d.%d) do not match\n",
+ GLIB_MAJOR_VERSION, GLIB_MINOR_VERSION, GLIB_MICRO_VERSION);
+ printf("*** library (version %d.%d.%d)\n",
+ glib_major_version, glib_minor_version, glib_micro_version);
+ }
+ else
+ {
+ if ((glib_major_version > major) ||
+ ((glib_major_version == major) && (glib_minor_version > minor)) ||
+ ((glib_major_version == major) && (glib_minor_version == minor) && (glib_micro_version >= micro)))
+ {
+ return 0;
+ }
+ else
+ {
+ printf("\n*** An old version of GLIB (%d.%d.%d) was found.\n",
+ glib_major_version, glib_minor_version, glib_micro_version);
+ printf("*** You need a version of GLIB newer than %d.%d.%d. The latest version of\n",
+ major, minor, micro);
+ printf("*** GLIB is always available from ftp://ftp.gtk.org.\n");
+ printf("***\n");
+ printf("*** If you have already installed a sufficiently new version, this error\n");
+ printf("*** probably means that the wrong copy of the pkg-config shell script is\n");
+ printf("*** being found. The easiest way to fix this is to remove the old version\n");
+ printf("*** of GLIB, but you can also set the PKG_CONFIG environment to point to the\n");
+ printf("*** correct copy of pkg-config. (In this case, you will have to\n");
+ printf("*** modify your LD_LIBRARY_PATH enviroment variable, or edit /etc/ld.so.conf\n");
+ printf("*** so that the correct libraries are found at run-time))\n");
+ }
+ }
+ return 1;
+}
+],, no_glib=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"])
+ CFLAGS="$ac_save_CFLAGS"
+ LIBS="$ac_save_LIBS"
+ fi
+ fi
+ if test "x$no_glib" = x ; then
+ AC_MSG_RESULT(yes (version $glib_config_major_version.$glib_config_minor_version.$glib_config_micro_version))
+ ifelse([$2], , :, [$2])
+ else
+ AC_MSG_RESULT(no)
+ if test "$PKG_CONFIG" = "no" ; then
+ echo "*** A new enough version of pkg-config was not found."
+ echo "*** See http://www.freedesktop.org/software/pkgconfig/"
+ else
+ if test -f conf.glibtest ; then
+ :
+ else
+ echo "*** Could not run GLIB test program, checking why..."
+ ac_save_CFLAGS="$CFLAGS"
+ ac_save_LIBS="$LIBS"
+ CFLAGS="$CFLAGS $GLIB_CFLAGS"
+ LIBS="$LIBS $GLIB_LIBS"
+ AC_TRY_LINK([
+#include <glib.h>
+#include <stdio.h>
+], [ return ((glib_major_version) || (glib_minor_version) || (glib_micro_version)); ],
+ [ echo "*** The test program compiled, but did not run. This usually means"
+ echo "*** that the run-time linker is not finding GLIB or finding the wrong"
+ echo "*** version of GLIB. If it is not finding GLIB, you'll need to set your"
+ echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point"
+ echo "*** to the installed location Also, make sure you have run ldconfig if that"
+ echo "*** is required on your system"
+ echo "***"
+ echo "*** If you have an old version installed, it is best to remove it, although"
+ echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH" ],
+ [ echo "*** The test program failed to compile or link. See the file config.log for the"
+ echo "*** exact error that occured. This usually means GLIB is incorrectly installed."])
+ CFLAGS="$ac_save_CFLAGS"
+ LIBS="$ac_save_LIBS"
+ fi
+ fi
+ GLIB_CFLAGS=""
+ GLIB_LIBS=""
+ GLIB_GENMARSHAL=""
+ GOBJECT_QUERY=""
+ GLIB_MKENUMS=""
+ ifelse([$3], , :, [$3])
+ fi
+ AC_SUBST(GLIB_CFLAGS)
+ AC_SUBST(GLIB_LIBS)
+ AC_SUBST(GLIB_GENMARSHAL)
+ AC_SUBST(GOBJECT_QUERY)
+ AC_SUBST(GLIB_MKENUMS)
+ rm -f conf.glibtest
+])
+
+dnl Autoconf macros for libgcrypt
+dnl Copyright (C) 2002, 2004 Free Software Foundation, Inc.
+dnl
+dnl This file is free software; as a special exception the author gives
+dnl unlimited permission to copy and/or distribute it, with or without
+dnl modifications, as long as this notice is preserved.
+dnl
+dnl This file is distributed in the hope that it will be useful, but
+dnl WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+dnl implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+
+dnl AM_PATH_LIBGCRYPT([MINIMUM-VERSION,
+dnl [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND ]]])
+dnl Test for libgcrypt and define LIBGCRYPT_CFLAGS and LIBGCRYPT_LIBS.
+dnl MINIMUN-VERSION is a string with the version number optionalliy prefixed
+dnl with the API version to also check the API compatibility. Example:
+dnl a MINIMUN-VERSION of 1:1.2.5 won't pass the test unless the installed
+dnl version of libgcrypt is at least 1.2.5 *and* the API number is 1. Using
+dnl this features allows to prevent build against newer versions of libgcrypt
+dnl with a changed API.
+dnl
+AC_DEFUN([AM_PATH_LIBGCRYPT],
+[ AC_ARG_WITH(libgcrypt-prefix,
+ AC_HELP_STRING([--with-libgcrypt-prefix=PFX],
+ [prefix where LIBGCRYPT is installed (optional)]),
+ libgcrypt_config_prefix="$withval", libgcrypt_config_prefix="")
+ if test x$libgcrypt_config_prefix != x ; then
+ if test x${LIBGCRYPT_CONFIG+set} != xset ; then
+ LIBGCRYPT_CONFIG=$libgcrypt_config_prefix/bin/libgcrypt-config
+ fi
+ fi
+
+ AC_PATH_PROG(LIBGCRYPT_CONFIG, libgcrypt-config, no)
+ tmp=ifelse([$1], ,1:1.2.0,$1)
+ if echo "$tmp" | grep ':' >/dev/null 2>/dev/null ; then
+ req_libgcrypt_api=`echo "$tmp" | sed 's/\(.*\):\(.*\)/\1/'`
+ min_libgcrypt_version=`echo "$tmp" | sed 's/\(.*\):\(.*\)/\2/'`
+ else
+ req_libgcrypt_api=0
+ min_libgcrypt_version="$tmp"
+ fi
+
+ AC_MSG_CHECKING(for LIBGCRYPT - version >= $min_libgcrypt_version)
+ ok=no
+ if test "$LIBGCRYPT_CONFIG" != "no" ; then
+ req_major=`echo $min_libgcrypt_version | \
+ sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\1/'`
+ req_minor=`echo $min_libgcrypt_version | \
+ sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\2/'`
+ req_micro=`echo $min_libgcrypt_version | \
+ sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\3/'`
+ libgcrypt_config_version=`$LIBGCRYPT_CONFIG --version`
+ major=`echo $libgcrypt_config_version | \
+ sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\).*/\1/'`
+ minor=`echo $libgcrypt_config_version | \
+ sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\).*/\2/'`
+ micro=`echo $libgcrypt_config_version | \
+ sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\).*/\3/'`
+ if test "$major" -gt "$req_major"; then
+ ok=yes
+ else
+ if test "$major" -eq "$req_major"; then
+ if test "$minor" -gt "$req_minor"; then
+ ok=yes
+ else
+ if test "$minor" -eq "$req_minor"; then
+ if test "$micro" -ge "$req_micro"; then
+ ok=yes
+ fi
+ fi
+ fi
+ fi
+ fi
+ fi
+ if test $ok = yes; then
+ AC_MSG_RESULT(yes)
+ else
+ AC_MSG_RESULT(no)
+ fi
+ if test $ok = yes; then
+ # If we have a recent libgcrypt, we should also check that the
+ # API is compatible
+ if test "$req_libgcrypt_api" -gt 0 ; then
+ tmp=`$LIBGCRYPT_CONFIG --api-version 2>/dev/null || echo 0`
+ if test "$tmp" -gt 0 ; then
+ AC_MSG_CHECKING([LIBGCRYPT API version])
+ if test "$req_libgcrypt_api" -eq "$tmp" ; then
+ AC_MSG_RESULT(okay)
+ else
+ ok=no
+ AC_MSG_RESULT([does not match (want=$req_libgcrypt_api got=$tmp)])
+ fi
+ fi
+ fi
+ fi
+ if test $ok = yes; then
+ LIBGCRYPT_CFLAGS=`$LIBGCRYPT_CONFIG --cflags`
+ LIBGCRYPT_LIBS=`$LIBGCRYPT_CONFIG --libs`
+ ifelse([$2], , :, [$2])
+ else
+ LIBGCRYPT_CFLAGS=""
+ LIBGCRYPT_LIBS=""
+ ifelse([$3], , :, [$3])
+ fi
+ AC_SUBST(LIBGCRYPT_CFLAGS)
+ AC_SUBST(LIBGCRYPT_LIBS)
+])
+
# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*-
# serial 48 AC_PROG_LIBTOOL
@@ -7446,220 +7771,4 @@ AC_SUBST([am__tar])
AC_SUBST([am__untar])
]) # _AM_PROG_TAR
-# Configure paths for GLIB
-# Owen Taylor 1997-2001
-
-dnl AM_PATH_GLIB_2_0([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND [, MODULES]]]])
-dnl Test for GLIB, and define GLIB_CFLAGS and GLIB_LIBS, if gmodule, gobject or
-dnl gthread is specified in MODULES, pass to pkg-config
-dnl
-AC_DEFUN([AM_PATH_GLIB_2_0],
-[dnl
-dnl Get the cflags and libraries from pkg-config
-dnl
-AC_ARG_ENABLE(glibtest, [ --disable-glibtest do not try to compile and run a test GLIB program],
- , enable_glibtest=yes)
-
- pkg_config_args=glib-2.0
- for module in . $4
- do
- case "$module" in
- gmodule)
- pkg_config_args="$pkg_config_args gmodule-2.0"
- ;;
- gmodule-no-export)
- pkg_config_args="$pkg_config_args gmodule-no-export-2.0"
- ;;
- gobject)
- pkg_config_args="$pkg_config_args gobject-2.0"
- ;;
- gthread)
- pkg_config_args="$pkg_config_args gthread-2.0"
- ;;
- esac
- done
-
- AC_PATH_PROG(PKG_CONFIG, pkg-config, no)
-
- no_glib=""
-
- if test x$PKG_CONFIG != xno ; then
- if $PKG_CONFIG --atleast-pkgconfig-version 0.7 ; then
- :
- else
- echo *** pkg-config too old; version 0.7 or better required.
- no_glib=yes
- PKG_CONFIG=no
- fi
- else
- no_glib=yes
- fi
-
- min_glib_version=ifelse([$1], ,2.0.0,$1)
- AC_MSG_CHECKING(for GLIB - version >= $min_glib_version)
-
- if test x$PKG_CONFIG != xno ; then
- ## don't try to run the test against uninstalled libtool libs
- if $PKG_CONFIG --uninstalled $pkg_config_args; then
- echo "Will use uninstalled version of GLib found in PKG_CONFIG_PATH"
- enable_glibtest=no
- fi
-
- if $PKG_CONFIG --atleast-version $min_glib_version $pkg_config_args; then
- :
- else
- no_glib=yes
- fi
- fi
-
- if test x"$no_glib" = x ; then
- GLIB_GENMARSHAL=`$PKG_CONFIG --variable=glib_genmarshal glib-2.0`
- GOBJECT_QUERY=`$PKG_CONFIG --variable=gobject_query glib-2.0`
- GLIB_MKENUMS=`$PKG_CONFIG --variable=glib_mkenums glib-2.0`
-
- GLIB_CFLAGS=`$PKG_CONFIG --cflags $pkg_config_args`
- GLIB_LIBS=`$PKG_CONFIG --libs $pkg_config_args`
- glib_config_major_version=`$PKG_CONFIG --modversion glib-2.0 | \
- sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'`
- glib_config_minor_version=`$PKG_CONFIG --modversion glib-2.0 | \
- sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'`
- glib_config_micro_version=`$PKG_CONFIG --modversion glib-2.0 | \
- sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'`
- if test "x$enable_glibtest" = "xyes" ; then
- ac_save_CFLAGS="$CFLAGS"
- ac_save_LIBS="$LIBS"
- CFLAGS="$CFLAGS $GLIB_CFLAGS"
- LIBS="$GLIB_LIBS $LIBS"
-dnl
-dnl Now check if the installed GLIB is sufficiently new. (Also sanity
-dnl checks the results of pkg-config to some extent)
-dnl
- rm -f conf.glibtest
- AC_TRY_RUN([
-#include <glib.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-int
-main ()
-{
- int major, minor, micro;
- char *tmp_version;
-
- system ("touch conf.glibtest");
-
- /* HP/UX 9 (%@#!) writes to sscanf strings */
- tmp_version = g_strdup("$min_glib_version");
- if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) {
- printf("%s, bad version string\n", "$min_glib_version");
- exit(1);
- }
-
- if ((glib_major_version != $glib_config_major_version) ||
- (glib_minor_version != $glib_config_minor_version) ||
- (glib_micro_version != $glib_config_micro_version))
- {
- printf("\n*** 'pkg-config --modversion glib-2.0' returned %d.%d.%d, but GLIB (%d.%d.%d)\n",
- $glib_config_major_version, $glib_config_minor_version, $glib_config_micro_version,
- glib_major_version, glib_minor_version, glib_micro_version);
- printf ("*** was found! If pkg-config was correct, then it is best\n");
- printf ("*** to remove the old version of GLib. You may also be able to fix the error\n");
- printf("*** by modifying your LD_LIBRARY_PATH enviroment variable, or by editing\n");
- printf("*** /etc/ld.so.conf. Make sure you have run ldconfig if that is\n");
- printf("*** required on your system.\n");
- printf("*** If pkg-config was wrong, set the environment variable PKG_CONFIG_PATH\n");
- printf("*** to point to the correct configuration files\n");
- }
- else if ((glib_major_version != GLIB_MAJOR_VERSION) ||
- (glib_minor_version != GLIB_MINOR_VERSION) ||
- (glib_micro_version != GLIB_MICRO_VERSION))
- {
- printf("*** GLIB header files (version %d.%d.%d) do not match\n",
- GLIB_MAJOR_VERSION, GLIB_MINOR_VERSION, GLIB_MICRO_VERSION);
- printf("*** library (version %d.%d.%d)\n",
- glib_major_version, glib_minor_version, glib_micro_version);
- }
- else
- {
- if ((glib_major_version > major) ||
- ((glib_major_version == major) && (glib_minor_version > minor)) ||
- ((glib_major_version == major) && (glib_minor_version == minor) && (glib_micro_version >= micro)))
- {
- return 0;
- }
- else
- {
- printf("\n*** An old version of GLIB (%d.%d.%d) was found.\n",
- glib_major_version, glib_minor_version, glib_micro_version);
- printf("*** You need a version of GLIB newer than %d.%d.%d. The latest version of\n",
- major, minor, micro);
- printf("*** GLIB is always available from ftp://ftp.gtk.org.\n");
- printf("***\n");
- printf("*** If you have already installed a sufficiently new version, this error\n");
- printf("*** probably means that the wrong copy of the pkg-config shell script is\n");
- printf("*** being found. The easiest way to fix this is to remove the old version\n");
- printf("*** of GLIB, but you can also set the PKG_CONFIG environment to point to the\n");
- printf("*** correct copy of pkg-config. (In this case, you will have to\n");
- printf("*** modify your LD_LIBRARY_PATH enviroment variable, or edit /etc/ld.so.conf\n");
- printf("*** so that the correct libraries are found at run-time))\n");
- }
- }
- return 1;
-}
-],, no_glib=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"])
- CFLAGS="$ac_save_CFLAGS"
- LIBS="$ac_save_LIBS"
- fi
- fi
- if test "x$no_glib" = x ; then
- AC_MSG_RESULT(yes (version $glib_config_major_version.$glib_config_minor_version.$glib_config_micro_version))
- ifelse([$2], , :, [$2])
- else
- AC_MSG_RESULT(no)
- if test "$PKG_CONFIG" = "no" ; then
- echo "*** A new enough version of pkg-config was not found."
- echo "*** See http://www.freedesktop.org/software/pkgconfig/"
- else
- if test -f conf.glibtest ; then
- :
- else
- echo "*** Could not run GLIB test program, checking why..."
- ac_save_CFLAGS="$CFLAGS"
- ac_save_LIBS="$LIBS"
- CFLAGS="$CFLAGS $GLIB_CFLAGS"
- LIBS="$LIBS $GLIB_LIBS"
- AC_TRY_LINK([
-#include <glib.h>
-#include <stdio.h>
-], [ return ((glib_major_version) || (glib_minor_version) || (glib_micro_version)); ],
- [ echo "*** The test program compiled, but did not run. This usually means"
- echo "*** that the run-time linker is not finding GLIB or finding the wrong"
- echo "*** version of GLIB. If it is not finding GLIB, you'll need to set your"
- echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point"
- echo "*** to the installed location Also, make sure you have run ldconfig if that"
- echo "*** is required on your system"
- echo "***"
- echo "*** If you have an old version installed, it is best to remove it, although"
- echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH" ],
- [ echo "*** The test program failed to compile or link. See the file config.log for the"
- echo "*** exact error that occured. This usually means GLIB is incorrectly installed."])
- CFLAGS="$ac_save_CFLAGS"
- LIBS="$ac_save_LIBS"
- fi
- fi
- GLIB_CFLAGS=""
- GLIB_LIBS=""
- GLIB_GENMARSHAL=""
- GOBJECT_QUERY=""
- GLIB_MKENUMS=""
- ifelse([$3], , :, [$3])
- fi
- AC_SUBST(GLIB_CFLAGS)
- AC_SUBST(GLIB_LIBS)
- AC_SUBST(GLIB_GENMARSHAL)
- AC_SUBST(GOBJECT_QUERY)
- AC_SUBST(GLIB_MKENUMS)
- rm -f conf.glibtest
-])
-
m4_include([acinclude.m4])
diff -ruNp /home/jacob/Scratch/libsoup-2.2.100/ChangeLog libsoup-2.2.100/ChangeLog
--- /home/jacob/Scratch/libsoup-2.2.100/ChangeLog 2007-02-12 10:19:13.000000000 -0500
+++ libsoup-2.2.100/ChangeLog 2007-05-01 16:00:48.000000000 -0400
@@ -1,3 +1,142 @@
+2007-04-16 Dan Winship <danw@novell.com>
+
+ * libsoup/soup-ssl.h: Make a real SoupSSLCredentials type rather
+ than just using gpointer
+
+ * libsoup/soup-server.c (SoupServerPrivate): use it
+
+ * libsoup/soup-session.c (SoupSessionPrivate): use it
+
+ * libsoup/soup-gnutls.c: Use it, and consistently use "creds"
+ rather than "cred" as the abbreviation for "credentials".
+
+ * docs/reference/libsoup-sections.txt:
+ * docs/reference/tmpl/soup-misc.sgml:
+ * docs/reference/tmpl/soup-ssl.sgml: update
+
+2007-03-29 Dan Winship <danw@novell.com>
+
+ * libsoup/soup-session-sync.c (queue_message): Implement this by
+ sending the message (synchronously) in another thread and then
+ queueing the callback back in the main thread.
+
+ * libsoup/soup-session.c (soup_session_queue_message): update docs
+ to be more explicit about what thread the callback occurs in
+
+2007-03-17 Dan Winship <danw@novell.com>
+
+ * libsoup/soup-message.c (soup_message_set_auth)
+ (soup_message_get_auth, soup_message_set_proxy_auth)
+ (soup_message_get_proxy_auth): get/set auth/proxy_auth info for a
+ message.
+
+ * libsoup/soup-session.c (add_auth): Use soup_message_set_auth and
+ soup_message_set_proxy_auth.
+ (update_auth_internal): Call soup_message_get_auth or
+ soup_message_get_proxy_auth to determine the message's prior auth,
+ rather than calling lookup_auth() again, since it isn't guaranteed
+ to return the same thing now as it did when the message was
+ originally sent. Fixes erroneous 401s when queuing multiple
+ messages at once to an as-yet-unauthenticated-to server. #271540
+
+ * libsoup/soup-session-async.c (queue_message): don't run the
+ queue right away, do it at idle time. Otherwise in some cases
+ (especially errors), the message callbacks could be invoked before
+ queue_message returns.
+
+ * tests/auth-test.c: add a regression test for #271540.
+
+2007-03-17 Dan Winship <danw@novell.com>
+
+ * configure.in: require glib 2.12. check for timegm().
+
+ * libsoup/soup-date.c (soup_mktime_utc): Use timegm if available.
+ (soup_date_iso8601_parse): use g_time_val_from_iso8601. #337010,
+ patch from Emmanuele Bassi.
+
+ * libsoup/soup-types.h: remove local copy of
+ G_GNUC_NULL_TERMINATED since we now depend on a new-enough copy of
+ glib.
+
+ * libsoup/soup-misc.c (soup_base64_encode_close)
+ (soup_base64_encode_step, soup_base64_encode)
+ (soup_base64_decode_step): Make these just be wrappers around the
+ glib base64 methods. (For now; eventually they'll just go away.)
+
+ * libsoup/soup-auth-basic.c (authenticate):
+ * libsoup/soup-auth-digest.c (authenticate):
+ * libsoup/soup-connection-ntlm.c (soup_ntlm_parse_challenge)
+ (soup_ntlm_response):
+ * libsoup/soup-server-auth.c (soup_server_auth_new):
+ * libsoup/soup-soap-message.c (soup_soap_message_write_base64):
+ * libsoup/soup-xmlrpc-message.c
+ (soup_xmlrpc_message_write_base64):
+ * libsoup/soup-xmlrpc-response.c (soup_xmlrpc_value_get_base64):
+ Use glib base64 methods
+
+2007-03-16 Dan Winship <danw@novell.com>
+
+ * libsoup/soup-message.c (soup_message_get_response_encoding):
+ update the handling of CONNECT: it has no response body by
+ default, but does have a body if its headers say so.
+
+ * tests/proxy-test.c: test libsoup's behavior when talking to
+ proxies.
+
+ * tests/httpd.conf.in: Load mod_proxy and mod_ssl, and add
+ sections configuring them, for proxy-test
+
+ * configure.in: update the apache-module-dir-finding code to deal
+ with the fact that some modules (eg, mod_ssl) might only be in the
+ mpm-specific module dir, while others (eg, mod_php5) might only be
+ in the generic module dir.
+
+2007-03-12 Dan Winship <danw@novell.com>
+
+ * tests/Makefile.am (INCLUDES): add $(LIBGNUTLS_CFLAGS) for
+ ssl-test. #417617, patch from Elijah Newren.
+
+2007-03-12 Dan Winship <danw@novell.com>
+
+ * libsoup/soup-session-sync.c (wait_for_connection): if
+ soup_connection_connect_sync() returns SOUP_STATUS_TRY_AGAIN, then
+ try again. (Duh.) Fixes SSL-via-proxy-when-using-synchronous-I/O-
+ where-the-proxy-closes-the-connection-when-returning-407. (Reported
+ by Varadhan.)
+
+ * tests/get.c: Rewrite to use soup_session_send_message rather
+ than soup_session_queue_message, and add a "-s" flag to use
+ SoupSessionSync rather than SoupSessionAsync (so we can test bugs
+ in the sync code paths).
+
+2007-03-08 Dan Winship <danw@novell.com>
+
+ * libsoup/soup-gnutls.c (do_handshake): don't return
+ G_IO_STATUS_AGAIN if we're doing blocking I/O; just keep retrying
+ until the handshake is complete.
+ (soup_gnutls_read, soup_gnutls_write): if we get
+ GNUTLS_E_REHANDSHAKE, call do_handshake() immediately rather than
+ returning G_IO_STATUS_AGAIN; if the socket is blocking then
+ G_IO_STATUS_AGAIN is wrong, and if the socket is non-blocking, we
+ might already need to return SOUP_SSL_ERROR_HANDSHAKE_NEEDS_WRITE
+ or SOUP_SSL_ERROR_HANDSHAKE_NEEDS_READ.
+
+ #415402, based on a patch from Jacob Berkman.
+
+ * tests/ssl-test.c: basic ssl test. In particular, tests that
+ rehandshake requests are handled correctly during both synchronous
+ and asynchronous I/O. Might eventually test other stuff too...
+
+ * configure.in:
+ * tests/Makefile.am: updates for ssl-test
+
+2007-02-19 Dan Winship <danw@novell.com>
+
+ * configure.in: Get gcrypt libs/cflags.
+
+ * libsoup/Makefile.am (INCLUDES, libsoup_2_2_la_LIBADD): add
+ gcrypt flags. Patch from "Cygwin Ports Maintainer", #384498
+
2007-02-12 Dan Winship <danw@novell.com>
* configure.in: 2.2.100
diff -ruNp /home/jacob/Scratch/libsoup-2.2.100/config.h.in libsoup-2.2.100/config.h.in
--- /home/jacob/Scratch/libsoup-2.2.100/config.h.in 2007-02-12 10:34:10.000000000 -0500
+++ libsoup-2.2.100/config.h.in 2007-05-01 15:49:23.000000000 -0400
@@ -33,6 +33,10 @@
/* Define to 1 if you have the `gmtime_r' function. */
#undef HAVE_GMTIME_R
+/* Define to 1 if you have the `gnutls_certificate_client_set_sign_function'
+ function. */
+#undef HAVE_GNUTLS_CERTIFICATE_CLIENT_SET_SIGN_FUNCTION
+
/* Define to 1 if you have the `inet_aton' function. */
#undef HAVE_INET_ATON
@@ -78,6 +82,9 @@
/* Define to 1 if you have the <sys/types.h> header file. */
#undef HAVE_SYS_TYPES_H
+/* Define to 1 if you have the `timegm' function. */
+#undef HAVE_TIMEGM
+
/* Define to 1 if you have the <unistd.h> header file. */
#undef HAVE_UNISTD_H
diff -ruNp /home/jacob/Scratch/libsoup-2.2.100/configure libsoup-2.2.100/configure
--- /home/jacob/Scratch/libsoup-2.2.100/configure 2007-02-12 10:34:10.000000000 -0500
+++ libsoup-2.2.100/configure 2007-05-01 15:49:12.000000000 -0400
@@ -876,7 +876,12 @@ OS_WIN32_TRUE
OS_WIN32_FALSE
LIBGNUTLS_CFLAGS
LIBGNUTLS_LIBS
+LIBGCRYPT_CONFIG
+LIBGCRYPT_CFLAGS
+LIBGCRYPT_LIBS
SSL_REQUIREMENT
+HAVE_SSL_TRUE
+HAVE_SSL_FALSE
HTML_DIR
ENABLE_GTK_DOC_TRUE
ENABLE_GTK_DOC_FALSE
@@ -884,6 +889,8 @@ GTK_DOC_USE_LIBTOOL_TRUE
GTK_DOC_USE_LIBTOOL_FALSE
APACHE_HTTPD
APACHE_MODULE_DIR
+APACHE_SSL_MODULE_DIR
+APACHE_PHP_MODULE_DIR
HAVE_APACHE_TRUE
HAVE_APACHE_FALSE
IF_HAVE_PHP
@@ -1512,6 +1519,8 @@ Optional Packages:
--with-pic try to use only PIC/non-PIC objects [default=use
both]
--with-tags[=TAGS] include additional configurations [automatic]
+ --with-libgcrypt-prefix=PFX
+ prefix where LIBGCRYPT is installed (optional)
--with-html-dir=PATH path to installed docs
--with-apache-httpd Path to apache httpd (for tests)
--with-apache-module-dir Apache modules dir (for tests)
@@ -5910,7 +5919,7 @@ ia64-*-hpux*)
;;
*-*-irix6*)
# Find out which ABI we are using.
- echo '#line 5913 "configure"' > conftest.$ac_ext
+ echo '#line 5922 "configure"' > conftest.$ac_ext
if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
@@ -8709,11 +8718,11 @@ else
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-e 's:$: $lt_compiler_flag:'`
- (eval echo "\"\$as_me:8712: $lt_compile\"" >&5)
+ (eval echo "\"\$as_me:8721: $lt_compile\"" >&5)
(eval "$lt_compile" 2>conftest.err)
ac_status=$?
cat conftest.err >&5
- echo "$as_me:8716: \$? = $ac_status" >&5
+ echo "$as_me:8725: \$? = $ac_status" >&5
if (exit $ac_status) && test -s "$ac_outfile"; then
# The compiler can only warn and ignore the option if not recognized
# So say no if there are warnings other than the usual output.
@@ -8977,11 +8986,11 @@ else
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-e 's:$: $lt_compiler_flag:'`
- (eval echo "\"\$as_me:8980: $lt_compile\"" >&5)
+ (eval echo "\"\$as_me:8989: $lt_compile\"" >&5)
(eval "$lt_compile" 2>conftest.err)
ac_status=$?
cat conftest.err >&5
- echo "$as_me:8984: \$? = $ac_status" >&5
+ echo "$as_me:8993: \$? = $ac_status" >&5
if (exit $ac_status) && test -s "$ac_outfile"; then
# The compiler can only warn and ignore the option if not recognized
# So say no if there are warnings other than the usual output.
@@ -9081,11 +9090,11 @@ else
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-e 's:$: $lt_compiler_flag:'`
- (eval echo "\"\$as_me:9084: $lt_compile\"" >&5)
+ (eval echo "\"\$as_me:9093: $lt_compile\"" >&5)
(eval "$lt_compile" 2>out/conftest.err)
ac_status=$?
cat out/conftest.err >&5
- echo "$as_me:9088: \$? = $ac_status" >&5
+ echo "$as_me:9097: \$? = $ac_status" >&5
if (exit $ac_status) && test -s out/conftest2.$ac_objext
then
# The compiler can only warn and ignore the option if not recognized
@@ -11533,7 +11542,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<EOF
-#line 11536 "configure"
+#line 11545 "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
@@ -11633,7 +11642,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<EOF
-#line 11636 "configure"
+#line 11645 "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
@@ -14001,11 +14010,11 @@ else
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-e 's:$: $lt_compiler_flag:'`
- (eval echo "\"\$as_me:14004: $lt_compile\"" >&5)
+ (eval echo "\"\$as_me:14013: $lt_compile\"" >&5)
(eval "$lt_compile" 2>conftest.err)
ac_status=$?
cat conftest.err >&5
- echo "$as_me:14008: \$? = $ac_status" >&5
+ echo "$as_me:14017: \$? = $ac_status" >&5
if (exit $ac_status) && test -s "$ac_outfile"; then
# The compiler can only warn and ignore the option if not recognized
# So say no if there are warnings other than the usual output.
@@ -14105,11 +14114,11 @@ else
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-e 's:$: $lt_compiler_flag:'`
- (eval echo "\"\$as_me:14108: $lt_compile\"" >&5)
+ (eval echo "\"\$as_me:14117: $lt_compile\"" >&5)
(eval "$lt_compile" 2>out/conftest.err)
ac_status=$?
cat out/conftest.err >&5
- echo "$as_me:14112: \$? = $ac_status" >&5
+ echo "$as_me:14121: \$? = $ac_status" >&5
if (exit $ac_status) && test -s out/conftest2.$ac_objext
then
# The compiler can only warn and ignore the option if not recognized
@@ -15675,11 +15684,11 @@ else
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-e 's:$: $lt_compiler_flag:'`
- (eval echo "\"\$as_me:15678: $lt_compile\"" >&5)
+ (eval echo "\"\$as_me:15687: $lt_compile\"" >&5)
(eval "$lt_compile" 2>conftest.err)
ac_status=$?
cat conftest.err >&5
- echo "$as_me:15682: \$? = $ac_status" >&5
+ echo "$as_me:15691: \$? = $ac_status" >&5
if (exit $ac_status) && test -s "$ac_outfile"; then
# The compiler can only warn and ignore the option if not recognized
# So say no if there are warnings other than the usual output.
@@ -15779,11 +15788,11 @@ else
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-e 's:$: $lt_compiler_flag:'`
- (eval echo "\"\$as_me:15782: $lt_compile\"" >&5)
+ (eval echo "\"\$as_me:15791: $lt_compile\"" >&5)
(eval "$lt_compile" 2>out/conftest.err)
ac_status=$?
cat out/conftest.err >&5
- echo "$as_me:15786: \$? = $ac_status" >&5
+ echo "$as_me:15795: \$? = $ac_status" >&5
if (exit $ac_status) && test -s out/conftest2.$ac_objext
then
# The compiler can only warn and ignore the option if not recognized
@@ -18009,11 +18018,11 @@ else
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-e 's:$: $lt_compiler_flag:'`
- (eval echo "\"\$as_me:18012: $lt_compile\"" >&5)
+ (eval echo "\"\$as_me:18021: $lt_compile\"" >&5)
(eval "$lt_compile" 2>conftest.err)
ac_status=$?
cat conftest.err >&5
- echo "$as_me:18016: \$? = $ac_status" >&5
+ echo "$as_me:18025: \$? = $ac_status" >&5
if (exit $ac_status) && test -s "$ac_outfile"; then
# The compiler can only warn and ignore the option if not recognized
# So say no if there are warnings other than the usual output.
@@ -18277,11 +18286,11 @@ else
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-e 's:$: $lt_compiler_flag:'`
- (eval echo "\"\$as_me:18280: $lt_compile\"" >&5)
+ (eval echo "\"\$as_me:18289: $lt_compile\"" >&5)
(eval "$lt_compile" 2>conftest.err)
ac_status=$?
cat conftest.err >&5
- echo "$as_me:18284: \$? = $ac_status" >&5
+ echo "$as_me:18293: \$? = $ac_status" >&5
if (exit $ac_status) && test -s "$ac_outfile"; then
# The compiler can only warn and ignore the option if not recognized
# So say no if there are warnings other than the usual output.
@@ -18381,11 +18390,11 @@ else
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-e 's:$: $lt_compiler_flag:'`
- (eval echo "\"\$as_me:18384: $lt_compile\"" >&5)
+ (eval echo "\"\$as_me:18393: $lt_compile\"" >&5)
(eval "$lt_compile" 2>out/conftest.err)
ac_status=$?
cat out/conftest.err >&5
- echo "$as_me:18388: \$? = $ac_status" >&5
+ echo "$as_me:18397: \$? = $ac_status" >&5
if (exit $ac_status) && test -s out/conftest2.$ac_objext
then
# The compiler can only warn and ignore the option if not recognized
@@ -21569,7 +21578,7 @@ fi
no_glib=yes
fi
- min_glib_version=2.6.0
+ min_glib_version=2.12.0
{ echo "$as_me:$LINENO: checking for GLIB - version >= $min_glib_version" >&5
echo $ECHO_N "checking for GLIB - version >= $min_glib_version... $ECHO_C" >&6; }
@@ -22210,6 +22219,116 @@ fi
done
+for ac_func in timegm
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $ac_func ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined __stub_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+
{ echo "$as_me:$LINENO: checking for socket" >&5
echo $ECHO_N "checking for socket... $ECHO_C" >&6; }
@@ -22819,7 +22938,141 @@ else
LIBGNUTLS_LIBS=$pkg_cv_LIBGNUTLS_LIBS
{ echo "$as_me:$LINENO: result: yes" >&5
echo "${ECHO_T}yes" >&6; }
- have_ssl=yes
+
+# Check whether --with-libgcrypt-prefix was given.
+if test "${with_libgcrypt_prefix+set}" = set; then
+ withval=$with_libgcrypt_prefix; libgcrypt_config_prefix="$withval"
+else
+ libgcrypt_config_prefix=""
+fi
+
+ if test x$libgcrypt_config_prefix != x ; then
+ if test x${LIBGCRYPT_CONFIG+set} != xset ; then
+ LIBGCRYPT_CONFIG=$libgcrypt_config_prefix/bin/libgcrypt-config
+ fi
+ fi
+
+ # Extract the first word of "libgcrypt-config", so it can be a program name with args.
+set dummy libgcrypt-config; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_path_LIBGCRYPT_CONFIG+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ case $LIBGCRYPT_CONFIG in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_LIBGCRYPT_CONFIG="$LIBGCRYPT_CONFIG" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_path_LIBGCRYPT_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+IFS=$as_save_IFS
+
+ test -z "$ac_cv_path_LIBGCRYPT_CONFIG" && ac_cv_path_LIBGCRYPT_CONFIG="no"
+ ;;
+esac
+fi
+LIBGCRYPT_CONFIG=$ac_cv_path_LIBGCRYPT_CONFIG
+if test -n "$LIBGCRYPT_CONFIG"; then
+ { echo "$as_me:$LINENO: result: $LIBGCRYPT_CONFIG" >&5
+echo "${ECHO_T}$LIBGCRYPT_CONFIG" >&6; }
+else
+ { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+ tmp=1:1.2.0
+ if echo "$tmp" | grep ':' >/dev/null 2>/dev/null ; then
+ req_libgcrypt_api=`echo "$tmp" | sed 's/\(.*\):\(.*\)/\1/'`
+ min_libgcrypt_version=`echo "$tmp" | sed 's/\(.*\):\(.*\)/\2/'`
+ else
+ req_libgcrypt_api=0
+ min_libgcrypt_version="$tmp"
+ fi
+
+ { echo "$as_me:$LINENO: checking for LIBGCRYPT - version >= $min_libgcrypt_version" >&5
+echo $ECHO_N "checking for LIBGCRYPT - version >= $min_libgcrypt_version... $ECHO_C" >&6; }
+ ok=no
+ if test "$LIBGCRYPT_CONFIG" != "no" ; then
+ req_major=`echo $min_libgcrypt_version | \
+ sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\1/'`
+ req_minor=`echo $min_libgcrypt_version | \
+ sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\2/'`
+ req_micro=`echo $min_libgcrypt_version | \
+ sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\3/'`
+ libgcrypt_config_version=`$LIBGCRYPT_CONFIG --version`
+ major=`echo $libgcrypt_config_version | \
+ sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\).*/\1/'`
+ minor=`echo $libgcrypt_config_version | \
+ sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\).*/\2/'`
+ micro=`echo $libgcrypt_config_version | \
+ sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\).*/\3/'`
+ if test "$major" -gt "$req_major"; then
+ ok=yes
+ else
+ if test "$major" -eq "$req_major"; then
+ if test "$minor" -gt "$req_minor"; then
+ ok=yes
+ else
+ if test "$minor" -eq "$req_minor"; then
+ if test "$micro" -ge "$req_micro"; then
+ ok=yes
+ fi
+ fi
+ fi
+ fi
+ fi
+ fi
+ if test $ok = yes; then
+ { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+ else
+ { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+ fi
+ if test $ok = yes; then
+ # If we have a recent libgcrypt, we should also check that the
+ # API is compatible
+ if test "$req_libgcrypt_api" -gt 0 ; then
+ tmp=`$LIBGCRYPT_CONFIG --api-version 2>/dev/null || echo 0`
+ if test "$tmp" -gt 0 ; then
+ { echo "$as_me:$LINENO: checking LIBGCRYPT API version" >&5
+echo $ECHO_N "checking LIBGCRYPT API version... $ECHO_C" >&6; }
+ if test "$req_libgcrypt_api" -eq "$tmp" ; then
+ { echo "$as_me:$LINENO: result: okay" >&5
+echo "${ECHO_T}okay" >&6; }
+ else
+ ok=no
+ { echo "$as_me:$LINENO: result: does not match (want=$req_libgcrypt_api got=$tmp)" >&5
+echo "${ECHO_T}does not match (want=$req_libgcrypt_api got=$tmp)" >&6; }
+ fi
+ fi
+ fi
+ fi
+ if test $ok = yes; then
+ LIBGCRYPT_CFLAGS=`$LIBGCRYPT_CONFIG --cflags`
+ LIBGCRYPT_LIBS=`$LIBGCRYPT_CONFIG --libs`
+ have_ssl=yes
+ else
+ LIBGCRYPT_CFLAGS=""
+ LIBGCRYPT_LIBS=""
+ have_ssl=no
+ fi
+
+
+
fi
if test "$have_ssl" = "yes"; then
@@ -22828,6 +23081,120 @@ cat >>confdefs.h <<\_ACEOF
_ACEOF
SSL_REQUIREMENT="gnutls"
+
+ old_LDFLAGS="$LDFLAGS"
+ LDFLAGS="$LDFLAGS $LIBGNUTLS_LIBS $LIBGCRYPT_LIBS"
+
+for ac_func in gnutls_certificate_client_set_sign_function
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $ac_func ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined __stub_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+ { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+ LDFLAGS="$old_LDFLAGS"
else
if test "$enable_ssl" = "auto"; then
{ echo "$as_me:$LINENO: WARNING: Disabling SSL support" >&5
@@ -22847,6 +23214,17 @@ fi
+if test $enable_ssl != no; then
+ HAVE_SSL_TRUE=
+ HAVE_SSL_FALSE='#'
+else
+ HAVE_SSL_TRUE='#'
+ HAVE_SSL_FALSE=
+fi
+
+
+
+
# Check whether --with-html-dir was given.
if test "${with_html_dir+set}" = set; then
withval=$with_html_dir;
@@ -23061,11 +23439,17 @@ if test "${with_apache_module_dir+set}"
withval=$with_apache_module_dir; APACHE_MODULE_DIR="$withval"
else
apache_prefix=`dirname \`dirname $APACHE_HTTPD\``
+ mpm=`$APACHE_HTTPD -V | sed -ne 's/^Server MPM: */-/p' | tr 'A-Z' 'a-z'`
# This only works with bash, but should fail harmlessly in sh
- for dir in $apache_prefix/lib{64,}/{apache,http}{2,}{/modules,}; do
+ for dir in $apache_prefix/lib{64,}/{apache,http}{2,}{$mpm,}{/modules,}; do
if test -f $dir/mod_auth_digest.so; then
APACHE_MODULE_DIR="$dir"
- break
+ fi
+ if test -f $dir/mod_ssl.so; then
+ APACHE_SSL_MODULE_DIR="$dir"
+ fi
+ if test -f $dir/mod_php5.so; then
+ APACHE_PHP_MODULE_DIR="$dir"
fi
done
fi
@@ -23073,6 +23457,8 @@ fi
{ echo "$as_me:$LINENO: result: $APACHE_MODULE_DIR" >&5
echo "${ECHO_T}$APACHE_MODULE_DIR" >&6; }
+
+
fi
if test "$APACHE_HTTPD" != "no" -a -n "$APACHE_MODULE_DIR"; then
@@ -23099,7 +23485,7 @@ fi
if test "$have_apache" = 1; then
{ echo "$as_me:$LINENO: checking for mod_php5" >&5
echo $ECHO_N "checking for mod_php5... $ECHO_C" >&6; }
- if test -f $APACHE_MODULE_DIR/mod_php5.so; then
+ if test -f $APACHE_PHP_MODULE_DIR/mod_php5.so; then
have_php=yes
IF_HAVE_PHP=""
else
@@ -23276,6 +23662,13 @@ echo "$as_me: error: conditional \"OS_WI
Usually this means the macro was only invoked conditionally." >&2;}
{ (exit 1); exit 1; }; }
fi
+if test -z "${HAVE_SSL_TRUE}" && test -z "${HAVE_SSL_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"HAVE_SSL\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"HAVE_SSL\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
if test -z "${ENABLE_GTK_DOC_TRUE}" && test -z "${ENABLE_GTK_DOC_FALSE}"; then
{ { echo "$as_me:$LINENO: error: conditional \"ENABLE_GTK_DOC\" was never defined.
Usually this means the macro was only invoked conditionally." >&5
@@ -23994,7 +24387,12 @@ OS_WIN32_TRUE!$OS_WIN32_TRUE$ac_delim
OS_WIN32_FALSE!$OS_WIN32_FALSE$ac_delim
LIBGNUTLS_CFLAGS!$LIBGNUTLS_CFLAGS$ac_delim
LIBGNUTLS_LIBS!$LIBGNUTLS_LIBS$ac_delim
+LIBGCRYPT_CONFIG!$LIBGCRYPT_CONFIG$ac_delim
+LIBGCRYPT_CFLAGS!$LIBGCRYPT_CFLAGS$ac_delim
+LIBGCRYPT_LIBS!$LIBGCRYPT_LIBS$ac_delim
SSL_REQUIREMENT!$SSL_REQUIREMENT$ac_delim
+HAVE_SSL_TRUE!$HAVE_SSL_TRUE$ac_delim
+HAVE_SSL_FALSE!$HAVE_SSL_FALSE$ac_delim
HTML_DIR!$HTML_DIR$ac_delim
ENABLE_GTK_DOC_TRUE!$ENABLE_GTK_DOC_TRUE$ac_delim
ENABLE_GTK_DOC_FALSE!$ENABLE_GTK_DOC_FALSE$ac_delim
@@ -24002,6 +24400,8 @@ GTK_DOC_USE_LIBTOOL_TRUE!$GTK_DOC_USE_LI
GTK_DOC_USE_LIBTOOL_FALSE!$GTK_DOC_USE_LIBTOOL_FALSE$ac_delim
APACHE_HTTPD!$APACHE_HTTPD$ac_delim
APACHE_MODULE_DIR!$APACHE_MODULE_DIR$ac_delim
+APACHE_SSL_MODULE_DIR!$APACHE_SSL_MODULE_DIR$ac_delim
+APACHE_PHP_MODULE_DIR!$APACHE_PHP_MODULE_DIR$ac_delim
HAVE_APACHE_TRUE!$HAVE_APACHE_TRUE$ac_delim
HAVE_APACHE_FALSE!$HAVE_APACHE_FALSE$ac_delim
IF_HAVE_PHP!$IF_HAVE_PHP$ac_delim
@@ -24011,7 +24411,7 @@ LIBOBJS!$LIBOBJS$ac_delim
LTLIBOBJS!$LTLIBOBJS$ac_delim
_ACEOF
- if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 42; then
+ if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 49; then
break
elif $ac_last_try; then
{ { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
diff -ruNp /home/jacob/Scratch/libsoup-2.2.100/configure.in libsoup-2.2.100/configure.in
--- /home/jacob/Scratch/libsoup-2.2.100/configure.in 2007-02-12 10:18:49.000000000 -0500
+++ libsoup-2.2.100/configure.in 2007-05-01 16:00:48.000000000 -0400
@@ -73,7 +73,7 @@ dnl ***********************
dnl *** Checks for glib ***
dnl ***********************
-AM_PATH_GLIB_2_0(2.6.0,,,gobject gthread)
+AM_PATH_GLIB_2_0(2.12.0,,,gobject gthread)
PKG_CHECK_MODULES(XML, libxml-2.0)
AC_SUBST(XML_CFLAGS)
@@ -106,6 +106,7 @@ dnl *******************
dnl *** Misc checks ***
dnl *******************
AC_CHECK_FUNCS(gmtime_r)
+AC_CHECK_FUNCS(timegm)
dnl *********************************
dnl *** Networking library checks ***
@@ -134,7 +135,8 @@ AC_ARG_ENABLE(ssl,
enable_ssl=auto)
if test "$enable_ssl" != "no"; then
- PKG_CHECK_MODULES(LIBGNUTLS, gnutls, have_ssl=yes, have_ssl=no)
+ PKG_CHECK_MODULES(LIBGNUTLS, gnutls,
+ [AM_PATH_LIBGCRYPT([], have_ssl=yes, have_ssl=no)], have_ssl=no)
if test "$have_ssl" = "yes"; then
AC_DEFINE(HAVE_SSL, 1, [Defined if you have SSL support])
SSL_REQUIREMENT="gnutls"
@@ -152,6 +154,9 @@ AC_SUBST(LIBGNUTLS_CFLAGS)
AC_SUBST(LIBGNUTLS_LIBS)
AC_SUBST(SSL_REQUIREMENT)
+dnl This is not supposed to be conditional, but...
+AM_CONDITIONAL(HAVE_SSL, test $enable_ssl != no)
+
dnl ***************
dnl *** gtk-doc ***
dnl ***************
@@ -207,15 +212,23 @@ if test "$APACHE_HTTPD" != "no"; then
[ --with-apache-module-dir Apache modules dir (for tests)],
APACHE_MODULE_DIR="$withval",
[apache_prefix=`dirname \`dirname $APACHE_HTTPD\``
+ mpm=`$APACHE_HTTPD -V | sed -ne 's/^Server MPM: */-/p' | tr 'A-Z' 'a-z'`
# This only works with bash, but should fail harmlessly in sh
- for dir in $apache_prefix/lib{64,}/{apache,http}{2,}{/modules,}; do
+ for dir in $apache_prefix/lib{64,}/{apache,http}{2,}{$mpm,}{/modules,}; do
if test -f $dir/mod_auth_digest.so; then
APACHE_MODULE_DIR="$dir"
- break
+ fi
+ if test -f $dir/mod_ssl.so; then
+ APACHE_SSL_MODULE_DIR="$dir"
+ fi
+ if test -f $dir/mod_php5.so; then
+ APACHE_PHP_MODULE_DIR="$dir"
fi
done])
AC_MSG_RESULT($APACHE_MODULE_DIR)
AC_SUBST(APACHE_MODULE_DIR)
+ AC_SUBST(APACHE_SSL_MODULE_DIR)
+ AC_SUBST(APACHE_PHP_MODULE_DIR)
fi
if test "$APACHE_HTTPD" != "no" -a -n "$APACHE_MODULE_DIR"; then
@@ -228,7 +241,7 @@ AM_CONDITIONAL(HAVE_APACHE, test $have_a
if test "$have_apache" = 1; then
AC_MSG_CHECKING([for mod_php5])
- if test -f $APACHE_MODULE_DIR/mod_php5.so; then
+ if test -f $APACHE_PHP_MODULE_DIR/mod_php5.so; then
have_php=yes
IF_HAVE_PHP=""
else
diff -ruNp /home/jacob/Scratch/libsoup-2.2.100/libsoup/Makefile.am libsoup-2.2.100/libsoup/Makefile.am
--- /home/jacob/Scratch/libsoup-2.2.100/libsoup/Makefile.am 2007-01-02 13:25:11.000000000 -0500
+++ libsoup-2.2.100/libsoup/Makefile.am 2007-04-09 17:03:24.000000000 -0400
@@ -10,6 +10,7 @@ INCLUDES = \
$(SOUP_DEBUG_FLAGS) \
$(GLIB_CFLAGS) \
$(XML_CFLAGS) \
+ $(LIBGCRYPT_CFLAGS) \
$(LIBGNUTLS_CFLAGS)
MARSHAL_GENERATED = soup-marshal.c soup-marshal.h
@@ -67,6 +68,7 @@ libsoup_2_2_la_LIBADD = \
$(XML_LIBS) \
$(LIBGNUTLS_LIBS_STATIC) \
$(LIBGNUTLS_LIBS) \
+ $(LIBGCRYPT_LIBS) \
$(LIBWS2_32)
libsoup_2_2_la_SOURCES = \
diff -ruNp /home/jacob/Scratch/libsoup-2.2.100/libsoup/Makefile.in libsoup-2.2.100/libsoup/Makefile.in
--- /home/jacob/Scratch/libsoup-2.2.100/libsoup/Makefile.in 2007-02-12 10:34:11.000000000 -0500
+++ libsoup-2.2.100/libsoup/Makefile.in 2007-05-01 15:49:10.000000000 -0400
@@ -61,7 +61,7 @@ LTLIBRARIES = $(lib_LTLIBRARIES)
am__DEPENDENCIES_1 =
libsoup_2_2_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \
$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1)
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
am__objects_1 = soup-marshal.lo
am_libsoup_2_2_la_OBJECTS = $(am__objects_1) soup-address.lo \
soup-auth.lo soup-auth-basic.lo soup-auth-digest.lo \
@@ -102,6 +102,8 @@ AMDEP_TRUE = @AMDEP_TRUE@
AMTAR = @AMTAR@
APACHE_HTTPD = @APACHE_HTTPD@
APACHE_MODULE_DIR = @APACHE_MODULE_DIR@
+APACHE_PHP_MODULE_DIR = @APACHE_PHP_MODULE_DIR@
+APACHE_SSL_MODULE_DIR = @APACHE_SSL_MODULE_DIR@
AR = @AR@
AS = @AS@
AUTOCONF = @AUTOCONF@
@@ -141,6 +143,8 @@ GTK_DOC_USE_LIBTOOL_FALSE = @GTK_DOC_USE
GTK_DOC_USE_LIBTOOL_TRUE = @GTK_DOC_USE_LIBTOOL_TRUE@
HAVE_APACHE_FALSE = @HAVE_APACHE_FALSE@
HAVE_APACHE_TRUE = @HAVE_APACHE_TRUE@
+HAVE_SSL_FALSE = @HAVE_SSL_FALSE@
+HAVE_SSL_TRUE = @HAVE_SSL_TRUE@
HAVE_XMLRPC_EPI_PHP_FALSE = @HAVE_XMLRPC_EPI_PHP_FALSE@
HAVE_XMLRPC_EPI_PHP_TRUE = @HAVE_XMLRPC_EPI_PHP_TRUE@
HTML_DIR = @HTML_DIR@
@@ -150,6 +154,9 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_SCRIPT = @INSTALL_SCRIPT@
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
LDFLAGS = @LDFLAGS@
+LIBGCRYPT_CFLAGS = @LIBGCRYPT_CFLAGS@
+LIBGCRYPT_CONFIG = @LIBGCRYPT_CONFIG@
+LIBGCRYPT_LIBS = @LIBGCRYPT_LIBS@
LIBGNUTLS_CFLAGS = @LIBGNUTLS_CFLAGS@
LIBGNUTLS_LIBS = @LIBGNUTLS_LIBS@
LIBOBJS = @LIBOBJS@
@@ -240,6 +247,7 @@ INCLUDES = \
$(SOUP_DEBUG_FLAGS) \
$(GLIB_CFLAGS) \
$(XML_CFLAGS) \
+ $(LIBGCRYPT_CFLAGS) \
$(LIBGNUTLS_CFLAGS)
MARSHAL_GENERATED = soup-marshal.c soup-marshal.h
@@ -282,6 +290,7 @@ libsoup_2_2_la_LIBADD = \
$(XML_LIBS) \
$(LIBGNUTLS_LIBS_STATIC) \
$(LIBGNUTLS_LIBS) \
+ $(LIBGCRYPT_LIBS) \
$(LIBWS2_32)
libsoup_2_2_la_SOURCES = \
diff -ruNp /home/jacob/Scratch/libsoup-2.2.100/libsoup/soup-auth-basic.c libsoup-2.2.100/libsoup/soup-auth-basic.c
--- /home/jacob/Scratch/libsoup-2.2.100/libsoup/soup-auth-basic.c 2007-01-02 13:25:11.000000000 -0500
+++ libsoup-2.2.100/libsoup/soup-auth-basic.c 2007-04-09 17:03:24.000000000 -0400
@@ -118,7 +118,7 @@ authenticate (SoupAuth *auth, const char
user_pass = g_strdup_printf ("%s:%s", username, password);
len = strlen (user_pass);
- priv->token = soup_base64_encode (user_pass, len);
+ priv->token = g_base64_encode ((guchar *)user_pass, len);
memset (user_pass, 0, len);
g_free (user_pass);
diff -ruNp /home/jacob/Scratch/libsoup-2.2.100/libsoup/soup-auth-digest.c libsoup-2.2.100/libsoup/soup-auth-digest.c
--- /home/jacob/Scratch/libsoup-2.2.100/libsoup/soup-auth-digest.c 2007-01-02 13:25:11.000000000 -0500
+++ libsoup-2.2.100/libsoup/soup-auth-digest.c 2007-04-09 17:03:24.000000000 -0400
@@ -1,4 +1,4 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-digest-offset: 8 -*- */
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
/*
* soup-auth-digest.c: HTTP Digest Authentication
*
@@ -258,7 +258,7 @@ authenticate (SoupAuth *auth, const char
auth,
(unsigned long) getpid (),
(unsigned long) time (0));
- priv->cnonce = soup_base64_encode (bgen, strlen (bgen));
+ priv->cnonce = g_base64_encode ((guchar *)bgen, strlen (bgen));
g_free (bgen);
priv->user = g_strdup (username);
diff -ruNp /home/jacob/Scratch/libsoup-2.2.100/libsoup/soup-connection-ntlm.c libsoup-2.2.100/libsoup/soup-connection-ntlm.c
--- /home/jacob/Scratch/libsoup-2.2.100/libsoup/soup-connection-ntlm.c 2007-01-02 13:25:11.000000000 -0500
+++ libsoup-2.2.100/libsoup/soup-connection-ntlm.c 2007-04-09 17:03:24.000000000 -0400
@@ -328,25 +328,14 @@ soup_ntlm_parse_challenge (const char *c
char **nonce,
char **default_domain)
{
- int clen, decodelen;
+ gsize clen;
NTLMString domain;
guchar *chall;
- int state;
- unsigned int save;
if (strncmp (challenge, "NTLM ", 5) != 0)
return FALSE;
- decodelen = strlen (challenge) - 5;
- chall = g_malloc (decodelen);
-
- state = save = 0;
- clen = soup_base64_decode_step ((const guchar *) challenge + 5,
- decodelen,
- chall,
- &state,
- &save);
-
+ chall = g_base64_decode (challenge + 5, &clen);
if (clen < NTLM_CHALLENGE_DOMAIN_STRING_OFFSET ||
clen < NTLM_CHALLENGE_NONCE_OFFSET + NTLM_CHALLENGE_NONCE_LENGTH) {
g_free (chall);
@@ -385,7 +374,7 @@ soup_ntlm_response (const char *nonce,
int hlen, dlen, ulen, offset;
guchar hash[21], lm_resp[24], nt_resp[24];
NTLMResponse resp;
- guchar *out, *p;
+ char *out, *p;
int state, save;
nt_hash (password, hash);
@@ -411,51 +400,27 @@ soup_ntlm_response (const char *nonce,
ntlm_set_string (&resp.nt_resp, &offset, sizeof (nt_resp));
out = g_malloc (((offset + 3) * 4) / 3 + 6);
- strncpy ((char *)out, "NTLM ", 5);
+ strncpy (out, "NTLM ", 5);
p = out + 5;
state = save = 0;
- p += soup_base64_encode_step ((guchar *) &resp,
- sizeof (resp),
- FALSE,
- p,
- &state,
- &save);
- p += soup_base64_encode_step ((const guchar *) domain,
- dlen,
- FALSE,
- p,
- &state,
- &save);
- p += soup_base64_encode_step ((const guchar *) user,
- ulen,
- FALSE,
- p,
- &state,
- &save);
- p += soup_base64_encode_step ((const guchar *) host,
- hlen,
- FALSE,
- p,
- &state,
- &save);
- p += soup_base64_encode_step (lm_resp,
- sizeof (lm_resp),
- FALSE,
- p,
- &state,
- &save);
-
- p += soup_base64_encode_close (nt_resp,
- sizeof (nt_resp),
- FALSE,
- p,
- &state,
- &save);
+ p += g_base64_encode_step ((const guchar *) &resp, sizeof (resp),
+ FALSE, p, &state, &save);
+ p += g_base64_encode_step ((const guchar *) domain, dlen,
+ FALSE, p, &state, &save);
+ p += g_base64_encode_step ((const guchar *) user, ulen,
+ FALSE, p, &state, &save);
+ p += g_base64_encode_step ((const guchar *) host, hlen,
+ FALSE, p, &state, &save);
+ p += g_base64_encode_step (lm_resp, sizeof (lm_resp),
+ FALSE, p, &state, &save);
+ p += g_base64_encode_step (nt_resp, sizeof (nt_resp),
+ FALSE, p, &state, &save);
+ p += g_base64_encode_close (FALSE, p, &state, &save);
*p = '\0';
- return (char *)out;
+ return out;
}
/* DES utils */
diff -ruNp /home/jacob/Scratch/libsoup-2.2.100/libsoup/soup-date.c libsoup-2.2.100/libsoup/soup-date.c
--- /home/jacob/Scratch/libsoup-2.2.100/libsoup/soup-date.c 2007-01-02 13:25:11.000000000 -0500
+++ libsoup-2.2.100/libsoup/soup-date.c 2007-04-09 17:03:24.000000000 -0400
@@ -26,10 +26,6 @@ static const char *days[] = {
"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
};
-static const int days_before[] = {
- 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334
-};
-
static int
parse_month (const char *month)
{
@@ -54,12 +50,18 @@ parse_month (const char *month)
time_t
soup_mktime_utc (struct tm *tm)
{
+#if HAVE_TIMEGM
+ return timegm (tm);
+#else
time_t tt;
+ static const int days_before[] = {
+ 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334
+ };
/* We check the month because (a) if we don't, the
* days_before[] part below may access random memory, and (b)
* soup_date_parse() doesn't check the return value of
- * parse_month(). The caller is responsible for ensure the
+ * parse_month(). The caller is responsible for ensuring the
* sanity of everything else.
*/
if (tm->tm_mon < 0 || tm->tm_mon > 11)
@@ -71,7 +73,9 @@ soup_mktime_utc (struct tm *tm)
if (tm->tm_year % 4 == 0 && tm->tm_mon < 2)
tt--;
tt = ((((tt * 24) + tm->tm_hour) * 60) + tm->tm_min) * 60 + tm->tm_sec;
+
return tt;
+#endif
}
/**
@@ -185,6 +189,7 @@ char *
soup_date_generate (time_t when)
{
struct tm tm;
+
soup_gmtime (&when, &tm);
/* RFC1123 format, eg, "Sun, 06 Nov 1994 08:49:37 GMT" */
@@ -206,59 +211,10 @@ soup_date_generate (time_t when)
time_t
soup_date_iso8601_parse (const char *timestamp)
{
- struct tm tm;
- long val;
- time_t tt;
-
- val = strtoul (timestamp, (char **)×tamp, 10);
- if (*timestamp == '-') {
- // YYYY-MM-DD
- tm.tm_year = val - 1900;
- timestamp++;
- tm.tm_mon = strtoul (timestamp, (char **)×tamp, 10) - 1;
- if (*timestamp++ != '-')
- return -1;
- tm.tm_mday = strtoul (timestamp, (char **)×tamp, 10);
- } else {
- // YYYYMMDD
- tm.tm_mday = val % 100;
- tm.tm_mon = (val % 10000) / 100 - 1;
- tm.tm_year = val / 10000 - 1900;
- }
-
- if (*timestamp++ != 'T')
- return -1;
-
- val = strtoul (timestamp, (char **)×tamp, 10);
- if (*timestamp == ':') {
- // hh:mm:ss
- tm.tm_hour = val;
- timestamp++;
- tm.tm_min = strtoul (timestamp, (char **)×tamp, 10);
- if (*timestamp++ != ':')
- return -1;
- tm.tm_sec = strtoul (timestamp, (char **)×tamp, 10);
- } else {
- // hhmmss
- tm.tm_sec = val % 100;
- tm.tm_min = (val % 10000) / 100;
- tm.tm_hour = val / 10000;
- }
+ GTimeVal timeval;
- tt = soup_mktime_utc (&tm);
+ if (!g_time_val_from_iso8601 (timestamp, &timeval))
+ return (time_t) -1;
- if (*timestamp == '.')
- strtoul (timestamp + 1, (char **)×tamp, 10);
-
- if (*timestamp == '+' || *timestamp == '-') {
- int sign = (*timestamp == '+') ? -1 : 1;
- val = strtoul (timestamp + 1, (char **)×tamp, 10);
- if (*timestamp == ':')
- val = 60 * val + strtoul (timestamp + 1, NULL, 10);
- else
- val = 60 * (val / 100) + (val % 100);
- tt += sign * val;
- }
-
- return tt;
+ return (time_t) timeval.tv_sec;
}
diff -ruNp /home/jacob/Scratch/libsoup-2.2.100/libsoup/soup-gnutls.c libsoup-2.2.100/libsoup/soup-gnutls.c
--- /home/jacob/Scratch/libsoup-2.2.100/libsoup/soup-gnutls.c 2007-01-02 13:25:11.000000000 -0500
+++ libsoup-2.2.100/libsoup/soup-gnutls.c 2007-05-01 16:00:48.000000000 -0400
@@ -2,10 +2,7 @@
/*
* soup-gnutls.c
*
- * Authors:
- * Ian Peters <itp@ximian.com>
- *
- * Copyright (C) 2003, Ximian, Inc.
+ * Copyright (C) 2003-2006, Novell, Inc.
*/
#ifdef HAVE_CONFIG_H
@@ -15,6 +12,7 @@
#ifdef HAVE_SSL
#include <errno.h>
+#include <fcntl.h>
#include <pthread.h>
#include <stdlib.h>
#include <string.h>
@@ -32,17 +30,17 @@ gboolean soup_ssl_supported = TRUE;
#define DH_BITS 1024
-typedef struct {
- gnutls_certificate_credentials cred;
+struct SoupSSLCredentials {
+ gnutls_certificate_credentials creds;
gboolean have_ca_file;
-} SoupGNUTLSCred;
+};
typedef struct {
GIOChannel channel;
int fd;
GIOChannel *real_sock;
gnutls_session session;
- SoupGNUTLSCred *cred;
+ SoupSSLCredentials *creds;
char *hostname;
gboolean established;
SoupSSLType type;
@@ -129,21 +127,26 @@ verify_certificate (gnutls_session sessi
return TRUE;
}
+#define SOUP_GNUTLS_CHANNEL_NONBLOCKING(chan) (fcntl ((chan)->fd, F_GETFL, 0) & O_NONBLOCK)
+
static GIOStatus
do_handshake (SoupGNUTLSChannel *chan, GError **err)
{
int result;
+again:
result = gnutls_handshake (chan->session);
- if (result == GNUTLS_E_AGAIN ||
- result == GNUTLS_E_INTERRUPTED) {
- g_set_error (err, SOUP_SSL_ERROR,
- (gnutls_record_get_direction (chan->session) ?
- SOUP_SSL_ERROR_HANDSHAKE_NEEDS_WRITE :
- SOUP_SSL_ERROR_HANDSHAKE_NEEDS_READ),
- "Handshaking...");
- return G_IO_STATUS_AGAIN;
+ if (result == GNUTLS_E_AGAIN || result == GNUTLS_E_INTERRUPTED) {
+ if (SOUP_GNUTLS_CHANNEL_NONBLOCKING (chan)) {
+ g_set_error (err, SOUP_SSL_ERROR,
+ (gnutls_record_get_direction (chan->session) ?
+ SOUP_SSL_ERROR_HANDSHAKE_NEEDS_WRITE :
+ SOUP_SSL_ERROR_HANDSHAKE_NEEDS_READ),
+ "Handshaking...");
+ return G_IO_STATUS_AGAIN;
+ } else
+ goto again;
}
if (result < 0) {
@@ -153,7 +156,7 @@ do_handshake (SoupGNUTLSChannel *chan, G
return G_IO_STATUS_ERROR;
}
- if (chan->type == SOUP_SSL_TYPE_CLIENT && chan->cred->have_ca_file &&
+ if (chan->type == SOUP_SSL_TYPE_CLIENT && chan->creds->have_ca_file &&
!verify_certificate (chan->session, chan->hostname, err))
return G_IO_STATUS_ERROR;
@@ -172,6 +175,7 @@ soup_gnutls_read (GIOChannel *channel,
*bytes_read = 0;
+again:
if (!chan->established) {
result = do_handshake (chan, err);
@@ -186,13 +190,17 @@ soup_gnutls_read (GIOChannel *channel,
if (result == GNUTLS_E_REHANDSHAKE) {
chan->established = FALSE;
- return G_IO_STATUS_AGAIN;
+ goto again;
}
- if (result < 0) {
- if ((result == GNUTLS_E_INTERRUPTED) ||
- (result == GNUTLS_E_AGAIN))
+ if (result == GNUTLS_E_INTERRUPTED || result == GNUTLS_E_AGAIN) {
+ if (SOUP_GNUTLS_CHANNEL_NONBLOCKING (chan))
return G_IO_STATUS_AGAIN;
+ else
+ goto again;
+ }
+
+ if (result < 0) {
g_set_error (err, G_IO_CHANNEL_ERROR,
G_IO_CHANNEL_ERROR_FAILED,
"Received corrupted data");
@@ -216,6 +224,7 @@ soup_gnutls_write (GIOChannel *channel
*bytes_written = 0;
+again:
if (!chan->established) {
result = do_handshake (chan, err);
@@ -228,15 +237,22 @@ soup_gnutls_write (GIOChannel *channel
result = gnutls_record_send (chan->session, buf, count);
+ /* I'm pretty sure this can't actually happen in response to a
+ * write, but...
+ */
if (result == GNUTLS_E_REHANDSHAKE) {
chan->established = FALSE;
- return G_IO_STATUS_AGAIN;
+ goto again;
}
- if (result < 0) {
- if ((result == GNUTLS_E_INTERRUPTED) ||
- (result == GNUTLS_E_AGAIN))
+ if (result == GNUTLS_E_INTERRUPTED || result == GNUTLS_E_AGAIN) {
+ if (SOUP_GNUTLS_CHANNEL_NONBLOCKING (chan))
return G_IO_STATUS_AGAIN;
+ else
+ goto again;
+ }
+
+ if (result < 0) {
g_set_error (err, G_IO_CHANNEL_ERROR,
G_IO_CHANNEL_ERROR_FAILED,
"Received corrupted data");
@@ -352,7 +368,7 @@ THROW_CREATE_ERROR:
* @sock: a #GIOChannel wrapping a TCP socket.
* @type: whether this is a client or server socket
* @remote_host: the hostname of the remote machine
- * @credentials: a client or server credentials structure
+ * @creds: a client or server credentials structure
*
* This attempts to wrap a new #GIOChannel around @sock that
* will SSL-encrypt/decrypt all traffic through it.
@@ -362,17 +378,16 @@ THROW_CREATE_ERROR:
**/
GIOChannel *
soup_ssl_wrap_iochannel (GIOChannel *sock, SoupSSLType type,
- const char *remote_host, gpointer credentials)
+ const char *remote_host, SoupSSLCredentials *creds)
{
SoupGNUTLSChannel *chan = NULL;
GIOChannel *gchan = NULL;
gnutls_session session = NULL;
- SoupGNUTLSCred *cred = credentials;
int sockfd;
int ret;
g_return_val_if_fail (sock != NULL, NULL);
- g_return_val_if_fail (credentials != NULL, NULL);
+ g_return_val_if_fail (creds != NULL, NULL);
sockfd = g_io_channel_unix_get_fd (sock);
if (!sockfd) {
@@ -389,7 +404,7 @@ soup_ssl_wrap_iochannel (GIOChannel *soc
goto THROW_CREATE_ERROR;
if (gnutls_credentials_set (session, GNUTLS_CRD_CERTIFICATE,
- cred->cred) != 0)
+ creds->creds) != 0)
goto THROW_CREATE_ERROR;
if (type == SOUP_SSL_TYPE_SERVER)
@@ -401,7 +416,7 @@ soup_ssl_wrap_iochannel (GIOChannel *soc
chan->fd = sockfd;
chan->real_sock = sock;
chan->session = session;
- chan->cred = cred;
+ chan->creds = creds;
chan->hostname = g_strdup (remote_host);
chan->type = type;
g_io_channel_ref (sock);
@@ -451,22 +466,22 @@ soup_gnutls_init (void)
* Return value: the client credentials, which must be freed with
* soup_ssl_free_client_credentials().
**/
-gpointer
+SoupSSLCredentials *
soup_ssl_get_client_credentials (const char *ca_file)
{
- SoupGNUTLSCred *cred;
+ SoupSSLCredentials *creds;
int status;
if (!soup_gnutls_inited)
soup_gnutls_init ();
- cred = g_new0 (SoupGNUTLSCred, 1);
- gnutls_certificate_allocate_credentials (&cred->cred);
+ creds = g_new0 (SoupSSLCredentials, 1);
+ gnutls_certificate_allocate_credentials (&creds->creds);
if (ca_file) {
- cred->have_ca_file = TRUE;
+ creds->have_ca_file = TRUE;
status = gnutls_certificate_set_x509_trust_file (
- cred->cred, ca_file, GNUTLS_X509_FMT_PEM);
+ creds->creds, ca_file, GNUTLS_X509_FMT_PEM);
if (status < 0) {
g_warning ("Failed to set SSL trust file (%s).",
ca_file);
@@ -478,7 +493,7 @@ soup_ssl_get_client_credentials (const c
}
}
- return cred;
+ return creds;
}
/**
@@ -486,15 +501,13 @@ soup_ssl_get_client_credentials (const c
* @creds: a client credentials structure returned by
* soup_ssl_get_client_credentials().
*
- * Frees @client_creds.
+ * Frees @creds.
**/
void
-soup_ssl_free_client_credentials (gpointer creds)
+soup_ssl_free_client_credentials (SoupSSLCredentials *creds)
{
- SoupGNUTLSCred *cred = creds;
-
- gnutls_certificate_free_credentials (cred->cred);
- g_free (cred);
+ gnutls_certificate_free_credentials (creds->creds);
+ g_free (creds);
}
/**
@@ -510,10 +523,10 @@ soup_ssl_free_client_credentials (gpoint
* Return value: the server credentials, which must be freed with
* soup_ssl_free_server_credentials().
**/
-gpointer
+SoupSSLCredentials *
soup_ssl_get_server_credentials (const char *cert_file, const char *key_file)
{
- SoupGNUTLSCred *cred;
+ SoupSSLCredentials *creds;
if (!soup_gnutls_inited)
soup_gnutls_init ();
@@ -522,20 +535,20 @@ soup_ssl_get_server_credentials (const c
return NULL;
}
- cred = g_new0 (SoupGNUTLSCred, 1);
- gnutls_certificate_allocate_credentials (&cred->cred);
+ creds = g_new0 (SoupSSLCredentials, 1);
+ gnutls_certificate_allocate_credentials (&creds->creds);
- if (gnutls_certificate_set_x509_key_file (cred->cred,
+ if (gnutls_certificate_set_x509_key_file (creds->creds,
cert_file, key_file,
GNUTLS_X509_FMT_PEM) != 0) {
g_warning ("Failed to set SSL certificate and key files "
"(%s, %s).", cert_file, key_file);
- soup_ssl_free_server_credentials (cred);
+ soup_ssl_free_server_credentials (creds);
return NULL;
}
- gnutls_certificate_set_dh_params (cred->cred, dh_params);
- return cred;
+ gnutls_certificate_set_dh_params (creds->creds, dh_params);
+ return creds;
}
/**
@@ -543,15 +556,13 @@ soup_ssl_get_server_credentials (const c
* @creds: a server credentials structure returned by
* soup_ssl_get_server_credentials().
*
- * Frees @server_creds.
+ * Frees @creds.
**/
void
-soup_ssl_free_server_credentials (gpointer creds)
+soup_ssl_free_server_credentials (SoupSSLCredentials *creds)
{
- SoupGNUTLSCred *cred = creds;
-
- gnutls_certificate_free_credentials (cred->cred);
- g_free (cred);
+ gnutls_certificate_free_credentials (creds->creds);
+ g_free (creds);
}
#endif /* HAVE_SSL */
diff -ruNp /home/jacob/Scratch/libsoup-2.2.100/libsoup/soup-message.c libsoup-2.2.100/libsoup/soup-message.c
--- /home/jacob/Scratch/libsoup-2.2.100/libsoup/soup-message.c 2007-01-02 13:25:11.000000000 -0500
+++ libsoup-2.2.100/libsoup/soup-message.c 2007-04-09 17:03:24.000000000 -0400
@@ -70,6 +70,11 @@ finalize (GObject *object)
if (priv->uri)
soup_uri_free (priv->uri);
+ if (priv->auth)
+ g_object_unref (priv->auth);
+ if (priv->proxy_auth)
+ g_object_unref (priv->proxy_auth);
+
if (msg->request.owner == SOUP_BUFFER_SYSTEM_OWNED)
g_free (msg->request.body);
if (msg->response.owner == SOUP_BUFFER_SYSTEM_OWNED)
@@ -725,6 +730,110 @@ soup_message_foreach_header (GHashTable
}
/**
+ * soup_message_set_auth:
+ * @msg: a #SoupMessage
+ * @auth: a #SoupAuth, or %NULL
+ *
+ * Sets @msg to authenticate to its destination using @auth, which
+ * must have already been fully authenticated. If @auth is %NULL, @msg
+ * will not authenticate to its destination.
+ **/
+void
+soup_message_set_auth (SoupMessage *msg, SoupAuth *auth)
+{
+ SoupMessagePrivate *priv;
+ char *token;
+
+ g_return_if_fail (SOUP_IS_MESSAGE (msg));
+ g_return_if_fail (auth == NULL || SOUP_IS_AUTH (auth));
+ g_return_if_fail (auth == NULL || soup_auth_is_authenticated (auth));
+
+ priv = SOUP_MESSAGE_GET_PRIVATE (msg);
+
+ if (priv->auth)
+ g_object_unref (priv->auth);
+ soup_message_remove_header (msg->request_headers, "Authorization");
+ priv->auth = auth;
+ if (!priv->auth)
+ return;
+
+ g_object_ref (priv->auth);
+ token = soup_auth_get_authorization (auth, msg);
+ soup_message_add_header (msg->request_headers, "Authorization", token);
+ g_free (token);
+}
+
+/**
+ * soup_message_get_auth:
+ * @msg: a #SoupMessage
+ *
+ * Gets the #SoupAuth used by @msg for authentication.
+ *
+ * Return value: the #SoupAuth used by @msg for authentication, or
+ * %NULL if @msg is unauthenticated.
+ **/
+SoupAuth *
+soup_message_get_auth (SoupMessage *msg)
+{
+ g_return_val_if_fail (SOUP_IS_MESSAGE (msg), NULL);
+
+ return SOUP_MESSAGE_GET_PRIVATE (msg)->auth;
+}
+
+/**
+ * soup_message_set_proxy_auth:
+ * @msg: a #SoupMessage
+ * @auth: a #SoupAuth, or %NULL
+ *
+ * Sets @msg to authenticate to its proxy using @auth, which must have
+ * already been fully authenticated. If @auth is %NULL, @msg will not
+ * authenticate to its proxy.
+ **/
+void
+soup_message_set_proxy_auth (SoupMessage *msg, SoupAuth *auth)
+{
+ SoupMessagePrivate *priv;
+ char *token;
+
+ g_return_if_fail (SOUP_IS_MESSAGE (msg));
+ g_return_if_fail (auth == NULL || SOUP_IS_AUTH (auth));
+ g_return_if_fail (auth == NULL || soup_auth_is_authenticated (auth));
+
+ priv = SOUP_MESSAGE_GET_PRIVATE (msg);
+
+ if (priv->proxy_auth)
+ g_object_unref (priv->proxy_auth);
+ soup_message_remove_header (msg->request_headers,
+ "Proxy-Authorization");
+ priv->proxy_auth = auth;
+ if (!priv->proxy_auth)
+ return;
+
+ g_object_ref (priv->proxy_auth);
+ token = soup_auth_get_authorization (auth, msg);
+ soup_message_add_header (msg->request_headers,
+ "Proxy-Authorization", token);
+ g_free (token);
+}
+
+/**
+ * soup_message_get_proxy_auth:
+ * @msg: a #SoupMessage
+ *
+ * Gets the #SoupAuth used by @msg for authentication to its proxy..
+ *
+ * Return value: the #SoupAuth used by @msg for authentication to its
+ * proxy, or %NULL if @msg isn't authenticated to its proxy.
+ **/
+SoupAuth *
+soup_message_get_proxy_auth (SoupMessage *msg)
+{
+ g_return_val_if_fail (SOUP_IS_MESSAGE (msg), NULL);
+
+ return SOUP_MESSAGE_GET_PRIVATE (msg)->proxy_auth;
+}
+
+/**
* soup_message_cleanup_response:
* @req: a #SoupMessage
*
@@ -984,9 +1093,7 @@ soup_message_get_response_encoding (Soup
{
SoupMethodId method = soup_method_get_id (msg->method);
- /* FIXME: should CONNECT really be here? Where does it say that? */
if (method == SOUP_METHOD_ID_HEAD ||
- method == SOUP_METHOD_ID_CONNECT ||
msg->status_code == SOUP_STATUS_NO_CONTENT ||
msg->status_code == SOUP_STATUS_NOT_MODIFIED ||
SOUP_STATUS_IS_INFORMATIONAL (msg->status_code))
@@ -1022,7 +1129,9 @@ soup_message_get_response_encoding (Soup
*content_length = lval;
return SOUP_TRANSFER_CONTENT_LENGTH;
}
- } else
+ } else if (method == SOUP_METHOD_ID_CONNECT)
+ return SOUP_TRANSFER_NONE;
+ else
return SOUP_TRANSFER_EOF;
}
}
diff -ruNp /home/jacob/Scratch/libsoup-2.2.100/libsoup/soup-message-private.h libsoup-2.2.100/libsoup/soup-message-private.h
--- /home/jacob/Scratch/libsoup-2.2.100/libsoup/soup-message-private.h 2007-01-02 13:25:11.000000000 -0500
+++ libsoup-2.2.100/libsoup/soup-message-private.h 2007-04-09 17:03:24.000000000 -0400
@@ -6,7 +6,8 @@
#ifndef SOUP_MESSAGE_PRIVATE_H
#define SOUP_MESSAGE_PRIVATE_H 1
-#include <libsoup/soup-message.h>
+#include "soup-message.h"
+#include "soup-auth.h"
typedef struct {
gpointer io_data;
@@ -20,6 +21,8 @@ typedef struct {
SoupHttpVersion http_version;
SoupUri *uri;
+
+ SoupAuth *auth, *proxy_auth;
} SoupMessagePrivate;
#define SOUP_MESSAGE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), SOUP_TYPE_MESSAGE, SoupMessagePrivate))
@@ -57,4 +60,12 @@ void soup_message_io_server (SoupMessag
SoupMessageParseHeadersFn parse_headers_cb,
gpointer user_data);
+/* Auth handling */
+void soup_message_set_auth (SoupMessage *msg,
+ SoupAuth *auth);
+SoupAuth *soup_message_get_auth (SoupMessage *msg);
+void soup_message_set_proxy_auth (SoupMessage *msg,
+ SoupAuth *auth);
+SoupAuth *soup_message_get_proxy_auth (SoupMessage *msg);
+
#endif /* SOUP_MESSAGE_PRIVATE_H */
diff -ruNp /home/jacob/Scratch/libsoup-2.2.100/libsoup/soup-misc.c libsoup-2.2.100/libsoup/soup-misc.c
--- /home/jacob/Scratch/libsoup-2.2.100/libsoup/soup-misc.c 2007-01-02 13:25:11.000000000 -0500
+++ libsoup-2.2.100/libsoup/soup-misc.c 2007-04-09 17:03:24.000000000 -0400
@@ -50,16 +50,6 @@ soup_str_case_equal (gconstpointer v1,
return g_ascii_strcasecmp (string1, string2) == 0;
}
-/* Base64 utils (straight from camel-mime-utils.c) */
-#define d(x)
-
-static const char *base64_alphabet =
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
-
-/*
- * call this when finished encoding everything, to
- * flush off the last little bit
- */
int
soup_base64_encode_close (const guchar *in,
int inlen,
@@ -68,53 +58,19 @@ soup_base64_encode_close (const guchar
int *state,
int *save)
{
- int c1, c2;
- unsigned char *outptr = out;
-
- if (inlen > 0)
- outptr += soup_base64_encode_step (in,
- inlen,
- break_lines,
- outptr,
- state,
- save);
-
- c1 = ((unsigned char *) save) [1];
- c2 = ((unsigned char *) save) [2];
-
- d(printf("mode = %d\nc1 = %c\nc2 = %c\n",
- (int)((char *) save) [0],
- (int)((char *) save) [1],
- (int)((char *) save) [2]));
-
- switch (((char *) save) [0]) {
- case 2:
- outptr [2] = base64_alphabet[ ( (c2 &0x0f) << 2 ) ];
- g_assert (outptr [2] != 0);
- goto skip;
- case 1:
- outptr[2] = '=';
- skip:
- outptr [0] = base64_alphabet [ c1 >> 2 ];
- outptr [1] = base64_alphabet [ c2 >> 4 | ( (c1&0x3) << 4 )];
- outptr [3] = '=';
- outptr += 4;
- break;
+ if (inlen > 0) {
+ out += soup_base64_encode_step (in,
+ inlen,
+ break_lines,
+ out,
+ state,
+ save);
}
- if (break_lines)
- *outptr++ = '\n';
-
- *save = 0;
- *state = 0;
- return outptr-out;
+ return (int)g_base64_encode_close (break_lines, (char *) out,
+ state, save);
}
-/*
- * performs an 'encode step', only encodes blocks of 3 characters to the
- * output at a time, saves left-over state in state and save (initialise to
- * 0 on first invocation).
- */
int
soup_base64_encode_step (const guchar *in,
int len,
@@ -123,142 +79,16 @@ soup_base64_encode_step (const guchar *
int *state,
int *save)
{
- register guchar *outptr;
- register const guchar *inptr;
-
- if (len <= 0)
- return 0;
-
- inptr = in;
- outptr = out;
-
- d (printf ("we have %d chars, and %d saved chars\n",
- len,
- ((char *) save) [0]));
-
- if (len + ((char *) save) [0] > 2) {
- const guchar *inend = in+len-2;
- register int c1, c2, c3;
- register int already;
-
- already = *state;
-
- switch (((char *) save) [0]) {
- case 1: c1 = ((unsigned char *) save) [1]; goto skip1;
- case 2: c1 = ((unsigned char *) save) [1];
- c2 = ((unsigned char *) save) [2]; goto skip2;
- }
-
- /*
- * yes, we jump into the loop, no i'm not going to change it,
- * it's beautiful!
- */
- while (inptr < inend) {
- c1 = *inptr++;
- skip1:
- c2 = *inptr++;
- skip2:
- c3 = *inptr++;
- *outptr++ = base64_alphabet [ c1 >> 2 ];
- *outptr++ = base64_alphabet [ c2 >> 4 |
- ((c1&0x3) << 4) ];
- *outptr++ = base64_alphabet [ ((c2 &0x0f) << 2) |
- (c3 >> 6) ];
- *outptr++ = base64_alphabet [ c3 & 0x3f ];
- /* this is a bit ugly ... */
- if (break_lines && (++already)>=19) {
- *outptr++='\n';
- already = 0;
- }
- }
-
- ((char *)save)[0] = 0;
- len = 2-(inptr-inend);
- *state = already;
- }
-
- d(printf("state = %d, len = %d\n",
- (int)((char *)save)[0],
- len));
-
- if (len>0) {
- register char *saveout;
-
- /* points to the slot for the next char to save */
- saveout = & (((char *)save)[1]) + ((char *)save)[0];
-
- /* len can only be 0 1 or 2 */
- switch(len) {
- case 2: *saveout++ = *inptr++;
- case 1: *saveout++ = *inptr++;
- }
- ((char *)save)[0]+=len;
- }
-
- d(printf("mode = %d\nc1 = %c\nc2 = %c\n",
- (int)((char *)save)[0],
- (int)((char *)save)[1],
- (int)((char *)save)[2]));
-
- return outptr-out;
+ return (int)g_base64_encode_step (in, len, break_lines,
+ (char *)out, state, save);
}
-/**
- * soup_base64_encode:
- * @text: the binary data to encode.
- * @len: the length of @text.
- *
- * Encode a sequence of binary data into it's Base-64 stringified
- * representation.
- *
- * Return value: The Base-64 encoded string representing @text.
- */
char *
soup_base64_encode (const char *text, int len)
{
- unsigned char *out;
- int state = 0, outlen, save = 0;
-
- out = g_malloc (len * 4 / 3 + 5);
- outlen = soup_base64_encode_close ((const guchar *)text,
- len,
- FALSE,
- out,
- &state,
- &save);
- out[outlen] = '\0';
- return (char *) out;
-}
-
-static unsigned char camel_mime_base64_rank[256] = {
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255, 62,255,255,255, 63,
- 52, 53, 54, 55, 56, 57, 58, 59, 60, 61,255,255,255, 0,255,255,
- 255, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
- 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,255,255,255,255,255,
- 255, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
- 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-};
+ return g_base64_encode ((const guchar *)text, len);
+}
-/**
- * base64_decode_step: decode a chunk of base64 encoded data
- * @in: input stream
- * @len: max length of data to decode
- * @out: output stream
- * @state: holds the number of bits that are stored in @save
- * @save: leftover bits that have not yet been decoded
- *
- * Decodes a chunk of base64 encoded data
- **/
int
soup_base64_decode_step (const guchar *in,
int len,
@@ -266,68 +96,20 @@ soup_base64_decode_step (const guchar *
int *state,
guint *save)
{
- register const guchar *inptr;
- register guchar *outptr;
- const guchar *inend;
- guchar c;
- register unsigned int v;
- int i;
-
- inend = in+len;
- outptr = out;
-
- /* convert 4 base64 bytes to 3 normal bytes */
- v=*save;
- i=*state;
- inptr = in;
- while (inptr < inend) {
- c = camel_mime_base64_rank [*inptr++];
- if (c != 0xff) {
- v = (v<<6) | c;
- i++;
- if (i==4) {
- *outptr++ = v>>16;
- *outptr++ = v>>8;
- *outptr++ = v;
- i=0;
- }
- }
- }
-
- *save = v;
- *state = i;
-
- /* quick scan back for '=' on the end somewhere */
- /* fortunately we can drop 1 output char for each trailing = (upto 2) */
- i=2;
- while (inptr > in && i) {
- inptr--;
- if (camel_mime_base64_rank [*inptr] != 0xff) {
- if (*inptr == '=')
- outptr--;
- i--;
- }
- }
-
- /* if i!= 0 then there is a truncation error! */
- return outptr - out;
+ return (int) g_base64_decode_step ((const char *)in, len,
+ out, state, save);
}
char *
soup_base64_decode (const char *text,
int *out_len)
{
- guchar *ret;
- int inlen, state = 0;
- unsigned int save = 0;
-
- inlen = strlen (text);
- ret = g_malloc0 (inlen);
-
- *out_len = soup_base64_decode_step ((const guchar *)text, inlen,
- ret, &state, &save);
+ char *ret;
+ gsize out_len_tmp;
- return (char *)ret;
+ ret = (char *) g_base64_decode (text, &out_len_tmp);
+ *out_len = out_len_tmp;
+ return ret;
}
typedef struct {
diff -ruNp /home/jacob/Scratch/libsoup-2.2.100/libsoup/soup-misc.h libsoup-2.2.100/libsoup/soup-misc.h
--- /home/jacob/Scratch/libsoup-2.2.100/libsoup/soup-misc.h 2007-01-02 13:25:11.000000000 -0500
+++ libsoup-2.2.100/libsoup/soup-misc.h 2007-04-09 17:03:24.000000000 -0400
@@ -9,7 +9,8 @@
#include <glib-object.h>
#include <libxml/tree.h>
-/* Base64 encoding/decoding */
+#ifndef LIBSOUP_DISABLE_DEPRECATED
+/* Base64 encoding/decoding. DEPRECATED: use <glib/base64.h> */
char *soup_base64_encode (const char *text,
int len);
@@ -36,6 +37,7 @@ int soup_base64_decode_st
guchar *out,
int *state,
guint *save);
+#endif /* LIBSOUP_DISABLE_DEPRECATED */
/* Non-default-GMainContext operations */
GSource *soup_add_io_watch (GMainContext *async_context,
diff -ruNp /home/jacob/Scratch/libsoup-2.2.100/libsoup/soup-server-auth.c libsoup-2.2.100/libsoup/soup-server-auth.c
--- /home/jacob/Scratch/libsoup-2.2.100/libsoup/soup-server-auth.c 2007-01-02 13:25:11.000000000 -0500
+++ libsoup-2.2.100/libsoup/soup-server-auth.c 2007-04-09 17:03:24.000000000 -0400
@@ -352,23 +352,24 @@ soup_server_auth_new (SoupServerAuthCont
switch (type) {
case SOUP_AUTH_TYPE_BASIC:
{
- gchar *userpass, *colon;
- gint len;
+ guchar *userpass, *colon;
+ gsize len;
- userpass = soup_base64_decode (header, &len);
+ userpass = g_base64_decode (header, &len);
if (!userpass)
break;
- colon = strchr (userpass, ':');
+ colon = memchr (userpass, ':', len);
if (!colon) {
g_free (userpass);
break;
}
ret->basic.type = SOUP_AUTH_TYPE_BASIC;
- ret->basic.user = g_strndup (userpass,
+ ret->basic.user = g_strndup ((char *)userpass,
colon - userpass);
- ret->basic.passwd = g_strdup (colon + 1);
+ ret->basic.passwd = g_strndup ((char *)colon + 1,
+ len - (colon + 1 - userpass));
g_free (userpass);
diff -ruNp /home/jacob/Scratch/libsoup-2.2.100/libsoup/soup-server.c libsoup-2.2.100/libsoup/soup-server.c
--- /home/jacob/Scratch/libsoup-2.2.100/libsoup/soup-server.c 2007-01-02 13:25:11.000000000 -0500
+++ libsoup-2.2.100/libsoup/soup-server.c 2007-05-01 14:29:21.000000000 -0400
@@ -33,7 +33,7 @@ typedef struct {
guint port;
char *ssl_cert_file, *ssl_key_file;
- gpointer ssl_creds;
+ SoupSSLCredentials *ssl_creds;
GMainLoop *loop;
diff -ruNp /home/jacob/Scratch/libsoup-2.2.100/libsoup/soup-session-async.c libsoup-2.2.100/libsoup/soup-session-async.c
--- /home/jacob/Scratch/libsoup-2.2.100/libsoup/soup-session-async.c 2007-01-02 13:25:11.000000000 -0500
+++ libsoup-2.2.100/libsoup/soup-session-async.c 2007-04-09 17:03:24.000000000 -0400
@@ -184,6 +184,19 @@ final_finished (SoupMessage *req, gpoint
run_queue (sa, FALSE);
}
+static gboolean
+idle_run_queue (gpointer user_data)
+{
+ SoupSessionAsync *sa = user_data;
+
+ g_object_add_weak_pointer (G_OBJECT (sa), (gpointer)&sa);
+ g_object_unref (sa);
+
+ if (sa)
+ run_queue (sa, TRUE);
+ return FALSE;
+}
+
static void
queue_message (SoupSession *session, SoupMessage *req,
SoupMessageCallbackFn callback, gpointer user_data)
@@ -202,7 +215,8 @@ queue_message (SoupSession *session, Sou
SOUP_SESSION_CLASS (soup_session_async_parent_class)->queue_message (session, req, callback, user_data);
- run_queue (sa, TRUE);
+ g_object_ref (sa);
+ g_idle_add (idle_run_queue, sa);
}
static guint
diff -ruNp /home/jacob/Scratch/libsoup-2.2.100/libsoup/soup-session.c libsoup-2.2.100/libsoup/soup-session.c
--- /home/jacob/Scratch/libsoup-2.2.100/libsoup/soup-session.c 2007-01-02 13:25:11.000000000 -0500
+++ libsoup-2.2.100/libsoup/soup-session.c 2007-05-01 16:00:48.000000000 -0400
@@ -19,6 +19,7 @@
#include "soup-connection-ntlm.h"
#include "soup-marshal.h"
#include "soup-message-filter.h"
+#include "soup-message-private.h"
#include "soup-message-queue.h"
#include "soup-ssl.h"
#include "soup-uri.h"
@@ -39,7 +40,7 @@ typedef struct {
gboolean use_ntlm;
char *ssl_ca_file;
- gpointer ssl_creds;
+ SoupSSLCredentials *ssl_creds;
GSList *filters;
@@ -744,8 +745,7 @@ authenticate_auth (SoupSession *session,
static gboolean
update_auth_internal (SoupSession *session, SoupMessage *msg,
- const GSList *headers, gboolean proxy,
- gboolean got_unauthorized)
+ const GSList *headers, gboolean proxy)
{
SoupSessionHost *host;
SoupAuth *new_auth, *prior_auth, *old_auth;
@@ -772,20 +772,11 @@ update_auth_internal (SoupSession *sessi
return FALSE;
/* See if this auth is the same auth we used last time */
- prior_auth = lookup_auth (session, msg, proxy);
+ prior_auth = proxy ? soup_message_get_proxy_auth (msg) : soup_message_get_auth (msg);
if (prior_auth &&
G_OBJECT_TYPE (prior_auth) == G_OBJECT_TYPE (new_auth) &&
!strcmp (soup_auth_get_realm (prior_auth),
soup_auth_get_realm (new_auth))) {
- if (!got_unauthorized) {
- /* The user is just trying to preauthenticate
- * using information we already have, so
- * there's nothing more that needs to be done.
- */
- g_object_unref (new_auth);
- return TRUE;
- }
-
/* The server didn't like the username/password we
* provided before. Invalidate it and note this fact.
*/
@@ -891,7 +882,7 @@ authorize_handler (SoupMessage *msg, gpo
if (!headers)
return;
- if (update_auth_internal (session, msg, headers, proxy, TRUE))
+ if (update_auth_internal (session, msg, headers, proxy))
soup_session_requeue_message (session, msg);
}
@@ -926,23 +917,18 @@ redirect_handler (SoupMessage *msg, gpoi
static void
add_auth (SoupSession *session, SoupMessage *msg, gboolean proxy)
{
- const char *header = proxy ? "Proxy-Authorization" : "Authorization";
SoupAuth *auth;
- char *token;
auth = lookup_auth (session, msg, proxy);
- if (!auth)
- return;
- if (!soup_auth_is_authenticated (auth) &&
- !authenticate_auth (session, auth, msg, FALSE, proxy))
- return;
-
- token = soup_auth_get_authorization (auth, msg);
- if (token) {
- soup_message_remove_header (msg->request_headers, header);
- soup_message_add_header (msg->request_headers, header, token);
- g_free (token);
+ if (auth && !soup_auth_is_authenticated (auth)) {
+ if (!authenticate_auth (session, auth, msg, FALSE, proxy))
+ auth = NULL;
}
+
+ if (proxy)
+ soup_message_set_proxy_auth (msg, auth);
+ else
+ soup_message_set_auth (msg, auth);
}
static void
@@ -1273,8 +1259,9 @@ queue_message (SoupSession *session, Sou
* any resources related to the time it was last sent are freed.
*
* Upon message completion, the callback specified in @callback will
- * be invoked. If after returning from this callback the message has
- * not been requeued, @msg will be unreffed.
+ * be invoked (in the thread associated with @session's async
+ * context). If after returning from this callback the message has not
+ * been requeued, @msg will be unreffed.
*/
void
soup_session_queue_message (SoupSession *session, SoupMessage *msg,
diff -ruNp /home/jacob/Scratch/libsoup-2.2.100/libsoup/soup-session-sync.c libsoup-2.2.100/libsoup/soup-session-sync.c
--- /home/jacob/Scratch/libsoup-2.2.100/libsoup/soup-session-sync.c 2007-01-02 13:25:11.000000000 -0500
+++ libsoup-2.2.100/libsoup/soup-session-sync.c 2007-04-09 17:07:39.000000000 -0400
@@ -11,6 +11,7 @@
#include "soup-session-sync.h"
#include "soup-connection.h"
+#include "soup-misc.h"
typedef struct {
GMutex *lock;
@@ -98,13 +99,63 @@ soup_session_sync_new_with_options (cons
return session;
}
+typedef struct {
+ SoupSession *session;
+ SoupMessage *msg;
+ SoupMessageCallbackFn callback;
+ gpointer user_data;
+} SoupSessionSyncAsyncData;
+
+static void
+async_data_free (SoupSessionSyncAsyncData *sad)
+{
+ g_object_unref (sad->session);
+ g_object_unref (sad->msg);
+ g_free (sad);
+}
+
+static gboolean
+queue_message_callback (gpointer data)
+{
+ SoupSessionSyncAsyncData *sad = data;
+
+ sad->callback (sad->msg, sad->user_data);
+ async_data_free (sad);
+ return FALSE;
+}
+
+static gpointer
+queue_message_thread (gpointer data)
+{
+ SoupSessionSyncAsyncData *sad = data;
+
+ soup_session_send_message (sad->session, sad->msg);
+ if (sad->callback) {
+ GMainContext *async_context;
+
+ g_object_get (sad->session,
+ SOUP_SESSION_ASYNC_CONTEXT, &async_context,
+ NULL);
+ soup_add_idle (async_context, queue_message_callback, sad);
+ } else
+ async_data_free (sad);
+
+ return NULL;
+}
static void
queue_message (SoupSession *session, SoupMessage *msg,
SoupMessageCallbackFn callback, gpointer user_data)
{
- /* FIXME */
- g_warning ("soup_session_queue_message called on synchronous session");
+ SoupSessionSyncAsyncData *sad;
+
+ sad = g_new (SoupSessionSyncAsyncData, 1);
+ sad->session = g_object_ref (session);
+ sad->msg = g_object_ref (msg);
+ sad->callback = callback;
+ sad->user_data = user_data;
+
+ g_thread_create (queue_message_thread, sad, FALSE, NULL);
}
static SoupConnection *
@@ -130,7 +181,9 @@ wait_for_connection (SoupSession *sessio
* not return the no-longer-valid connection.
*/
- if (!SOUP_STATUS_IS_SUCCESSFUL (status))
+ if (status == SOUP_STATUS_TRY_AGAIN)
+ goto try_again;
+ else if (!SOUP_STATUS_IS_SUCCESSFUL (status))
conn = NULL;
else if (msg->status == SOUP_MESSAGE_STATUS_FINISHED) {
/* Message was cancelled while we were
diff -ruNp /home/jacob/Scratch/libsoup-2.2.100/libsoup/soup-soap-message.c libsoup-2.2.100/libsoup/soup-soap-message.c
--- /home/jacob/Scratch/libsoup-2.2.100/libsoup/soup-soap-message.c 2007-01-02 13:25:11.000000000 -0500
+++ libsoup-2.2.100/libsoup/soup-soap-message.c 2007-04-09 17:03:24.000000000 -0400
@@ -513,7 +513,7 @@ soup_soap_message_write_double (SoupSoap
void
soup_soap_message_write_base64 (SoupSoapMessage *msg, const char *string, int len)
{
- gchar *str = soup_base64_encode (string, len);
+ gchar *str = g_base64_encode ((const guchar *)string, len);
soup_soap_message_write_string (msg, str);
g_free (str);
}
diff -ruNp /home/jacob/Scratch/libsoup-2.2.100/libsoup/soup-ssl.h libsoup-2.2.100/libsoup/soup-ssl.h
--- /home/jacob/Scratch/libsoup-2.2.100/libsoup/soup-ssl.h 2007-01-02 13:25:11.000000000 -0500
+++ libsoup-2.2.100/libsoup/soup-ssl.h 2007-05-01 16:00:48.000000000 -0400
@@ -20,16 +20,19 @@ typedef enum {
SOUP_SSL_TYPE_SERVER
} SoupSSLType;
-gpointer soup_ssl_get_client_credentials (const char *ca_file);
-void soup_ssl_free_client_credentials (gpointer creds);
-gpointer soup_ssl_get_server_credentials (const char *cert_file,
- const char *key_file);
-void soup_ssl_free_server_credentials (gpointer creds);
-
-GIOChannel *soup_ssl_wrap_iochannel (GIOChannel *sock,
- SoupSSLType type,
- const char *remote_host,
- gpointer credentials);
+typedef struct SoupSSLCredentials SoupSSLCredentials;
+
+SoupSSLCredentials *soup_ssl_get_client_credentials (const char *ca_file);
+void soup_ssl_free_client_credentials (SoupSSLCredentials *creds);
+
+SoupSSLCredentials *soup_ssl_get_server_credentials (const char *cert_file,
+ const char *key_file);
+void soup_ssl_free_server_credentials (SoupSSLCredentials *creds);
+
+GIOChannel *soup_ssl_wrap_iochannel (GIOChannel *sock,
+ SoupSSLType type,
+ const char *remote_host,
+ SoupSSLCredentials *creds);
#define SOUP_SSL_ERROR soup_ssl_error_quark()
diff -ruNp /home/jacob/Scratch/libsoup-2.2.100/libsoup/soup-types.h libsoup-2.2.100/libsoup/soup-types.h
--- /home/jacob/Scratch/libsoup-2.2.100/libsoup/soup-types.h 2007-01-02 13:25:11.000000000 -0500
+++ libsoup-2.2.100/libsoup/soup-types.h 2007-04-12 16:40:44.000000000 -0400
@@ -49,13 +49,4 @@ GType type_name##_get_type(void)\
return type; \
}
-/* Compat for glib 2.6.x */
-#ifndef G_GNUC_NULL_TERMINATED
-# if __GNUC__ >= 4
-# define G_GNUC_NULL_TERMINATED __attribute__((__sentinel__))
-# else
-# define G_GNUC_NULL_TERMINATED
-# endif
-#endif
-
#endif
diff -ruNp /home/jacob/Scratch/libsoup-2.2.100/libsoup/soup-xmlrpc-message.c libsoup-2.2.100/libsoup/soup-xmlrpc-message.c
--- /home/jacob/Scratch/libsoup-2.2.100/libsoup/soup-xmlrpc-message.c 2007-01-02 13:25:11.000000000 -0500
+++ libsoup-2.2.100/libsoup/soup-xmlrpc-message.c 2007-04-09 17:03:24.000000000 -0400
@@ -226,7 +226,7 @@ soup_xmlrpc_message_write_base64 (SoupXm
g_return_if_fail (SOUP_IS_XMLRPC_MESSAGE (msg));
priv = SOUP_XMLRPC_MESSAGE_GET_PRIVATE (msg);
- str = soup_base64_encode (buf, len);
+ str = g_base64_encode (buf, len);
priv->last_node = xmlNewChild (priv->last_node, NULL, (const xmlChar *)"value", NULL);
xmlNewTextChild (priv->last_node, NULL, (const xmlChar *)"base64", (xmlChar *)str);
diff -ruNp /home/jacob/Scratch/libsoup-2.2.100/libsoup/soup-xmlrpc-response.c libsoup-2.2.100/libsoup/soup-xmlrpc-response.c
--- /home/jacob/Scratch/libsoup-2.2.100/libsoup/soup-xmlrpc-response.c 2007-01-02 13:25:11.000000000 -0500
+++ libsoup-2.2.100/libsoup/soup-xmlrpc-response.c 2007-04-09 17:03:24.000000000 -0400
@@ -361,8 +361,8 @@ soup_xmlrpc_value_get_base64 (SoupXmlrpc
{
xmlNode *xml;
xmlChar *content;
- char *decoded;
- int len;
+ guchar *decoded;
+ gsize len;
xml = (xmlNode *) value;
if (strcmp ((const char *)xml->name, "value"))
@@ -372,11 +372,11 @@ soup_xmlrpc_value_get_base64 (SoupXmlrpc
return FALSE;
content = xmlNodeGetContent (xml);
- decoded = soup_base64_decode ((const char *)content, &len);
+ decoded = g_base64_decode ((const char *)content, &len);
xmlFree (content);
*data = g_byte_array_new ();
- g_byte_array_append (*data, (guchar *)decoded, len);
+ g_byte_array_append (*data, decoded, len);
g_free (decoded);
return TRUE;
diff -ruNp /home/jacob/Scratch/libsoup-2.2.100/Makefile.in libsoup-2.2.100/Makefile.in
--- /home/jacob/Scratch/libsoup-2.2.100/Makefile.in 2007-02-12 10:34:12.000000000 -0500
+++ libsoup-2.2.100/Makefile.in 2007-05-01 15:49:11.000000000 -0400
@@ -80,6 +80,8 @@ AMDEP_TRUE = @AMDEP_TRUE@
AMTAR = @AMTAR@
APACHE_HTTPD = @APACHE_HTTPD@
APACHE_MODULE_DIR = @APACHE_MODULE_DIR@
+APACHE_PHP_MODULE_DIR = @APACHE_PHP_MODULE_DIR@
+APACHE_SSL_MODULE_DIR = @APACHE_SSL_MODULE_DIR@
AR = @AR@
AS = @AS@
AUTOCONF = @AUTOCONF@
@@ -119,6 +121,8 @@ GTK_DOC_USE_LIBTOOL_FALSE = @GTK_DOC_USE
GTK_DOC_USE_LIBTOOL_TRUE = @GTK_DOC_USE_LIBTOOL_TRUE@
HAVE_APACHE_FALSE = @HAVE_APACHE_FALSE@
HAVE_APACHE_TRUE = @HAVE_APACHE_TRUE@
+HAVE_SSL_FALSE = @HAVE_SSL_FALSE@
+HAVE_SSL_TRUE = @HAVE_SSL_TRUE@
HAVE_XMLRPC_EPI_PHP_FALSE = @HAVE_XMLRPC_EPI_PHP_FALSE@
HAVE_XMLRPC_EPI_PHP_TRUE = @HAVE_XMLRPC_EPI_PHP_TRUE@
HTML_DIR = @HTML_DIR@
@@ -128,6 +132,9 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_SCRIPT = @INSTALL_SCRIPT@
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
LDFLAGS = @LDFLAGS@
+LIBGCRYPT_CFLAGS = @LIBGCRYPT_CFLAGS@
+LIBGCRYPT_CONFIG = @LIBGCRYPT_CONFIG@
+LIBGCRYPT_LIBS = @LIBGCRYPT_LIBS@
LIBGNUTLS_CFLAGS = @LIBGNUTLS_CFLAGS@
LIBGNUTLS_LIBS = @LIBGNUTLS_LIBS@
LIBOBJS = @LIBOBJS@
diff -ruNp /home/jacob/Scratch/libsoup-2.2.100/tests/auth-test.c libsoup-2.2.100/tests/auth-test.c
--- /home/jacob/Scratch/libsoup-2.2.100/tests/auth-test.c 2007-01-02 13:25:11.000000000 -0500
+++ libsoup-2.2.100/tests/auth-test.c 2007-04-09 17:03:24.000000000 -0400
@@ -14,6 +14,7 @@
#include "apache-wrapper.h"
#endif
+GMainLoop *loop;
int errors = 0;
typedef struct {
@@ -243,12 +244,69 @@ reauthenticate (SoupSession *session, So
}
}
+static void
+bug271540_sent (SoupMessage *msg, gpointer data)
+{
+ int n = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (msg), "#"));
+ gboolean *authenticated = data;
+ int auth = identify_auth (msg);
+
+ if (!*authenticated && auth) {
+ printf (" using auth on message %d before authenticating!!??\n", n);
+ errors++;
+ } else if (*authenticated && !auth) {
+ printf (" sent unauthenticated message %d after authenticating!\n", n);
+ errors++;
+ }
+}
+
+static void
+bug271540_authenticate (SoupSession *session, SoupMessage *msg,
+ const char *auth_type, const char *auth_realm,
+ char **username, char **password, gpointer data)
+{
+ int n = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (msg), "#"));
+ gboolean *authenticated = data;
+
+ if (strcmp (auth_type, "Basic") != 0 ||
+ strcmp (auth_realm, "realm1") != 0)
+ return;
+
+ if (!*authenticated) {
+ printf (" authenticating message %d\n", n);
+ *username = g_strdup ("user1");
+ *password = g_strdup ("realm1");
+ *authenticated = TRUE;
+ } else {
+ printf (" asked to authenticate message %d after authenticating!\n", n);
+ errors++;
+ }
+}
+
+static void
+bug271540_finished (SoupMessage *msg, gpointer data)
+{
+ int *left = data;
+ int n = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (msg), "#"));
+
+ if (!SOUP_STATUS_IS_SUCCESSFUL (msg->status_code)) {
+ printf (" got status '%d %s' on message %d!\n",
+ msg->status_code, msg->reason_phrase, n);
+ errors++;
+ }
+
+ (*left)--;
+ if (!*left)
+ g_main_loop_quit (loop);
+}
+
int
main (int argc, char **argv)
{
SoupSession *session;
SoupMessage *msg;
char *base_uri, *uri, *expected;
+ gboolean authenticated;
#ifdef HAVE_APACHE
gboolean using_apache = FALSE;
#endif
@@ -325,6 +383,30 @@ main (int argc, char **argv)
g_object_unref (msg);
}
+ g_object_unref (session);
+
+ /* And now for a regression test */
+
+ printf ("Regression test for bug 271540:\n");
+ session = soup_session_async_new ();
+
+ authenticated = FALSE;
+ g_signal_connect (session, "authenticate",
+ G_CALLBACK (bug271540_authenticate), &authenticated);
+
+ uri = g_strconcat (base_uri, "Basic/realm1/", NULL);
+ for (i = 0; i < 10; i++) {
+ msg = soup_message_new (SOUP_METHOD_GET, uri);
+ g_object_set_data (G_OBJECT (msg), "#", GINT_TO_POINTER (i + 1));
+ g_signal_connect (msg, "wrote_headers",
+ G_CALLBACK (bug271540_sent), &authenticated);
+
+ soup_session_queue_message (session, msg,
+ bug271540_finished, &i);
+ }
+
+ loop = g_main_loop_new (NULL, TRUE);
+ g_main_loop_run (loop);
g_object_unref (session);
diff -ruNp /home/jacob/Scratch/libsoup-2.2.100/tests/get.c libsoup-2.2.100/tests/get.c
--- /home/jacob/Scratch/libsoup-2.2.100/tests/get.c 2007-01-02 13:25:11.000000000 -0500
+++ libsoup-2.2.100/tests/get.c 2007-04-09 17:03:24.000000000 -0400
@@ -26,6 +26,7 @@ const char *method = SOUP_METHOD_GET;
char *base;
SoupUri *base_uri;
int pending;
+GHashTable *fetched_urls;
static GPtrArray *
find_hrefs (const SoupUri *base, const char *body, int length)
@@ -98,8 +99,6 @@ mkdirs (const char *path)
}
}
-static void get_url (const char *url);
-
static void
print_header (gpointer name, gpointer value, gpointer data)
{
@@ -107,18 +106,57 @@ print_header (gpointer name, gpointer va
}
static void
-got_url (SoupMessage *msg, gpointer uri)
+get_url (const char *url)
{
- char *name;
+ char *url_to_get, *slash, *name;
+ SoupMessage *msg;
int fd, i;
+ SoupUri *uri;
GPtrArray *hrefs;
const char *header;
+ if (strncmp (url, base, strlen (base)) != 0)
+ return;
+ if (strchr (url, '?') && strcmp (url, base) != 0)
+ return;
+
+ slash = strrchr (url, '/');
+ if (slash && !slash[1])
+ url_to_get = g_strdup_printf ("%sindex.html", url);
+ else
+ url_to_get = g_strdup (url);
+
+ if (g_hash_table_lookup (fetched_urls, url_to_get))
+ return;
+ g_hash_table_insert (fetched_urls, url_to_get, url_to_get);
+
+ if (recurse) {
+ /* See if we're already downloading it, and create the
+ * file if not.
+ */
+
+ name = url_to_get + strlen (base);
+ if (*name == '/')
+ name++;
+ if (access (name, F_OK) == 0)
+ return;
+
+ mkdirs (name);
+ fd = open (name, O_WRONLY | O_CREAT | O_TRUNC, 0644);
+ close (fd);
+ }
+
+ msg = soup_message_new (method, url_to_get);
+ soup_message_set_flags (msg, SOUP_MESSAGE_NO_REDIRECT);
+
+ soup_session_send_message (session, msg);
+
name = soup_message_get_uri (msg)->path;
if (strncmp (base_uri->path, name, strlen (base_uri->path)) != 0) {
fprintf (stderr, " Error: not under %s\n", base_uri->path);
- goto DONE;
+ return;
}
+
if (debug) {
char *path = soup_uri_to_string (soup_message_get_uri (msg), TRUE);
printf ("%s %s HTTP/1.%d\n\n", method, path,
@@ -136,18 +174,19 @@ got_url (SoupMessage *msg, gpointer uri)
name++;
if (SOUP_STATUS_IS_REDIRECTION (msg->status_code)) {
- unlink (name);
+ if (recurse)
+ unlink (name);
header = soup_message_get_header (msg->response_headers, "Location");
if (header) {
if (!debug)
printf (" -> %s\n", header);
get_url (header);
}
- goto DONE;
+ return;
}
if (!SOUP_STATUS_IS_SUCCESSFUL (msg->status_code))
- goto DONE;
+ return;
if (recurse)
fd = open (name, O_WRONLY | O_CREAT | O_TRUNC, 0644);
@@ -155,66 +194,21 @@ got_url (SoupMessage *msg, gpointer uri)
fd = STDOUT_FILENO;
write (fd, msg->response.body, msg->response.length);
if (!recurse)
- goto DONE;
+ return;
close (fd);
header = soup_message_get_header (msg->response_headers, "Content-Type");
if (header && g_ascii_strncasecmp (header, "text/html", 9) != 0)
- goto DONE;
+ return;
+ uri = soup_uri_new (url);
hrefs = find_hrefs (uri, msg->response.body, msg->response.length);
+ soup_uri_free (uri);
for (i = 0; i < hrefs->len; i++) {
get_url (hrefs->pdata[i]);
g_free (hrefs->pdata[i]);
}
g_ptr_array_free (hrefs, TRUE);
-
- DONE:
- soup_uri_free (uri);
- if (!--pending)
- g_main_quit (loop);
-}
-
-static void
-get_url (const char *url)
-{
- char *url_to_get, *slash, *name;
- SoupMessage *msg;
- int fd;
-
- if (strncmp (url, base, strlen (base)) != 0)
- return;
-
- slash = strrchr (url, '/');
- if (slash && !slash[1])
- url_to_get = g_strdup_printf ("%sindex.html", url);
- else
- url_to_get = g_strdup (url);
-
- if (recurse) {
- /* See if we're already downloading it, and create the
- * file if not.
- */
-
- name = url_to_get + strlen (base);
- if (*name == '/')
- name++;
- if (access (name, F_OK) == 0) {
- g_free (url_to_get);
- return;
- }
-
- mkdirs (name);
- fd = open (name, O_WRONLY | O_CREAT | O_TRUNC, 0644);
- close (fd);
- }
-
- msg = soup_message_new (method, url_to_get);
- soup_message_set_flags (msg, SOUP_MESSAGE_NO_REDIRECT);
-
- pending++;
- soup_session_queue_message (session, msg, got_url, soup_uri_new (url));
- g_free (url_to_get);
}
static void
@@ -229,12 +223,13 @@ main (int argc, char **argv)
{
const char *cafile = NULL;
SoupUri *proxy = NULL;
+ gboolean synchronous = FALSE;
int opt;
g_type_init ();
g_thread_init (NULL);
- while ((opt = getopt (argc, argv, "c:dhp:r")) != -1) {
+ while ((opt = getopt (argc, argv, "c:dhp:rs")) != -1) {
switch (opt) {
case 'c':
cafile = optarg;
@@ -262,6 +257,10 @@ main (int argc, char **argv)
recurse = TRUE;
break;
+ case 's':
+ synchronous = TRUE;
+ break;
+
case '?':
usage ();
break;
@@ -279,10 +278,19 @@ main (int argc, char **argv)
exit (1);
}
- session = soup_session_async_new_with_options (
- SOUP_SESSION_SSL_CA_FILE, cafile,
- SOUP_SESSION_PROXY_URI, proxy,
- NULL);
+ fetched_urls = g_hash_table_new (g_str_hash, g_str_equal);
+
+ if (synchronous) {
+ session = soup_session_sync_new_with_options (
+ SOUP_SESSION_SSL_CA_FILE, cafile,
+ SOUP_SESSION_PROXY_URI, proxy,
+ NULL);
+ } else {
+ session = soup_session_async_new_with_options (
+ SOUP_SESSION_SSL_CA_FILE, cafile,
+ SOUP_SESSION_PROXY_URI, proxy,
+ NULL);
+ }
if (recurse) {
char *outdir;
@@ -297,11 +305,13 @@ main (int argc, char **argv)
g_free (outdir);
}
+ if (!synchronous)
+ loop = g_main_loop_new (NULL, TRUE);
+
get_url (base);
- loop = g_main_loop_new (NULL, TRUE);
- g_main_run (loop);
- g_main_loop_unref (loop);
+ if (!synchronous)
+ g_main_loop_unref (loop);
soup_uri_free (base_uri);
diff -ruNp /home/jacob/Scratch/libsoup-2.2.100/tests/httpd.conf.in libsoup-2.2.100/tests/httpd.conf.in
--- /home/jacob/Scratch/libsoup-2.2.100/tests/httpd.conf.in 2007-01-02 13:25:11.000000000 -0500
+++ libsoup-2.2.100/tests/httpd.conf.in 2007-04-09 17:03:24.000000000 -0400
@@ -6,21 +6,161 @@ Listen 127.0.0.1:47524
PidFile @builddir@/httpd.pid
DocumentRoot @srcdir@
+# The tests shut down apache with "graceful-stop", because that makes
+# it close its listening socket right away. But it seems to sometimes
+# result in apache never fully exiting. This fixes that.
+GracefulShutdownTimeout 1
+
# Change this to "./error.log" if it's failing and you don't know why
ErrorLog /dev/null
-LoadModule alias_module @APACHE_MODULE_DIR@/mod_alias.so
-LoadModule auth_basic_module @APACHE_MODULE_DIR@/mod_auth_basic.so
-LoadModule auth_digest_module @APACHE_MODULE_DIR@/mod_auth_digest.so
-LoadModule authn_file_module @APACHE_MODULE_DIR@/mod_authn_file.so
-LoadModule authz_user_module @APACHE_MODULE_DIR@/mod_authz_user.so
-LoadModule dir_module @APACHE_MODULE_DIR@/mod_dir.so
-LoadModule mime_module @APACHE_MODULE_DIR@/mod_mime.so
-@IF_HAVE_PHP@LoadModule php5_module @APACHE_MODULE_DIR@/mod_php5.so
+LoadModule alias_module @APACHE_MODULE_DIR@/mod_alias.so
+LoadModule auth_basic_module @APACHE_MODULE_DIR@/mod_auth_basic.so
+LoadModule auth_digest_module @APACHE_MODULE_DIR@/mod_auth_digest.so
+LoadModule authn_file_module @APACHE_MODULE_DIR@/mod_authn_file.so
+LoadModule authz_host_module @APACHE_MODULE_DIR@/mod_authz_host.so
+LoadModule authz_user_module @APACHE_MODULE_DIR@/mod_authz_user.so
+LoadModule dir_module @APACHE_MODULE_DIR@/mod_dir.so
+LoadModule mime_module @APACHE_MODULE_DIR@/mod_mime.so
+@IF_HAVE_PHP@LoadModule php5_module @APACHE_PHP_MODULE_DIR@/mod_php5.so
+LoadModule proxy_module @APACHE_MODULE_DIR@/mod_proxy.so
+LoadModule proxy_http_module @APACHE_MODULE_DIR@/mod_proxy_http.so
+LoadModule proxy_connect_module @APACHE_MODULE_DIR@/mod_proxy_connect.so
+LoadModule ssl_module @APACHE_SSL_MODULE_DIR@/mod_ssl.so
DirectoryIndex httpd.pid
AddType application/x-httpd-php .php
+
+# Proxy #1: unauthenticated
+Listen 127.0.0.1:47526
+<VirtualHost 127.0.0.1:47526>
+ ProxyRequests On
+ AllowCONNECT 47525
+
+ # Deny proxying by default
+ <Proxy *>
+ Order Deny,Allow
+ Deny from all
+ </Proxy>
+
+ # Allow local http connections
+ <Proxy http://127.0.0.1:47524*>
+ Order Allow,Deny
+ Allow from all
+ </Proxy>
+
+ # Allow CONNECT to local https port
+ <Proxy 127.0.0.1:47525>
+ Order Allow,Deny
+ Allow from all
+ </Proxy>
+
+ # Deny non-proxy requests
+ <Directory />
+ Order Deny,Allow
+ Deny from all
+ </Directory>
+</VirtualHost>
+
+# Proxy #2: authenticated
+Listen 127.0.0.1:47527
+<VirtualHost 127.0.0.1:47527>
+ ProxyRequests On
+ AllowCONNECT 47525
+
+ # Deny proxying by default
+ <Proxy *>
+ Order Deny,Allow
+ Deny from all
+ </Proxy>
+
+ # Allow local http connections with authentication
+ <Proxy http://127.0.0.1:47524*>
+ Order Allow,Deny
+ Allow from all
+
+ AuthType Basic
+ AuthName realm1
+ AuthUserFile ./htpasswd
+ Require valid-user
+ </Proxy>
+
+ # Allow CONNECT to local https port with authentication
+ <Proxy 127.0.0.1:47525>
+ Order Allow,Deny
+ Allow from all
+
+ AuthType Basic
+ AuthName realm1
+ AuthUserFile ./htpasswd
+ Require valid-user
+ </Proxy>
+
+ # Fail non-proxy requests
+ <Directory />
+ Order Deny,Allow
+ Deny from all
+ </Directory>
+</VirtualHost>
+
+# Proxy #3: unauthenticatable-to
+Listen 127.0.0.1:47528
+<VirtualHost 127.0.0.1:47528>
+ ProxyRequests On
+ AllowCONNECT 47525
+
+ # Deny proxying by default
+ <Proxy *>
+ Order Deny,Allow
+ Deny from all
+ </Proxy>
+
+ # Allow local http connections with authentication
+ <Proxy http://127.0.0.1:47524*>
+ Order Allow,Deny
+ Allow from all
+
+ AuthType Basic
+ AuthName realm1
+ AuthUserFile ./htpasswd
+ Require user no-such-user
+ </Proxy>
+
+ # Allow CONNECT to local https port with authentication
+ <Proxy 127.0.0.1:47525>
+ Order Allow,Deny
+ Allow from all
+
+ AuthType Basic
+ AuthName realm1
+ AuthUserFile ./htpasswd
+ Require user no-such-user
+ </Proxy>
+
+ # Fail non-proxy requests
+ <Directory />
+ Order Deny,Allow
+ Deny from all
+ </Directory>
+</VirtualHost>
+
+
+# SSL setup
+<IfModule mod_ssl.c>
+ Listen 127.0.0.1:47525
+
+ <VirtualHost 127.0.0.1:47525>
+ SSLEngine on
+
+ SSLCertificateFile test-cert.pem
+ SSLCertificateKeyFile test-key.pem
+
+ </VirtualHost>
+</IfModule>
+
+
+# Basic auth tests
Alias /Basic/realm1/realm2/realm1 @builddir@
Alias /Basic/realm1/realm2 @builddir@
Alias /Basic/realm1/subdir @builddir@
@@ -28,6 +168,7 @@ Alias /Basic/realm1/not @builddir@
Alias /Basic/realm1 @builddir@
Alias /Basic/realm2 @builddir@
Alias /Basic/realm3 @builddir@
+Alias /Basic @builddir@
<Location /Basic/realm1>
AuthType Basic
@@ -71,7 +212,7 @@ Alias /Basic/realm3 @builddir@
Require user user3
</Location>
-
+# Digest auth tests
Alias /Digest/realm1/realm2/realm1 @builddir@
Alias /Digest/realm1/realm2 @builddir@
Alias /Digest/realm1/subdir @builddir@
@@ -79,6 +220,7 @@ Alias /Digest/realm1/not @builddir@
Alias /Digest/realm1 @builddir@
Alias /Digest/realm2 @builddir@
Alias /Digest/realm3 @builddir@
+Alias /Digest @builddir@
<Location /Digest/realm1>
AuthType Digest
@@ -127,4 +269,3 @@ Alias /Digest/realm3 @builddir@
AuthDigestDomain /Digest/realm3
Require valid-user
</Location>
-
diff -ruNp /home/jacob/Scratch/libsoup-2.2.100/tests/Makefile.am libsoup-2.2.100/tests/Makefile.am
--- /home/jacob/Scratch/libsoup-2.2.100/tests/Makefile.am 2007-01-05 14:41:31.000000000 -0500
+++ libsoup-2.2.100/tests/Makefile.am 2007-04-09 17:03:24.000000000 -0400
@@ -1,12 +1,12 @@
INCLUDES = \
-I$(top_srcdir) \
$(XML_CFLAGS) \
- $(GLIB_CFLAGS)
+ $(GLIB_CFLAGS) \
+ $(LIBGNUTLS_CFLAGS)
LIBS = $(top_builddir)/libsoup/libsoup-$(SOUP_API_VERSION).la
noinst_PROGRAMS = \
- auth-test \
date \
dict \
dns \
@@ -17,6 +17,8 @@ noinst_PROGRAMS = \
simple-httpd \
simple-proxy \
uri-parsing \
+ $(APACHE_TESTS) \
+ $(SSL_TESTS) \
$(XMLRPC_TESTS)
auth_test_SOURCES = auth-test.c apache-wrapper.c apache-wrapper.h
@@ -26,20 +28,25 @@ dns_SOURCES = dns.c
get_SOURCES = get.c
getbug_SOURCES = getbug.c
header_parsing_SOURCES = header-parsing.c
+proxy_test_SOURCES = proxy-test.c apache-wrapper.c apache-wrapper.h
revserver_SOURCES = revserver.c
simple_httpd_SOURCES = simple-httpd.c
simple_proxy_SOURCES = simple-proxy.c
+ssl_test_SOURCES = ssl-test.c
uri_parsing_SOURCES = uri-parsing.c
xmlrpc_test_SOURCES = xmlrpc-test.c apache-wrapper.c apache-wrapper.h
if HAVE_APACHE
-APACHE_TESTS = auth-test
+APACHE_TESTS = auth-test proxy-test
+endif
+if HAVE_SSL
+SSL_TESTS = ssl-test
endif
if HAVE_XMLRPC_EPI_PHP
XMLRPC_TESTS = xmlrpc-test
endif
-TESTS = date header-parsing uri-parsing $(APACHE_TESTS) $(XMLRPC_TESTS)
+TESTS = date header-parsing uri-parsing $(APACHE_TESTS) $(SSL_TESTS) $(XMLRPC_TESTS)
EXTRA_DIST = \
libsoup.supp \
diff -ruNp /home/jacob/Scratch/libsoup-2.2.100/tests/Makefile.in libsoup-2.2.100/tests/Makefile.in
--- /home/jacob/Scratch/libsoup-2.2.100/tests/Makefile.in 2007-02-12 10:34:12.000000000 -0500
+++ libsoup-2.2.100/tests/Makefile.in 2007-05-01 15:49:10.000000000 -0400
@@ -36,11 +36,11 @@ PRE_UNINSTALL = :
POST_UNINSTALL = :
build_triplet = @build@
host_triplet = @host@
-noinst_PROGRAMS = auth-test$(EXEEXT) date$(EXEEXT) dict$(EXEEXT) \
- dns$(EXEEXT) get$(EXEEXT) getbug$(EXEEXT) \
- header-parsing$(EXEEXT) revserver$(EXEEXT) \
- simple-httpd$(EXEEXT) simple-proxy$(EXEEXT) \
- uri-parsing$(EXEEXT) $(am__EXEEXT_1)
+noinst_PROGRAMS = date$(EXEEXT) dict$(EXEEXT) dns$(EXEEXT) \
+ get$(EXEEXT) getbug$(EXEEXT) header-parsing$(EXEEXT) \
+ revserver$(EXEEXT) simple-httpd$(EXEEXT) simple-proxy$(EXEEXT) \
+ uri-parsing$(EXEEXT) $(am__EXEEXT_1) $(am__EXEEXT_2) \
+ $(am__EXEEXT_3)
subdir = tests
DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
$(srcdir)/httpd.conf.in
@@ -52,7 +52,10 @@ am__configure_deps = $(am__aclocal_m4_de
mkinstalldirs = $(install_sh) -d
CONFIG_HEADER = $(top_builddir)/config.h
CONFIG_CLEAN_FILES = httpd.conf
-@HAVE_XMLRPC_EPI_PHP_TRUE@am__EXEEXT_1 = xmlrpc-test$(EXEEXT)
+@HAVE_APACHE_TRUE@am__EXEEXT_1 = auth-test$(EXEEXT) \
+@HAVE_APACHE_TRUE@ proxy-test$(EXEEXT)
+@HAVE_SSL_TRUE@am__EXEEXT_2 = ssl-test$(EXEEXT)
+@HAVE_XMLRPC_EPI_PHP_TRUE@am__EXEEXT_3 = xmlrpc-test$(EXEEXT)
PROGRAMS = $(noinst_PROGRAMS)
am_auth_test_OBJECTS = auth-test.$(OBJEXT) apache-wrapper.$(OBJEXT)
auth_test_OBJECTS = $(am_auth_test_OBJECTS)
@@ -75,6 +78,9 @@ getbug_LDADD = $(LDADD)
am_header_parsing_OBJECTS = header-parsing.$(OBJEXT)
header_parsing_OBJECTS = $(am_header_parsing_OBJECTS)
header_parsing_LDADD = $(LDADD)
+am_proxy_test_OBJECTS = proxy-test.$(OBJEXT) apache-wrapper.$(OBJEXT)
+proxy_test_OBJECTS = $(am_proxy_test_OBJECTS)
+proxy_test_LDADD = $(LDADD)
am_revserver_OBJECTS = revserver.$(OBJEXT)
revserver_OBJECTS = $(am_revserver_OBJECTS)
revserver_LDADD = $(LDADD)
@@ -84,6 +90,9 @@ simple_httpd_LDADD = $(LDADD)
am_simple_proxy_OBJECTS = simple-proxy.$(OBJEXT)
simple_proxy_OBJECTS = $(am_simple_proxy_OBJECTS)
simple_proxy_LDADD = $(LDADD)
+am_ssl_test_OBJECTS = ssl-test.$(OBJEXT)
+ssl_test_OBJECTS = $(am_ssl_test_OBJECTS)
+ssl_test_LDADD = $(LDADD)
am_uri_parsing_OBJECTS = uri-parsing.$(OBJEXT)
uri_parsing_OBJECTS = $(am_uri_parsing_OBJECTS)
uri_parsing_LDADD = $(LDADD)
@@ -104,13 +113,15 @@ LINK = $(LIBTOOL) --tag=CC --mode=link $
$(AM_LDFLAGS) $(LDFLAGS) -o $@
SOURCES = $(auth_test_SOURCES) $(date_SOURCES) $(dict_SOURCES) \
$(dns_SOURCES) $(get_SOURCES) $(getbug_SOURCES) \
- $(header_parsing_SOURCES) $(revserver_SOURCES) \
- $(simple_httpd_SOURCES) $(simple_proxy_SOURCES) \
+ $(header_parsing_SOURCES) $(proxy_test_SOURCES) \
+ $(revserver_SOURCES) $(simple_httpd_SOURCES) \
+ $(simple_proxy_SOURCES) $(ssl_test_SOURCES) \
$(uri_parsing_SOURCES) $(xmlrpc_test_SOURCES)
DIST_SOURCES = $(auth_test_SOURCES) $(date_SOURCES) $(dict_SOURCES) \
$(dns_SOURCES) $(get_SOURCES) $(getbug_SOURCES) \
- $(header_parsing_SOURCES) $(revserver_SOURCES) \
- $(simple_httpd_SOURCES) $(simple_proxy_SOURCES) \
+ $(header_parsing_SOURCES) $(proxy_test_SOURCES) \
+ $(revserver_SOURCES) $(simple_httpd_SOURCES) \
+ $(simple_proxy_SOURCES) $(ssl_test_SOURCES) \
$(uri_parsing_SOURCES) $(xmlrpc_test_SOURCES)
ETAGS = etags
CTAGS = ctags
@@ -122,6 +133,8 @@ AMDEP_TRUE = @AMDEP_TRUE@
AMTAR = @AMTAR@
APACHE_HTTPD = @APACHE_HTTPD@
APACHE_MODULE_DIR = @APACHE_MODULE_DIR@
+APACHE_PHP_MODULE_DIR = @APACHE_PHP_MODULE_DIR@
+APACHE_SSL_MODULE_DIR = @APACHE_SSL_MODULE_DIR@
AR = @AR@
AS = @AS@
AUTOCONF = @AUTOCONF@
@@ -161,6 +174,8 @@ GTK_DOC_USE_LIBTOOL_FALSE = @GTK_DOC_USE
GTK_DOC_USE_LIBTOOL_TRUE = @GTK_DOC_USE_LIBTOOL_TRUE@
HAVE_APACHE_FALSE = @HAVE_APACHE_FALSE@
HAVE_APACHE_TRUE = @HAVE_APACHE_TRUE@
+HAVE_SSL_FALSE = @HAVE_SSL_FALSE@
+HAVE_SSL_TRUE = @HAVE_SSL_TRUE@
HAVE_XMLRPC_EPI_PHP_FALSE = @HAVE_XMLRPC_EPI_PHP_FALSE@
HAVE_XMLRPC_EPI_PHP_TRUE = @HAVE_XMLRPC_EPI_PHP_TRUE@
HTML_DIR = @HTML_DIR@
@@ -170,6 +185,9 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_SCRIPT = @INSTALL_SCRIPT@
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
LDFLAGS = @LDFLAGS@
+LIBGCRYPT_CFLAGS = @LIBGCRYPT_CFLAGS@
+LIBGCRYPT_CONFIG = @LIBGCRYPT_CONFIG@
+LIBGCRYPT_LIBS = @LIBGCRYPT_LIBS@
LIBGNUTLS_CFLAGS = @LIBGNUTLS_CFLAGS@
LIBGNUTLS_LIBS = @LIBGNUTLS_LIBS@
LIBOBJS = @LIBOBJS@
@@ -256,7 +274,8 @@ target_alias = @target_alias@
INCLUDES = \
-I$(top_srcdir) \
$(XML_CFLAGS) \
- $(GLIB_CFLAGS)
+ $(GLIB_CFLAGS) \
+ $(LIBGNUTLS_CFLAGS)
auth_test_SOURCES = auth-test.c apache-wrapper.c apache-wrapper.h
date_SOURCES = date.c
@@ -265,14 +284,17 @@ dns_SOURCES = dns.c
get_SOURCES = get.c
getbug_SOURCES = getbug.c
header_parsing_SOURCES = header-parsing.c
+proxy_test_SOURCES = proxy-test.c apache-wrapper.c apache-wrapper.h
revserver_SOURCES = revserver.c
simple_httpd_SOURCES = simple-httpd.c
simple_proxy_SOURCES = simple-proxy.c
+ssl_test_SOURCES = ssl-test.c
uri_parsing_SOURCES = uri-parsing.c
xmlrpc_test_SOURCES = xmlrpc-test.c apache-wrapper.c apache-wrapper.h
-@HAVE_APACHE_TRUE@APACHE_TESTS = auth-test
+@HAVE_APACHE_TRUE@APACHE_TESTS = auth-test proxy-test
+@HAVE_SSL_TRUE@SSL_TESTS = ssl-test
@HAVE_XMLRPC_EPI_PHP_TRUE@XMLRPC_TESTS = xmlrpc-test
-TESTS = date header-parsing uri-parsing $(APACHE_TESTS) $(XMLRPC_TESTS)
+TESTS = date header-parsing uri-parsing $(APACHE_TESTS) $(SSL_TESTS) $(XMLRPC_TESTS)
EXTRA_DIST = \
libsoup.supp \
test-cert.pem \
@@ -345,6 +367,9 @@ getbug$(EXEEXT): $(getbug_OBJECTS) $(get
header-parsing$(EXEEXT): $(header_parsing_OBJECTS) $(header_parsing_DEPENDENCIES)
@rm -f header-parsing$(EXEEXT)
$(LINK) $(header_parsing_LDFLAGS) $(header_parsing_OBJECTS) $(header_parsing_LDADD) $(LIBS)
+proxy-test$(EXEEXT): $(proxy_test_OBJECTS) $(proxy_test_DEPENDENCIES)
+ @rm -f proxy-test$(EXEEXT)
+ $(LINK) $(proxy_test_LDFLAGS) $(proxy_test_OBJECTS) $(proxy_test_LDADD) $(LIBS)
revserver$(EXEEXT): $(revserver_OBJECTS) $(revserver_DEPENDENCIES)
@rm -f revserver$(EXEEXT)
$(LINK) $(revserver_LDFLAGS) $(revserver_OBJECTS) $(revserver_LDADD) $(LIBS)
@@ -354,6 +379,9 @@ simple-httpd$(EXEEXT): $(simple_httpd_OB
simple-proxy$(EXEEXT): $(simple_proxy_OBJECTS) $(simple_proxy_DEPENDENCIES)
@rm -f simple-proxy$(EXEEXT)
$(LINK) $(simple_proxy_LDFLAGS) $(simple_proxy_OBJECTS) $(simple_proxy_LDADD) $(LIBS)
+ssl-test$(EXEEXT): $(ssl_test_OBJECTS) $(ssl_test_DEPENDENCIES)
+ @rm -f ssl-test$(EXEEXT)
+ $(LINK) $(ssl_test_LDFLAGS) $(ssl_test_OBJECTS) $(ssl_test_LDADD) $(LIBS)
uri-parsing$(EXEEXT): $(uri_parsing_OBJECTS) $(uri_parsing_DEPENDENCIES)
@rm -f uri-parsing$(EXEEXT)
$(LINK) $(uri_parsing_LDFLAGS) $(uri_parsing_OBJECTS) $(uri_parsing_LDADD) $(LIBS)
@@ -375,9 +403,11 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/get.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getbug.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/header-parsing.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/proxy-test.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/revserver.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/simple-httpd.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/simple-proxy.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ssl-test.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/uri-parsing.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xmlrpc-test.Po@am__quote@
diff -ruNp /home/jacob/Scratch/libsoup-2.2.100/tests/proxy-test.c libsoup-2.2.100/tests/proxy-test.c
--- /home/jacob/Scratch/libsoup-2.2.100/tests/proxy-test.c 1969-12-31 19:00:00.000000000 -0500
+++ libsoup-2.2.100/tests/proxy-test.c 2007-04-09 17:03:24.000000000 -0400
@@ -0,0 +1,148 @@
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "libsoup/soup.h"
+#include "apache-wrapper.h"
+
+int errors = 0;
+
+typedef struct {
+ const char *explanation;
+ const char *url;
+ const guint final_status;
+} SoupProxyTest;
+
+SoupProxyTest tests[] = {
+ { "GET -> 200", "", SOUP_STATUS_OK },
+ { "GET -> 404", "/not-found", SOUP_STATUS_NOT_FOUND },
+ { "GET -> 401 -> 200", "/Basic/realm1/", SOUP_STATUS_OK },
+ { "GET -> 401 -> 401", "/Basic/realm2/", SOUP_STATUS_UNAUTHORIZED },
+ { "GET -> 403", "http://no-proxy.example.com/", SOUP_STATUS_FORBIDDEN },
+};
+int ntests = sizeof (tests) / sizeof (tests[0]);
+
+#define HTTP_SERVER "http://127.0.0.1:47524"
+#define HTTPS_SERVER "https://127.0.0.1:47525"
+
+enum {
+ SIMPLE_PROXY,
+ AUTH_PROXY,
+ UNAUTH_PROXY
+};
+static const char *proxies[] = {
+ "http://127.0.0.1:47526",
+ "http://127.0.0.1:47527",
+ "http://127.0.0.1:47528"
+};
+static const char *proxy_names[] = {
+ "simple proxy",
+ "authenticated proxy",
+ "unauthenticatable-to proxy"
+};
+
+static void
+authenticate (SoupSession *session, SoupMessage *msg,
+ const char *auth_type, const char *auth_realm,
+ char **username, char **password, gpointer data)
+{
+ *username = g_strdup ("user1");
+ *password = g_strdup ("realm1");
+}
+
+static void
+test_url (const char *url, int proxy, guint expected, gboolean sync)
+{
+ SoupSession *session;
+ SoupUri *proxy_uri;
+ SoupMessage *msg;
+
+ printf (" GET %s via %s\n", url, proxy_names[proxy]);
+ if (proxy == UNAUTH_PROXY && expected != SOUP_STATUS_FORBIDDEN)
+ expected = SOUP_STATUS_PROXY_UNAUTHORIZED;
+
+ /* We create a new session for each request to ensure that
+ * connections/auth aren't cached between tests.
+ */
+ proxy_uri = soup_uri_new (proxies[proxy]);
+ session = g_object_new (sync ? SOUP_TYPE_SESSION_SYNC : SOUP_TYPE_SESSION_ASYNC,
+ SOUP_SESSION_PROXY_URI, proxy_uri,
+ NULL);
+ soup_uri_free (proxy_uri);
+ g_signal_connect (session, "authenticate",
+ G_CALLBACK (authenticate), NULL);
+
+ msg = soup_message_new (SOUP_METHOD_GET, url);
+ if (!msg) {
+ fprintf (stderr, "proxy-test: Could not parse URI\n");
+ exit (1);
+ }
+
+ soup_session_send_message (session, msg);
+
+ printf (" %d %s\n", msg->status_code, msg->reason_phrase);
+ if (msg->status_code != expected) {
+ printf (" EXPECTED %d!\n", expected);
+ errors++;
+ }
+
+ g_object_unref (msg);
+ soup_session_abort (session);
+ g_object_unref (session);
+}
+
+static void
+run_test (int i, gboolean sync)
+{
+ char *http_url, *https_url;
+
+ printf ("Test %d: %s (%s)\n", i + 1, tests[i].explanation,
+ sync ? "sync" : "async");
+
+ if (!strncmp (tests[i].url, "http", 4)) {
+ http_url = g_strdup (tests[i].url);
+ https_url = g_strdup_printf ("https%s", tests[i].url + 4);
+ } else {
+ http_url = g_strconcat (HTTP_SERVER, tests[i].url, NULL);
+ https_url = g_strconcat (HTTPS_SERVER, tests[i].url, NULL);
+ }
+ test_url (http_url, SIMPLE_PROXY, tests[i].final_status, sync);
+ test_url (https_url, SIMPLE_PROXY, tests[i].final_status, sync);
+ test_url (http_url, AUTH_PROXY, tests[i].final_status, sync);
+ test_url (https_url, AUTH_PROXY, tests[i].final_status, sync);
+ test_url (http_url, UNAUTH_PROXY, tests[i].final_status, sync);
+ test_url (https_url, UNAUTH_PROXY, tests[i].final_status, sync);
+
+ g_free (http_url);
+ g_free (https_url);
+
+ printf ("\n");
+}
+
+int
+main (int argc, char **argv)
+{
+ int i;
+
+ g_type_init ();
+ g_thread_init (NULL);
+
+ if (!apache_init ()) {
+ fprintf (stderr, "Could not start apache\n");
+ return 1;
+ }
+
+ for (i = 0; i < ntests; i++) {
+ run_test (i, FALSE);
+ run_test (i, TRUE);
+ }
+
+ apache_cleanup ();
+
+ printf ("proxy-test: %d errors\n", errors);
+ return errors;
+}
diff -ruNp /home/jacob/Scratch/libsoup-2.2.100/tests/ssl-test.c libsoup-2.2.100/tests/ssl-test.c
--- /home/jacob/Scratch/libsoup-2.2.100/tests/ssl-test.c 1969-12-31 19:00:00.000000000 -0500
+++ libsoup-2.2.100/tests/ssl-test.c 2007-05-01 15:44:30.000000000 -0400
@@ -0,0 +1,323 @@
+#include <gnutls/gnutls.h>
+#include <glib.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <netinet/in.h>
+#include <sys/socket.h>
+
+#include "libsoup/soup-socket.h"
+#include "libsoup/soup-ssl.h"
+
+#define BUFSIZE 1024
+#define DH_BITS 1024
+
+GMainLoop *loop;
+gnutls_dh_params_t dh_params;
+
+/* SERVER */
+
+/* Read @bufsize bytes into @buf from @session. */
+static void
+server_read (gnutls_session_t session, char *buf, int bufsize)
+{
+ int total, nread;
+
+ total = 0;
+ while (total < bufsize) {
+ nread = gnutls_record_recv (session, buf + total,
+ bufsize - total);
+ if (nread <= 0)
+ g_error ("server read failed at position %d", total);
+ total += nread;
+ }
+}
+
+/* Write @bufsize bytes from @buf to @session, forcing 3 rehandshakes
+ * along the way. (We do an odd number of rehandshakes to make sure
+ * they occur at weird times relative to the client's read buffer
+ * size.)
+ */
+static void
+server_write (gnutls_session_t session, char *buf, int bufsize)
+{
+ int total, nwrote;
+ int next_rehandshake = bufsize / 3;
+
+ total = 0;
+ while (total < bufsize) {
+ if (total >= next_rehandshake) {
+ if (gnutls_rehandshake (session) < 0)
+ g_error ("client refused rehandshake at position %d", total);
+ if (gnutls_handshake (session) < 0)
+ g_error ("server rehandshake failed at position %d", total);
+ next_rehandshake = MIN (bufsize, next_rehandshake + bufsize / 3);
+ }
+
+ nwrote = gnutls_record_send (session, buf + total,
+ next_rehandshake - total);
+ if (nwrote <= 0)
+ g_error ("server write failed at position %d: %d", total, nwrote);
+ total += nwrote;
+ }
+}
+
+const char *ssl_cert_file = "test-cert.pem";
+const char *ssl_key_file = "test-key.pem";
+
+static gpointer
+server_thread (gpointer user_data)
+{
+ int listener = GPOINTER_TO_INT (user_data), client;
+ gnutls_certificate_credentials creds;
+ gnutls_session_t session;
+ struct sockaddr_in sin;
+ int len;
+ char buf[BUFSIZE];
+ int status;
+
+ gnutls_certificate_allocate_credentials (&creds);
+ if (gnutls_certificate_set_x509_key_file (creds,
+ ssl_cert_file, ssl_key_file,
+ GNUTLS_X509_FMT_PEM) != 0) {
+ g_error ("Failed to set SSL certificate and key files "
+ "(%s, %s).", ssl_cert_file, ssl_key_file);
+ }
+ gnutls_certificate_set_dh_params (creds, dh_params);
+
+ /* Create a new session */
+ gnutls_init (&session, GNUTLS_SERVER);
+ gnutls_set_default_priority (session);
+ gnutls_credentials_set (session, GNUTLS_CRD_CERTIFICATE, creds);
+ gnutls_dh_set_prime_bits (session, DH_BITS);
+
+ /* Wait for client thread to connect */
+ len = sizeof (sin);
+ client = accept (listener, (struct sockaddr *) &sin, (void *)&len);
+ gnutls_transport_set_ptr (session, GINT_TO_POINTER (client));
+
+ /* Initial handshake */
+ status = gnutls_handshake (session);
+ if (status < 0)
+ g_error ("initial handshake failed: %d", status);
+
+ /* Synchronous client test. */
+ server_read (session, buf, BUFSIZE);
+ server_write (session, buf, BUFSIZE);
+
+ /* Async client test. */
+ server_read (session, buf, BUFSIZE);
+ server_write (session, buf, BUFSIZE);
+
+ /* That's all, folks. */
+ gnutls_bye (session, GNUTLS_SHUT_WR);
+ gnutls_deinit (session);
+ close (client);
+
+ return NULL;
+}
+
+/* async client code */
+
+typedef struct {
+ char writebuf[BUFSIZE], readbuf[BUFSIZE];
+ int total;
+} AsyncData;
+
+static void
+async_read (SoupSocket *sock, gpointer user_data)
+{
+ AsyncData *data = user_data;
+ SoupSocketIOStatus status;
+ gsize n;
+
+ do {
+ status = soup_socket_read (sock, data->readbuf + data->total,
+ BUFSIZE - data->total, &n);
+ if (status == SOUP_SOCKET_OK)
+ data->total += n;
+ } while (status == SOUP_SOCKET_OK && data->total < BUFSIZE);
+
+ if (status == SOUP_SOCKET_ERROR || status == SOUP_SOCKET_EOF)
+ g_error ("Async read got status %d", status);
+ else if (status == SOUP_SOCKET_WOULD_BLOCK)
+ return;
+
+ if (memcmp (data->writebuf, data->readbuf, BUFSIZE) != 0)
+ g_error ("Sync read didn't match write");
+
+ g_main_loop_quit (loop);
+}
+
+static void
+async_write (SoupSocket *sock, gpointer user_data)
+{
+ AsyncData *data = user_data;
+ SoupSocketIOStatus status;
+ gsize n;
+
+ do {
+ status = soup_socket_write (sock, data->writebuf + data->total,
+ BUFSIZE - data->total, &n);
+ if (status == SOUP_SOCKET_OK)
+ data->total += n;
+ } while (status == SOUP_SOCKET_OK && data->total < BUFSIZE);
+
+ if (status == SOUP_SOCKET_ERROR || status == SOUP_SOCKET_EOF)
+ g_error ("Async write got status %d", status);
+ else if (status == SOUP_SOCKET_WOULD_BLOCK)
+ return;
+
+ data->total = 0;
+ async_read (sock, user_data);
+}
+
+static gboolean
+start_writing (gpointer user_data)
+{
+ SoupSocket *sock = user_data;
+ AsyncData *data;
+ int i;
+
+ data = g_new (AsyncData, 1);
+ for (i = 0; i < BUFSIZE; i++)
+ data->writebuf[i] = i & 0xFF;
+
+ g_signal_connect (sock, "writable",
+ G_CALLBACK (async_write), data);
+ g_signal_connect (sock, "readable",
+ G_CALLBACK (async_read), data);
+
+ async_write (sock, data);
+ return FALSE;
+}
+
+int debug;
+
+static void
+debug_log (int level, const char *str)
+{
+ fputs (str, stderr);
+}
+
+int
+main (int argc, char **argv)
+{
+ int opt, listener, sin_len, port, i;
+ struct sockaddr_in sin;
+ GThread *server;
+ char writebuf[BUFSIZE], readbuf[BUFSIZE];
+ SoupSocket *sock;
+ gsize n, total;
+ SoupSocketIOStatus status;
+
+ g_type_init ();
+ g_thread_init (NULL);
+
+ while ((opt = getopt (argc, argv, "c:d:k:")) != -1) {
+ switch (opt) {
+ case 'c':
+ ssl_cert_file = optarg;
+ break;
+ case 'd':
+ debug = atoi (optarg);
+ break;
+ case 'k':
+ ssl_key_file = optarg;
+ break;
+
+ case '?':
+ fprintf (stderr, "Usage: %s [-d debuglevel] [-c ssl-cert-file] [-k ssl-key-file]\n",
+ argv[0]);
+ break;
+ }
+ }
+
+ if (debug) {
+ gnutls_global_set_log_function (debug_log);
+ gnutls_global_set_log_level (debug);
+ }
+
+ /* Create server socket */
+ listener = socket (AF_INET, SOCK_STREAM, 0);
+ if (listener == -1) {
+ perror ("creating listening socket");
+ exit (1);
+ }
+
+ memset (&sin, 0, sizeof (sin));
+ sin.sin_family = AF_INET;
+ sin.sin_addr.s_addr = INADDR_ANY;
+
+ if (bind (listener, (struct sockaddr *) &sin, sizeof (sin)) == -1) {
+ perror ("binding listening socket");
+ exit (1);
+ }
+
+ if (listen (listener, 1) == -1) {
+ perror ("listening on socket");
+ exit (1);
+ }
+
+ sin_len = sizeof (sin);
+ getsockname (listener, (struct sockaddr *)&sin, (void *)&sin_len);
+ port = ntohs (sin.sin_port);
+
+ /* Now spawn server thread */
+ server = g_thread_create (server_thread, GINT_TO_POINTER (listener),
+ FALSE, NULL);
+
+ /* And create the client */
+ sock = soup_socket_client_new_sync ("127.0.0.1", port,
+ soup_ssl_get_client_credentials (NULL),
+ &status);
+ if (status != SOUP_STATUS_OK) {
+ g_error ("Could not create client socket: %s",
+ soup_status_get_phrase (status));
+ }
+
+ soup_socket_start_ssl (sock);
+
+ /* Synchronous client test */
+ for (i = 0; i < BUFSIZE; i++)
+ writebuf[i] = i & 0xFF;
+
+ total = 0;
+ while (total < BUFSIZE) {
+ status = soup_socket_write (sock, writebuf + total,
+ BUFSIZE - total, &n);
+ if (status != SOUP_SOCKET_OK)
+ g_error ("Sync write got status %d", status);
+ total += n;
+ }
+
+ total = 0;
+ while (total < BUFSIZE) {
+ status = soup_socket_read (sock, readbuf + total,
+ BUFSIZE - total, &n);
+ if (status != SOUP_SOCKET_OK)
+ g_error ("Sync read got status %d", status);
+ total += n;
+ }
+
+ if (memcmp (writebuf, readbuf, BUFSIZE) != 0)
+ g_error ("Sync read didn't match write");
+
+ printf ("SYNCHRONOUS SSL TEST PASSED\n");
+
+ /* Switch socket to async and do it again */
+
+ g_object_set (sock,
+ SOUP_SOCKET_FLAG_NONBLOCKING, TRUE,
+ NULL);
+
+ g_idle_add (start_writing, sock);
+ loop = g_main_loop_new (NULL, TRUE);
+ g_main_loop_run (loop);
+
+ printf ("ASYNCHRONOUS SSL TEST PASSED\n");
+
+ /* Success */
+ return 0;
+}