Split libsoup out of soup. ChangeLog.old contains the original soup
authorDan Winship <danw@src.gnome.org>
Tue, 5 Nov 2002 19:45:46 +0000 (19:45 +0000)
committerDan Winship <danw@src.gnome.org>
Tue, 5 Nov 2002 19:45:46 +0000 (19:45 +0000)
* Split libsoup out of soup. ChangeLog.old contains the original
soup ChangeLog.

* Makefile.am, etc: Fix things up to work with the new directory
layout. Disable docs until we fix them.

* autogen.sh: Use gnome-autogen.sh

* configure.in: Require autoconf 2.53. Remove stuff that was only
needed for httpd or wsdl code. Remove glib1 support. Bump version
to 2.0.

* libsoup/Makefile.am: Rename library to libsoup-2.0, put includes
in ${includedir}/soup-2.0

* libsoup/*: Merge soup-0-7 back onto the trunk. Remove
SOAP-specific stuff, Windows support, and other things that
weren't being maintained.

* soup-config.in, soupConf.sh: Kill these. We only support
pkg-config now.

46 files changed:
.cvsignore
ChangeLog
HACKING
MAINTAINERS [new file with mode: 0644]
Makefile.am
README
autogen.sh
configure.in
docs/reference/Makefile.am
libsoup/.cvsignore
libsoup/Makefile.am
libsoup/soup-auth.c
libsoup/soup-auth.h
libsoup/soup-context.c
libsoup/soup-context.h
libsoup/soup-headers.c
libsoup/soup-headers.h
libsoup/soup-message.c
libsoup/soup-message.h
libsoup/soup-misc.c
libsoup/soup-misc.h
libsoup/soup-nss.c
libsoup/soup-nss.h
libsoup/soup-ntlm.c
libsoup/soup-ntlm.h
libsoup/soup-openssl.c
libsoup/soup-openssl.h
libsoup/soup-private.h
libsoup/soup-queue.c
libsoup/soup-queue.h
libsoup/soup-server.c
libsoup/soup-server.h
libsoup/soup-socket-unix.c
libsoup/soup-socket.c
libsoup/soup-socket.h
libsoup/soup-socks.c
libsoup/soup-socks.h
libsoup/soup-ssl-proxy.c
libsoup/soup-ssl.c
libsoup/soup-ssl.h
libsoup/soup-transfer.c
libsoup/soup-transfer.h
libsoup/soup-uri.c
libsoup/soup-uri.h
libsoup/soup.h
soup-2.0.pc.in

index a9df98d..c49d391 100644 (file)
@@ -1,5 +1,5 @@
 aclocal.m4
-config.cache
+autom4te*.cache
 config.guess
 config.h
 config.h.in
@@ -13,11 +13,6 @@ ltmain.sh
 Makefile
 Makefile.in
 soup.pc
-soup.spec
-soup-config
-soupConf.sh
-soup_apacheConf.sh
-soup_wsdlConf.sh
 stamp-h
 stamp.h
 stamp-h.in
index ca2cf47..713c6ee 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
-2002-05-31  Jacob Berkman  <jacob@ximian.com>
+2002-11-05  Dan Winship  <danw@ximian.com>
 
-       * src/libsoup/soup-message.h (SoupHandlerFilterType): add
-       'typedef'
+       * Split libsoup out of soup. ChangeLog.old contains the original
+       soup ChangeLog.
 
-2002-04-08  Alex Graveley  <alex@ximian.com>
+       * Makefile.am, etc: Fix things up to work with the new directory
+       layout. Disable docs until we fix them.
 
-       * src/libsoup/soup-server.c (auth_context_copy): Return copied
-       auth context. doh.
+       * autogen.sh: Use gnome-autogen.sh
 
-2002-03-21  Alex Graveley  <alex@ximian.com>
+       * configure.in: Require autoconf 2.53. Remove stuff that was only
+       needed for httpd or wsdl code. Remove glib1 support. Bump version
+       to 2.0.
 
-       * src/libsoup/soup-queue.c (soup_queue_read_headers_cb): Handle
-       forced no-content response codes 204, 205, and 304.  Check
-       transfer-encoding before content-length to handle broken
-       Traffic-Server proxies.
-
-2002-03-20  Alex Graveley  <alex@ximian.com>
-
-       * src/libsoup/soup-server.c (soup_server_get_handler): Return
-       default handler if none exist.  Unregister default handler before
-       resetting.
-       (soup_server_register): Break out auth copying.
-       (auth_context_copy): To here.
-
-2002-03-20  Alex Graveley  <alex@ximian.com>
-
-       * src/libsoup/soup-queue.c (start_request): Issue callback
-       directly as we might not be in the request processing loop.
-       (proxy_connect): Ditto.
-       (soup_queue_connect_cb): Ditto.
-       (request_in_progress): Impl. Check request is in queue.
-       (soup_idle_handle_new_requests): Use request_in_progress before
-       assigning connect_tag.
-
-2002-03-13  Alex Graveley  <alex@ximian.com>
-
-       * src/soup-httpd/soup-httpd.c (ap_ctx_get): Add stub so
-       soup-apache modules an be run by soup-httpd.
-       (ap_get_server_port): Ditto.
-
-       * src/soup-wsdl/wsdl-soap-skels.c (wsdl_emit_soap_skels_service):
-       Generate the _get_server function, which returns a SoupServer
-       representing the protocol/port defined in the WSDL file.
-
-       * tests/stockquote2-mod-server.sh: Added.  Runs soup-httpd using
-       the libstockquote2.so module generated from
-       tests/stockquote2-mod-server.c
-
-       * tests/stockquote2-mod-server.c: Update for new API generated by
-       soup-wsdl.
-
-       * tests/mod-server-test.c (soup_server_init): Update for new
-       soup_server_register API.
-
-2002-03-13  Alex Graveley  <alex@ximian.com>
-
-       * tests/stockquote2-client.c (callback): Check for transport
-       error.
-
-       * src/libsoup/soup-env.c (soup_env_get_header): Handle fully
-       qualified header names in URL form.
-
-2002-03-13  Alex Graveley  <alex@ximian.com>
-
-       * src/soup-wsdl/wsdl-soap-stubs.c (emit_sync_stub): #if 0 out
-       generated code to use overridden URL in requests.
-
-       * src/libsoup/soup-env.c (copy_header): Make static.
-
-       * src/libsoup/soup-env.h: Fix macros.
-
-       * tests/stockquote2-client.c: Update for new client API.
-
-2002-03-13  Alex Graveley  <alex@ximian.com>
-
-       * tests/stockquote2-server.c: Update for new server API.
-
-       * tests/server-test.c (soup_server_init): Use auth_callback to
-       validate requests to /hello.
-
-2002-03-13  Alex Graveley  <alex@ximian.com>
-
-       * src/libwsdl/wsdl-soap-parse.c (wsdl_soap_headers): Use
-       soup_env_add_recv_header to add the new header to the incoming
-       headers.
-
-2002-03-12  Alex Graveley  <alex@ximian.com>
-
-       * src/soup-ssl-proxy/soup-openssl.c (soup_openssl_get_iochannel):
-       Loop on SSL_connect for some buggy versions of OpenSSL that still
-       return SSL_ERROR_WANT_READ/WRITE even for syncronous sockets.
-       Thanks to Chris Toshok for finding this.
-
-2002-03-11  Alex Graveley  <alex@ximian.com>
-
-       * configure.in, src/libsoup/soup-private.h: Bump development
-       version to 0.7.99.
-
-       * Merge all changes from soup-0-6 branch.
-
-2002-03-07  Alex Graveley  <alex@ximian.com>
-
-       * configure.in: SOUP_AGE goes to 1, SOUP_CURRENT goes to 4.
-       Update version to 0.6.99.
-
-       * src/libsoup/soup-private.h (VERSION): Update win version to
-       Win/0.6.99.
-
-2002-03-07  Alex Graveley  <alex@ximian.com>
-
-       * src/libsoup/soup-context.c (soup_context_connect_cb): Remove
-       debugging g_print.
-
-2002-03-07  Alex Graveley  <alex@ximian.com>
-
-       * src/libsoup/soup-socket.h: Add soup_address_lookup_in_cache.
-
-       * src/libsoup/soup-socket.c (soup_socket_connect): Handle host
-       address already being resolved by checking in address cache.
-       Allows us to return a non-null state pointer if soup_address_new
-       calls its callback inline, but soup_socket_new does not.
-
-       * src/libsoup/soup-socket-unix.c (lookup_in_cache_internal): Impl,
-       checks the address cache for an existing resolved address or
-       in progress lookup.
-       (soup_address_lookup_in_cache): Impl, return existing resolved
-       address if it exists.
-       (soup_address_new): use lookup_in_cache_internal.
-
-       * src/libsoup/soup-socket-win.c (soup_address_get_cached): Impl,
-       return NULL as windows has no address hash.
-
-2002-02-26  JP Rosevear  <jpr@ximian.com>
-
-       * src/libsoup/soup-socket-unix.c (soup_address_new): inaddr is a
-       different type for inet_addr, calculate sizeof directly
-
-2002-02-25  JP Rosevear  <jpr@ximian.com>
-
-       * src/libsoup/soup-socket-unix.c: apparently some platforms don't
-       define INADDR_NONE either
-
-2002-02-25  JP Rosevear  <jpr@ximian.com>
-       
-       * src/soup-httpd/Makefile.am: add popt cflags to includes
-
-       * src/libsoup/soup-socket.c: apparently INET_ADDRSTRLEN is not
-       defined on some unix platforms
-
-       * src/libsoup/soup-socket-unix.c (soup_address_new): handle not
-       have inet_pton and inet_aton with inet_addr
-
-       * configure.in: check for inet_aton as well and allow config
-       options to specify popt location
-
-2002-02-23  Alex Graveley  <alex@ximian.com>
-
-       * src/libsoup/soup-queue.c (proxy_connect): Pull proxy connection
-       code out of soup_queue_connect_cb to here.
-       (start_request): Delay calling soup_message_issue_callback here.
-       (soup_queue_connect_cb): Ditto.
-       (soup_idle_handle_new_requests): Call soup_message_issue_callback
-       if req->errorcode is set.  This avoids an FMW when setting the
-       connect tag on a request which has a connect error and has been
-       freed.
-
-       * src/libsoup/soup-message.c (requeue_connect_cb): Call
-       soup_message_issue_callback if req->errorcode is set.
-
-       * src/libsoup/soup-context.c (soup_context_connect_cb): Add
-       timeout handler to retry connect if new connection failed and
-       there are existing connections to this host.
-       (soup_context_get_connection): Drop timeout interval to 150 from 500.
-
-       * src/libsoup/soup-misc.c: Set default connection limit to 10.
-
-2002-02-17  Alex Graveley  <alex@ximian.com>
-
-       * src/libsoup/soup-socket.c (soup_socket_connect_inetaddr_cb):
-       Check result from soup_socket_new.
-
-       * src/libsoup/soup-queue.c (soup_idle_handle_new_requests): Check
-       result from soup_context_get_connection.
-
-       * src/libsoup/soup-context.c (soup_context_connect_cb): Don't
-       access 'data' after free.
-       (soup_context_get_connection): Check return from
-       soup_socket_connect, as a null result means our callback has been
-       issued and our state freed.
-
-2002-02-15  Dan Winship  <danw@ximian.com>
-
-       * src/libsoup/soup-queue.c (soup_queue_shutdown): Only
-       g_source_remove the idle handler if it's been set, to avoid a glib
-       warning.
-
-2002-02-14  Alex Graveley  <alex@ximian.com>
-
-       * src/libsoup/soup-message.c (soup_message_send): Check if
-       soup_initialized is FALSE signifying that soup_shutdown has been
-       called while processing.
-
-       * src/libsoup/soup-queue.c (soup_queue_shutdown): Set
-       soup_initialized to FALSE so any currently running synch sends
-       will quit.
-
-2002-02-13  Ettore Perazzoli  <ettore@ximian.com>
-
-       * src/libsoup/soup-ntlm.c (soup_ntlm_response): Set `decodelen' to
-       be 5 bytes less than the challenge's length to avoid overflowing
-       the input buffer.
-
-2002-02-13  Dan Winship  <danw@ximian.com>
-
-       * src/libsoup/soup-queue.c (soup_queue_add_request,
-       soup_queue_remove_request, soup_queue_first_request,
-       soup_queue_next_request): Routines to all simulataneous iteration
-       and modification of the active request list. Fixes Ximian 14030.
-       (soup_idle_handle_new_requests): Use the above functions.
-       (soup_queue_message): Likewise.
-       (soup_queue_shutdown): Likewise.
-
-       * src/libsoup/soup-message.c (soup_message_cleanup): Use
-       soup_queue_remove_request.
-
-2002-02-10  Alex Graveley  <alex@ximian.com>
-
-       * src/libsoup/soup-transfer.c (soup_transfer_read_cb): Temporary
-       fix for 100% cpu usage as HUPs are not being caught in some cases.
-
-2002-02-08  Dan Winship  <danw@ximian.com>
-
-       * src/soup-ssl-proxy/soup-openssl.c (soup_openssl_write): Handle
-       SSL_ERROR_WANT_READ here too. Fixes at least Ximian 19792 and
-       maybe others.
-
-2002-01-17  Joe Shaw  <joe@ximian.com>
-
-       * src/libsoup/soup-message.c: Add soup_message_get_http_version()
-       function.
-
-2002-01-08  Alex Graveley  <alex@ximian.com>
-
-       * src/libsoup/soup-error.h: Add SOUP_ERROR_MOVED_TEMPORARILY
-       (which was in early HTTP1.1 and HTTP1.0 specs) defined to
-       SOUP_ERROR_FOUND (its replacement).
-
-       * configure.in: Use /usr/lib as the default location for nss and
-       nspr libs. Also, NSS static libs are named differently from their
-       dynamic version.
-
-2002-01-08  Dan Winship  <danw@ximian.com>
-
-       * src/libsoup/soup-transfer.c (issue_final_callback): Remove the
-       gio sources from the reader before invoking the read_done
-       callback, since the connection will be marked free before the
-       user's callback is called, so if that callback posts another
-       request synchronously, the callback will end up getting called
-       back again when the new request finishes, which is wrong.
-
-2002-01-08  Alex Graveley  <alex@ximian.com>
-
-       * TODO: Update
-
-       * acconfig.h: undef SSL_PROXY_NAME
-
-       * src/libsoup/soup-ssl.c (soup_ssl_get_iochannel): Execute
-       customly chosen SSL proxy name.
-
-       * src/soup-ssl-proxy/Makefile.am (install-exec-hook): Add
-       install-time hook for customly named SSL proxy.
-
-       * configure.in: Don't let -lpopt sneak into $LIBS. Add option to
-       allow custom name for the openssl proxy.  Add option to allow
-       static linking of the SSL library.
-
-2002-01-02  Rodrigo Moya <rodrigo@ximian.com>
-
-       * src/libsoup-apache/soup-apache.c (soup_apache_handler): updated
-       for the new field names in SoupServerAuthBasic
-
-2001-12-21  Alex Graveley  <alex@ximian.com>
-
-       * src/libsoup/Makefile.am (libsoup_la_SOURCES): Add
-       soup-server-auth.c.
-
-       * src/libsoup/soup-server-auth.c: Implement server-side
-       basic/digest authentication.
-       (soup_server_auth_get_user): Impl. Allows server auth/path handler
-       to get the username.
-       (soup_server_auth_check_passwd): Impl. Allows server auth/path
-       handler to check a password against the one used in the request.
-
-       * src/libsoup/soup-server.c (call_handler): Create SoupServerAuth
-       and call auth context's callback before calling path handler.
-       (message_new): Don't create temporary context, just pass NULL.
-       (soup_server_register): Copy auth context correctly.
-       (soup_server_message_new): If a server message already exists,
-       return that.
-       (soup_server_message_finish): Start server message as well as
-       finish, in case message_start is never called.
-
-       * src/libsoup/soup-private.h: Include sys/types.h so sockaddr
-       works for FreeBSD.
-
-       * src/libsoup/soup-misc.c: Move base64 encoding/decoding here from
-       soup-ntlm.c.  Remove copyright notice as soup_base64_encode is now
-       taken from evolution.
-       (soup_base64_encode): Use soup_base64_encode_close.
-       (soup_base64_decode): Impl. Use soup_base64_decode_step.
-
-       * src/libsoup/soup-misc.h: Make base64 code public.
-
-       * src/libsoup/soup-ntlm.c: Use base64 code from soup-misc.c.
-
-       * src/libsoup/soup-headers.c: Move header parameter parsing to
-       here from soup-auth.c.
-
-       * src/libsoup/soup-auth.c: Use header parsing from soup-headers.c.
-       (digest_init_func): Handle empty digest
-       realm or user passwd.
-       (decode_data_type): Return 0 on empty value.
-
-       * src/libsoup/soup-uri.c (soup_uri_equal): Impl.
-
-2001-12-19  Alex Graveley  <alex@ximian.com>
-
-       * src/soup-ssl-proxy/soup-openssl.c (soup_openssl_seed): #define
-       RAND_status to constants for older versions of OpenSSL (before
-       0.9.5).
-
-       * src/soup-ssl-proxy/soup-ssl-proxy.c (main): Check that ssh
-       channel is created before adding watches.
-
-2001-12-17  Alex Graveley  <alex@ximian.com>
-
-       * src/soup-ssl-proxy/soup-openssl.c (soup_openssl_seed): Use
-       RAND_status less often.
-
-2001-12-17  Alex Graveley  <alex@ximian.com>
-
-       * src/soup-ssl-proxy/soup-openssl.c (soup_openssl_init): Implement
-       a simple PRNG seed if needed.
-
-2001-12-15  Alex Graveley  <alex@ximian.com>
-
-       * src/libsoup/soup-server.c (message_new): Don't use temporary
-       context to create message, just pass a NULL one.
-
-2001-12-14  Alex Graveley  <alex@ximian.com>
-
-       * tests/server-test.c (push_callback): Add test for server push,
-       which creates a SoupServerMessage and sends the headers, body, and
-       ends the transfer at 4 second intervals.
-       (soup_server_init): Update for new server api.
-
-       * tests/cgi-test.c (soup_server_init): Update for new server api.
-
-       * src/libsoup/soup-transfer.c (soup_transfer_write_simple):
-       Impl. Just write the headers and data buffer passed.
-       (soup_transfer_write): Use callback to get header data, remove
-       header done callback.
-       (soup_transfer_write_pause): Pause the write by removing the
-       writable io watch.
-       (soup_transfer_write_unpause): Unpause by adding it back again.
-       (write_chunk_sep): Handle (rare) case where 0 length chunk is
-       first chunk.  Final chunks end in \r\n\r\n not just \r\n.
-
-       * src/libsoup/soup-server.c (get_header_cgi_cb): Create header for
-       delayed writes if soup_server_message_start() has been called,
-       otherwise pause write.
-       (get_header_cb): Ditto, use chunked encoding if client supports
-       it.
-       (get_chunk_cb): Free the current chunk, not the last one.  Pause
-       write if no new data.
-       (soup_server_message_start): Impl. Asyncronously send the headers
-       of the request.  Unpause write.
-       (soup_server_message_add_data): Unpause write.
-       (soup_server_message_finish): Unpause write.
-
-       * src/libsoup/soup-queue.c (start_request): Use
-       soup_transfer_write_simple.
-
-       * src/libsoup/soup-socket.c: Comment formatting.
-
-2001-12-13  Alex Graveley  <alex@ximian.com>
-
-       * src/libsoup/soup-queue.c (start_request): Use
-       soup_transfer_write_simple.
-
-2001-12-13  Alex Graveley  <alex@ximian.com>
-
-       * src/libsoup-apache/soup-apache.c (soup_apache_get_server):
-       Impl. Returns the SoupServer which handles this request's port and
-       protocol, creating and initializing the server if this is its
-       first use.
-       (soup_apache_handler): Check auth_type not auth.type.  Update for
-       new SoupServerContext members.
-
-2001-12-09  Alex Graveley  <alex@ximian.com>
-
-       * src/libsoup/soup-uri.c (normalize_path): Add path normalization
-       code from libxml.
-
-2001-12-06  Alex Graveley  <alex@ximian.com>
-
-       * src/libsoup/soup-socket.c (soup_socket_connect_tcp_cb): Free
-       state before callback.
-       (soup_socket_connect_inetaddr_cb): Don't shadow param.
-
-2001-12-06  Alex Graveley  <alex@ximian.com>
-
-       * src/libsoup/soup-method.[ch]: Create.
-
-       * src/libsoup/soup-dav-server.c: Rehash to be controlled by
-       caller through soup_dav_server_process, instead of registering
-       paths with the server internally.  This adds the restricition of
-       only being able to service dav move/copy requests to paths under
-       the caller's registered path.
-
-       * src/libsoup/soup-server.c (call_handler): Add message, request
-       path, and method id to SoupServerContext.
-
-       * src/libsoup/soup-message.h: Remove method defines.
-
-2001-12-05  Alex Graveley  <alex@ximian.com>
-
-       * src/libsoup/soup-server.c (soup_server_run): Allow recursive
-       calls and/or blocking on a running async server.
-
-2001-12-05  Alex Graveley  <alex@ximian.com>
-
-       * src/libsoup/soup-fault.c: Formatting nitpicks.
-
-       * src/libsoup/soup-server.c (free_handler): Call unregister handler.
-
-       * src/libsoup/soup-server.h: Add unregister callback to
-       SoupServerHandler so handlers can free temporary resources on
-       server shutdown.
-
-       * src/libsoup/soup-transfer.c (soup_transfer_write_cb): Call
-       headers_done_cb if wrote >= header_len.
-
-       * src/libsoup/soup-dav-server.c (soup_dav_server_register): Pass
-       dav_unregister_handler to soup_server_register, to cleanup state
-       on server free.
-
-       * src/libsoup/soup-env.c: Rehash.
-
-       * src/libsoup/soup-message.c (soup_message_new): Allow NULL
-       contexts.
-       (soup_message_copy): Impl. Copy request/response buffers.
-
-       * src/libsoup/soup-queue.c (soup_queue_message): Handle NULL
-       message contexts by issuing a cancelled callback.  Break out queue
-       initialization to soup_queue_initialize(). 
-
-2001-12-04  Dan Winship  <danw@ximian.com>
-
-       * src/libsoup/soup-message.c (soup_message_requeue): Don't try to
-       wait for the rest of the data if the read_tag is 0 (eg, if the
-       write attempt got an EPIPE). Fixes a crash if the server
-       idle-timeouts a keepalived connection.
-
-2001-12-02  Alex Graveley  <alex@ximian.com>
-
-       * src/libsoup/soup-private.h: Remove req_header from
-       SoupMessagePrivate.
-
-       * src/libsoup/soup-message.c (finalize_message): No more
-       req_header.
-
-       * src/libsoup/soup-queue.c (start_request): Ditto.
-
-       * src/libsoup/soup-server.c (read_done_cgi_cb): Ditto.
-       (read_done_cb): Ditto.
-
-2001-12-01  Alex Graveley  <alex@ximian.com>
-
-       * src/libsoup/soup-server-auth.h: Pull the SoupServerAuth from
-       soup-server.h to here.
-
-       * tests/cgi-test.c: 
-       * tests/mod-server-test.c: 
-       * tests/server-test.c: Update for new server api. Add a handler
-       that sets the errorphrase, add some response headers, and prints
-       the request body, uri, and headers in the response.
-
-       * src/soup-httpd/soup-httpd.c: Update for new server api, remove
-       module reloading, which trivializes the server code.
-
-       * src/libsoup-apache/soup-apache.c: Update for new server api.
-
-       * src/libsoup/soup-uri.c (soup_uri_copy): Copy element by element,
-       don't stringify/unstringify.
-
-       * src/libsoup/soup-uri.h: Remove query_elems from SoupUri.
-
-       * src/libsoup/soup-transfer.c (soup_transfer_write): Take an
-       encoding argument to allow chunked writes, and a write_chunk_cb to
-       allow new data to be written. Use a secondary buffer to make
-       writes (and especially chunked writes) larger, and also simplify
-       the code.
-       (write_chunk_sep): Impl.
-       (write_chunk): Impl.
-
-       * src/libsoup/soup-socket.c (soup_socket_connect_inetaddr_cb):
-       Free state before issuing failure callback.  Add FIXME, as this
-       shouldn't be needed but avoids a segfault.
-
-       * src/libsoup/soup-socket-unix.c: Formatting.
-
-       * src/libsoup/soup-server.c: Reimplement to support server push
-       through SoupServerMessage, CGI support, and persistent
-       connections. Modules are now passed a SoupServer during init,
-       instead of having well-known global server objects -- these have
-       been removed.
-
-       * src/libsoup/soup-queue.c (start_request): Update for new
-       transfer_write interface, passing content length as the encoding
-       and a NULL write_chunk_cb.
-
-       * src/libsoup/soup-private.h: Add server, server_sock, and
-       server_msg to _SoupMessagePrivate.  Gut _SoupServer.
-
-       * src/libsoup/soup-message.c (soup_message_requeue): Cleanup
-       boolean eval.
-
-       * src/libsoup/soup-headers.c (soup_headers_parse_response): Wrap
-       at 80.
-
-       * src/libsoup/soup-dav-server.[ch]: Update for new server handler
-       interface.
-
-       * configure.in: Check for sys/ioctl.h and sys/filio.h
-
-2001-11-30  Dan Winship  <danw@ximian.com>
-
-       * src/libsoup/soup-headers.c (soup_headers_parse_status_line):
-       Split this functionality out of soup_headers_parse_response.
-
-       * src/libsoup/Makefile.am (libsoupinclude_HEADERS): Add
-       soup-message.h to the public headers.
-
-2001-11-21  Alex Graveley  <alex@ximian.com>
-
-       * src/libsoup/soup-socket.c (soup_address_set_sockaddr): Remove.
-       (soup_address_get_sockaddr): Impl. Return the address's internal
-       sockaddr, and its length.
-
-2001-11-20  Dan Winship  <danw@ximian.com>
-
-       * src/libsoup/soup-ntlm.c (soup_ntlm_request): Simplify. Don't
-       specify a host and domain, and tweak the flags to a new magic
-       value that makes the server return some info such as a default
-       domain to pick.
-       (soup_ntlm_response): Allow "host" and "domain" to be NULL. If
-       domain is NULL, use the default from the server response.
-
-       * src/libsoup/soup-auth.c (ntlm_init): soup_ntlm_request no longer
-       takes host/domain. soup_ntlm_response can take NULL host/domain.
-
-2001-11-19  Alex Graveley  <alex@ximian.com>
-
-       * src/libsoup/soup-private.h: Add auth member to SoupConnection.
-
-       * src/libsoup/soup-queue.h: Export soup_queue_connect_cb.
-
-       * src/libsoup/soup-queue.c (soup_encode_http_auth): Get auth token
-       from connection's auth.
-
-       * src/libsoup/soup-message.c (soup_message_run_handlers): Break if
-       status after running a handler is also SOUP_STATUS_CONNECTING.
-       (soup_message_requeue): If the connection uses NTLM, reset
-       error/finished callbacks.
-       (requeue_read_finished): Impl. Requeue the message using the
-       current connection on success.
-       (requeue_read_error): Impl. Queue the message again and get a new
-       connection.
-       (requeue_connect_cb): Impl. Use the old connection's auth data
-       before passing off to soup_queue_connect_cb.
-       (soup_message_cleanup): Only reset callbacks if the reader and
-       connection exist.
-       (authorize_handler): Set/get the connection's auth data if it
-       exists and the new auth created uses NTLM.
-
-       * src/libsoup/soup-transfer.c (soup_transfer_read_cb): Dump read
-       data to stderr if DUMP is defined.
-       (soup_transfer_write_cb): ditto for writes.
-
-       * src/libsoup/soup-context.c (soup_context_connect_cb): Don't ref
-       context here, but rather
-       (soup_context_get_connection): Here, in case the context goes away
-       while connecting.
-
-2001-11-14  Alex Graveley  <alex@ximian.com>
-
-       * src/libsoup/soup-socket-win.c (soup_address_get_name_cb): Don't
-       leak state on failure, pass address's name, not a copy.
-       (soup_address_new_cb): Don't access things after we realloc to a
-       smaller size.
-
-2001-11-13  Alex Graveley  <alex@ximian.com>
-
-       * src/libsoup/soup-queue.c (soup_queue_error_cb): Use
-       soup_message_requeue.
-       (soup_queue_read_headers_cb): Don't end the transfer if a handler
-       requeues the message.  Close the connection on malformed headers.
-       (soup_queue_read_chunk_cb): Ditto for the former.
-
-       * src/libsoup/soup-message.c (soup_message_requeue): Impl. Requeue
-       the message using existing callback/user_data.
-       (authorize_handler): Use soup_message_requeue.
-       (redirect_handler): Ditto.
-
-       * src/libsoup/soup-transfer.c (soup_transfer_read_set_callbacks):
-       Impl. Allows changing of the reader's callbacks to ignore certain
-       events (like chunk data) and change the user_data.
-
-       * src/libsoup/soup-message.c (soup_message_cleanup): If still
-       reading response, reset the SoupReader's callbacks to only release
-       (on finish) or release and close (on error) the connection,
-       instead of terminating the read which could leave data in the
-       socket to to hork future messages which use this connection.  Also
-       NULL the message's references to the connection and SoupReader so
-       that they are not disposed of on message free.
-
-2001-11-12  Alex Graveley  <alex@ximian.com>
-
-       * src/libsoup/soup-queue.c (start_request): Impl.  Move request
-       sending code here from soup_queue_connect_cb.
-       (proxy_https_connect): Impl.  Send intermediate CONNECT request to
-       proxy for SSL connections.  If successful, convert connection to
-       SSL.
-       (soup_queue_connect_cb): Call proxy_https_connect if we are using
-       a proxy and the destination is SSL.  Call start_request.
-       (soup_idle_handle_new_requests): If request already has a
-       connection, just call start_request.
-       (soup_get_request_header): Special case URI is hostname:port for
-       CONNECT requests.
-       (soup_queue_read_headers_cb): Special case connection persistence
-       for CONNECT requests: if message is successful, assume valid
-       connection.  Special case body handling for CONNECT requests:
-       assume zero length body.
-
-2001-11-08  Alex Graveley  <alex@ximian.com>
-
-       * src/libsoup/soup-queue.c (soup_queue_read_headers_cb): 
-       (soup_queue_read_chunk_cb): 
-       (soup_queue_read_done_cb): Update to call renamed SoupHandlerEvents.
-
-       * src/libsoup/soup-message.[ch]: Remove
-       soup_message_get_request_header, soup_message_set_request_header,
-       soup_message_get_response_header,
-       soup_message_set_response_header,
-       soup_message_add_error_code_handler,
-       soup_message_add_error_class_handler,
-       soup_message_add_header_handler.
-       (redirect_handler): Update for new handler interface.
-       (authorize_handler): Ditto.
-       (timeout_handler): Impl.
-       (soup_message_remove_handler): Impl.
-       (soup_message_remove_handler_by_func): Impl.
-       (soup_message_remove_handler_by_func_and_data): Impl.
-       (soup_message_list_handlers): Impl.
-
-2001-11-08  Alex Graveley  <alex@ximian.com>
-
-       * configure.in: Version 0.6.0.
-       * src/libsoup/soup-private.h (VERSION): Ditto.
-
-2001-11-08  Alex Graveley  <alex@ximian.com>
-
-       * configure.in (debug_default): Set debug default to "minimum",
-       which turns off G_ENABLE_DEBUG (and the ptrace magic) by default.
-       To turn back on for a debugging environment, use --enable-debug.
-
-       * src/libsoup/soup-socket-unix.c (SOUP_PTRACE_DETACH): Wrap
-       SOUP_PTRACE defines in check for G_ENABLE_DEBUG.
-
-2001-11-08  Alex Graveley  <alex@ximian.com>
-
-       * src/libsoup/soup-socks.c (socks_data_free): Add cleanup function
-       to avoid leaving context/address references around.
-       (WSHORT): Use memcpy.
-       (soup_socks_read): Pass len as sizeof (buf).
-       (soup_socks_error): Add error handler just in case.
-       (soup_connect_socks_proxy): Unref the io channel.
-       (soup_lookup_dest_addr_cb): Ditto.
-
-2001-11-07  Dan Winship  <danw@ximian.com>
-
-       * src/libsoup/soup-auth.c (ntlm_init): Mark the auth completed
-       after sending the response string.
-       (ntlm_compare_func): A new NTLM auth doesn't invalidate an
-       already-completed one. (Makes it not loop forever on a wrong
-       password.)
-
-2001-11-02  Alex Graveley  <alex@ximian.com>
-
-       * src/libsoup/soup-private.h: Add death_tag to _SoupConnection.
-
-       * src/libsoup/soup-socks.c (soup_connect_socks_proxy): Unref proxy
-       context.
-       (soup_socks_write): Ditto.
-
-       * src/libsoup/soup-context.c (connection_free): Impl.
-       (soup_prune_least_used_connection): Use connection_free().
-       (soup_connection_release): Ditto.
-       (soup_prune_foreach): Simplify to not use custom data struct. Just
-       use a SoupConnection ** to hold state.
-       (connection_death): Impl.  Free the connection if its not
-       currently in use.
-       (soup_context_connect_cb): Install a death handler for valid
-       connections, so connection death can be caught and handled when no
-       SoupMessage exists to handle it.  Ref the context.
-       (soup_context_get_connection): For reused connections, ref the
-       connection's new context, unref the old one, and assign the
-       connection's context to the new one.
-       (soup_context_unref): Don't free connections, as there must be
-       none left for all the contexts to have been removed.
-       (soup_connection_get_context): Add a reference before returning
-       context.
-
-       * src/libsoup/soup-message.c (soup_message_set_context): Add
-       precondition checks.
-       (soup_message_get_context): Ditto.
-
-2001-11-02  Alex Graveley  <alex@ximian.com>
-
-       * src/soup-ssl-proxy/soup-ssl-proxy.c: Remove NSS-related code, as
-       this is now moved to libsoup.
-
-2001-11-02  Alex Graveley  <alex@ximian.com>
-
-       * src/libsoup/soup-private.h: Rename killme to cached in _SoupAddress.
-
-       * src/libsoup/soup-socket-unix.c (soup_address_get_name_cb): Use
-       g_strndup instead of g_new/strncpy.
-       (soup_address_new_cb): Set cache status to CACHE_OK on success.
-       (prune_zeroref_addresses_foreach): Use ia->cached.
-       (soup_address_unref): Free addresses which are NOT_CACHED.
-
-2001-11-02  Alex Graveley  <alex@ximian.com>
-       
-       * src/libsoup/soup-context.c (soup_try_existing_connections):
-       Remove old fixed FIXME.
-
-       * src/libsoup/soup-socket-unix.c
-       (prune_zeroref_addresses_timeout): Remove timeout if
-       active_address_hash is null.
-       (soup_address_unref): Only install timeout handler if the address
-       has a name, otherwise just free.
-
-2001-11-01  Alex Graveley  <alex@ximian.com>
-
-       * src/libsoup/soup-transfer.c (issue_final_callback): Null
-       terminate recv_buf before copying the data pointer.
-
-2001-10-31  Alex Graveley  <alex@ximian.com>
-
-       * src/libsoup/soup-context.c (soup_context_connect_cb): Drop
-       connection count of connect failed.
-       (soup_context_get_connection): Increment connection count before
-       calling soup_socket_connect() to avoid connection limit being
-       passed by many messages queued at the same time.
-
-       * src/libsoup/soup-server.c (read_done_cb): Assign request's data
-       buffer to message request buffer, not response.  Caught by Tim
-       Moloney.
-
-       * src/libsoup/soup-transfer.c (soup_transfer_read_cb): Zero
-       terminate alloca'd header string passed to headers_done_cb.
-
-2001-10-31  Dan Winship  <danw@ximian.com>
-
-       * configure.in: Fix the popt check so you can pass CPPFLAGS and
-       LDFLAGS in in the environment.
-
-2001-10-30  Alex Graveley  <alex@ximian.com>
-
-       * src/libsoup/soup-auth.c (soup_auth_set_context): Remove the
-       existing SoupAuth from the from the server's valid_auths hash.
-       (soup_auth_new_from_header_list): Fix bug where auth header
-       evaluation stopped after finding the first matching scheme.
-
-2001-10-30  Alex Graveley  <alex@ximian.com>
-
-       * src/libsoup/soup-socket-unix.c (soup_address_new): Consider
-       existing addresses with a zero refcount valid to return (with an
-       added refcount).
-       (prune_zeroref_addresses_foreach): Impl.
-       (prune_zeroref_addresses_timeout): Impl.
-       (soup_address_unref): Don't free zero ref addresses, instead make
-       sure zeroref timeout handler is installed and install if not. Also
-       move to here from soup-socket.c.
-
-       * src/libsoup/soup-private.h: Add killme flag to soup_address.
-
-       * src/libsoup/soup-socket-win.c (soup_address_unref): Move here
-       from soup-socket.c.
-
-2001-10-29  Alex Graveley  <alex@ximian.com>
-
-       * src/libsoup/soup-message.c (authorize_handler): Call
-       soup_auth_fn if we don't have auth data in the URI, then call
-       soup_auth_initialize if the callback set authenticate data on the
-       passed uri.
-
-       * src/libsoup/soup-auth.h: Make type be SoupAuthType.
-
-       * src/libsoup/soup-auth.c (soup_auth_initialize): Impl. To be
-       called after SoupAuth creation to apply auth data to the
-       SoupAuth. This allows us to parse the Authenticate headers to
-       figure out which auth scheme and realm is being used, and pass
-       this to the auth callback.
-
-       * src/libsoup/soup-misc.c (soup_set_authorize_callback): Impl.
-
-       * src/libsoup/soup-misc.h: Add SoupAuthType enum here.
-
-       * src/libsoup/soup-server.h: Use SoupAuthType. Remove
-       SoupServerAuthType.
-
-2001-10-27  Alex Graveley  <alex@ximian.com>
-
-       * src/libsoup/soup-dav.c: Include soup-error.h
-
-       * src/libsoup/soup-queue.c (soup_debug_print_headers): Use
-       soup_message_foreach_header.
-
-       * src/libsoup/soup-message.c (soup_message_new): Default to GET if
-       method not supplied.
-       (soup_message_add_header): Remove code to delete header if no
-       value is supplied.
-       (soup_message_foreach_remove_header): Impl.
-       (soup_message_remove_header): Impl.
-
-2001-10-26  Alex Graveley  <alex@ximian.com>
-
-        * src/libsoup/soup-socket-unix.c (soup_address_new): Use WUNTRACED,
-        which should fix possible hang situation.
-
-        * src/libsoup/soup-transfer.c (issue_chunk_callback): Address bug
-        where data buffer passed to chunk callback could be invalid due to
-        appending a null. Just don't addend NULL for chunk callbacks.
-
-2001-10-26  Alex Graveley  <alex@ximian.com>
-
-       * src/libsoup/soup-message.c (redirect_handler): Use
-       soup_uri_set_auth().
-
-       * src/libsoup/soup-uri.c (soup_uri_free): Don't use g_assert.
-       (soup_uri_set_auth): Impl.
-
-       * src/libsoup/soup-server.c (read_headers_cb): Use
-       soup_message_set_context().
-
-       * src/libsoup/soup-message.c (soup_message_set_context): Impl.
-       (soup_message_get_context): Impl.
-       (redirect_handler): Use soup_message_set_context().
-
-2001-10-25  Alex Graveley  <alex@ximian.com>
-
-       * src/libsoup/soup-message.c (redirect_handler): Handle redirects
-       when source uri has auth data by copying auth to new url.
-
-2001-10-25  Alex Graveley  <alex@ximian.com>
-
-       * src/libsoup/soup-queue.c (soup_queue_read_headers_cb): Fixe bug
-       where informational responses were treated as an unknown encoding,
-       causing the actual response to be considered part of the
-       informational response body.
-
-2001-10-25  Dan Winship  <danw@ximian.com>
-
-       * configure.in: Fix up the networking library checks to work on
-       Solaris. Check for inet_pton. (Solaris doesn't have inet_aton.)
-
-       * src/libsoup/soup-socket-unix.c (soup_address_new): Use inet_pton
-       instead of inet_aton if available.
-
-2001-10-22  Joe Shaw  <joe@ximian.com>
-
-       * src/soup-ssl-proxy/soup-ssl-proxy.c (soup_ssl_proxy_readwrite):
-       Make sure we handle G_IO_IN before we handle G_IO_HUP so we don't
-       lose data on the pipe, as you can receive both at the same time.
-       Ian Peters actually found this, but I am his commit monkey.
-
-2001-10-22  JP Rosevear  <jpr@ximian.com>
-
-       * src/libsoup/soup-dav.c (soup_dav_response_new): use new error
-       api
-
-       * src/libsoup/soup-queue.c (soup_parse_headers): ditto
-
-       * src/libsoup/soup-message.c (soup_message_set_error_full): ditto
-       (soup_message_set_error): ditto
-
-2001-10-21  Alex Graveley  <alex@ximian.com>
-
-       * src/libsoup/soup-message.h: Reorganize.
-
-       * src/libsoup/Makefile.am (libsoupinclude_HEADERS): Add soup-error.h.
-       (libsoup_la_SOURCES): Add soup-error.c.
-
-       * src/libsoup/soup-error.[ch]: Move SoupKnownErrorCode and
-       SoupErrorClass defines to here.  Move soup_get_error_phrase and
-       soup_get_error_class here, and rename to soup_error_get_phrase and
-       soup_error_get_class.
-
-2001-10-19  Alex Graveley  <alex@ximian.com>
-
-       This is the first attempt at authentication inheritence, it
-       still needs some work.  Auth headers are always sent no matter
-       what, auth realms are not respected, auth data in the uri is
-       ignored unless an existing auth attempt fails, and auth data
-       should be registered at context creation time.
-
-       * src/libsoup/soup-auth.c (digest_parse_func): Compute a1 hash
-       "user:realm:passwd:nonce:cnonce" here, to cut down on per-request
-       overhead. Accept a SoupUri from which to get auth info.
-       (basic_parse_func): Base64 encode user:passwd here for same
-       reason. Accept a SoupUri for getting auth info.
-       (compute_response): Get uri path from message instead of SoupAuth.
-       (digest_auth_func): Ditto.
-       (soup_auth_lookup): Impl. Given a context, lookup the SoupAuth of
-       the nearest parent directory.
-       (soup_auth_set_context): Impl. Register a SoupAuth to be used for
-       requests to the context's path and subdirectories.
-
-       * src/libsoup/soup-auth.h: Move define of SoupAuth here, in
-       preparation for making public eventually.
-
-       * src/libsoup/soup-queue.c (soup_encode_http_auth): Use
-       soup_auth_lookup ().
-       (soup_get_request_header): Don't check the request's uri for auth
-       info, as a parent context may have a valid registered SoupAuth.
-
-       * src/libsoup/soup-message.c (authorize_handler): Use
-       soup_auth_lookup() to find last (failing) SoupAuth. Use
-       soup_auth_set_context() to register the created SoupAuth for this
-       context.
-
-       * src/libsoup/soup-message.h: Explicitly define values for soup
-       transport-level errorcodes, just because.
-
-       * src/libsoup/soup-context.c (soup_context_unref): When freeing
-       the SoupHost parent of this context, free all associated
-       SoupAuths.
-
-       * src/libsoup/soup-private.h: Remove auth pointer from context,
-       add hashtable of valid auths to SoupAuth.
-
-2001-10-18  Alex Graveley  <alex@ximian.com>
-
-        * src/libsoup/soup-queue.c (soup_queue_read_headers_cb): Set
-        encoding out param appropriately.
-        * src/libsoup/soup-server.c (soup_httpd_read_headers_cb): Ditto.
-
-        * src/libsoup/soup-transfer.h: Add SoupTransferEncoding enum.
-
-        * src/libsoup/soup-transfer.c (soup_transfer_read_error_cb):
-        Handle unknown encoding by issuing the read_done callback when the
-        connection is closed.
-        (issue_chunk_callback): Pass in a cancelled arg to simplify code.
-        (read_unknown): Impl. Same as read_content_length () except never
-        return TRUE.
-        (soup_transfer_read_cb): Make headers_done_cb take an encoding out
-        parameter to avoid magic values in content_length. Switch on
-        encoding to see if read completed. Use issue_final_callback ().
-
-2001-10-18  JP Rosevear  <jpr@ximian.com>
-
-       * src/libsoup/soup-transfer.c (remove_block_at_index): the array
-       length assertion should be >= rather than less than.
-
-2001-10-17  Alex Graveley  <alex@ximian.com>
-
-       * src/libsoup/soup-transfer.c (read_content_length): Don't call
-       chunk callback if there is no new data.
-
-2001-10-17  Alex Graveley  <alex@ximian.com>
-
-       * src/libsoup/soup-transfer.c (remove_block_at_index): Add some
-       bounds checking.
-
-       * src/libsoup/soup-queue.c (soup_queue_connect_cb): Handle
-       iochannel creation failure which can happen when using SSL.
-
-2001-10-16  Alex Graveley  <alex@ximian.com>
-
-       * src/libsoup/soup-transfer.c (decode_hex): Impl.
-       (remove_block_at_index): Impl.
-       (decode_chunk): Simplify using utility functions.
-       (soup_transfer_read_cb): Use remove_block_at_index.
-       (read_chunk): Ditto.
-
-2001-10-16  Joe Shaw  <joe@ximian.com>
-
-       * src/libsoup/soup-auth.c (compute_response): A NULL passwd is
-       perfectly valid, so we want to avoid crashing if that is the case.
-
-2001-10-16  Alex Graveley  <alex@ximian.com>
-
-       * src/libsoup/soup-transfer.c (decode_chunk): Fix nasty chunked
-       encoding bug when the message is set to truncate chunks. Code
-       reorg to be a lot cleaner.
-
-       * src/libsoup/soup-ntlm.c: Move alloca #define-foo to:
-       * src/libsoup/soup-private.h: Here.
-
-       * src/libsoup/soup-uri.c (soup_uri_to_string): Handle the case
-       where path does not begin with a '/'.
-
-       * src/libsoup/soup-server.c (soup_server_free): Use foreach_remove.
-
-2001-10-09  Alex Graveley  <alex@ximian.com>
-
-       * src/libsoup/soup-socks.c (soup_connect_socks_proxy): Assign
-       source connection correctly.
-
-2001-10-09  Alex Graveley  <alex@ximian.com>
-
-       * src/libsoup/soup-dav-server.c (parent_exists): don't call
-       __uri_exists as __is_collection should check this.
-
-2001-10-06  Alex Graveley  <alex@ximian.com>
-
-       * configure.in (enable_nss): Explicitly add libplc4 and libplds4
-       which are dependencies of libnspr4.
-
-       * src/libsoup/Makefile.am (libsoup_la_LIBADD): Link with NSS libs.
-       (libsoup_la_SOURCES): Add soup-nss.[ch].
-
-       * src/libsoup/soup-nss.c: Added. GIOChannel wrapper for Mozills NSS.
-
-       * src/libsoup/soup-ssl.c: Use NSS if available to avoid out of
-       process SSL proxy.
-
-       * src/soup-ssl-proxy/Makefile.am (soup_ssl_proxy_SOURCES): Remove
-       soup-nss.[ch].
-       (soup_ssl_proxy_LDADD): Do not link NSS libs, as these are now
-       linked directly into libsoup.
-
-2001-10-05  Alex Graveley  <alex@ximian.com>
-
-       * src/libsoup/soup-message.c (soup_message_clear_headers):
-       Impl. Use instead of custom header free funcs throughout.
-       (soup_message_foreach_header): Impl.
-       (global_handlers): Handle redirects before authenticating.
-       (redirect_handler): Use soup_message_get_header.
-       (run_handler): Ditto.
-
-2001-10-04  Alex Graveley  <alex@ximian.com>
-
-       * src/libsoup/soup-socket-unix.c (soup_address_new_cb): Ugg. Don't
-       call waitpid with NOHANG. Avoid zombies. Gain friends.
-
-2001-10-04  Alex Graveley  <alex@ximian.com>
-
-       * src/libsoup/soup-message.c (authorize_handler): Call
-       soup_message_get_header_list.
-
-       * src/libsoup/soup-auth.c (soup_auth_new_from_header_list): Set
-       crypto strength for authentication types, and try to choose the
-       strongest when authenticating.
-
-       * src/libsoup/soup-queue.c (soup_check_used_headers): Kill warnings.
-
-       * tests/simple-test.c (list_headers): Handle multiple values for
-       header.
-
-       * tests/handler-test.c (list_headers): Ditto.
-
-2001-10-04  Alex Graveley  <alex@ximian.com>
-
-       * src/libsoup/soup-server.c (read_headers_cb): Fix const warnings.
-
-2001-10-04  Alex Graveley  <alex@ximian.com>
-
-       * src/libsoup/soup-server.c (read_headers_cb): Don't create
-       response_headers. This is done in soup_message_new. Use
-       soup_message_get_header throughout.
-
-       * src/libsoup/soup-queue.c (soup_check_used_headers): Write list
-       of headers.
-       (soup_parse_headers): Don't create response_headers. This is done
-       in soup_message_new.
-       (soup_debug_print_a_header): Handle multiple header vals.
-       (soup_check_used_headers): Ditto.
-       (soup_queue_remove_header): Ditto.
-       (soup_queue_message): Don't destroy hashtable, just clear it.  
-       Use soup_message_get_header throughout.
-
-2001-10-04  Alex Graveley  <alex@ximian.com>
-
-       * src/libsoup/soup-message.c (soup_message_add_header): Handle
-       multiple values in header hash tables.
-       (free_header): Free the list of values.
-       (soup_message_new): Create request_headers and response_headers
-       here instead of on header insertion.
-       (soup_message_set_request_header): Deprecate.
-       (soup_message_get_request_header): Deprecate.
-       (soup_message_set_response_header): Deprecate.
-       (soup_message_get_response_header): Deprecate.
-
-       * src/libsoup/soup-dav-server.c: Update to use new header get/add
-       funcs.
-
-       * src/libsoup/soup-headers.c (soup_headers_parse): Store headers
-       as a GSList of values.
-
-2001-10-03  Dan Winship  <danw@ximian.com>
-
-       * src/libsoup/soup-uri.c (soup_uri_new): The @ in
-       http://foo/bar@baz is part of the path, not the username/hostname
-       split.
-
-2001-10-01  Alex Graveley  <alex@ximian.com>
-
-       * configure.in: Fix HAVE_OPENSSL and HAVE_NSS checks as these were
-       always being defined.
-
-2001-10-01  Alex Graveley  <alex@ximian.com>
-
-       * src/libsoup/soup-socket-unix.c (soup_address_new): Add defines
-       for SOUP_PTRACE_ATTACH and SOUP_PTRACE_DETACH to remove
-       architecture incompatibilities for ptrace() arguments.
-
-       * configure.in: Add libdl to OpenSSL LDFLAGS.  Fix NSS header
-       paths.  Define HAVE_OPENSSL and HAVE_NSS if the libraries are
-       found successfully.
-
-       * src/libsoup/soup-socket.h: Remove soup_gethostbyname and
-       soup_gethostbyaddr, and move to:
-       * src/libsoup/soup-private.h: here.
-
-2001-09-28  Alex Graveley  <alex@ximian.com>\r
-\r
-       * src/libsoup/soup-ntlm.c: Remove redundant alloca define.\r
-\r
-       * src/libsoup/soup-socket.c (soup_socket_server_new): Use \r
-       SOUP_SOCKET_CLOSE.\r
-\r
-       * src/libsoup/soup-socket.h: Include winsock.h if windows.\r
-\r
-2001-09-28  Alex Graveley  <alex@ximian.com>
-
-       * src/libsoup/soup-socket-win.c: Fix copyright notice.
-       * src/libsoup/soup-socket-unix.c: Ditto.
-       * src/libsoup/soup-socket.c: Ditto.
-
-2001-09-28  Alex Graveley  <alex@ximian.com>
-
-       * build/libsoup.dsp (SOURCE): Add soup-socket-win.c.
-
-       * tests/simple-test.c (main): Take HTTP method and body parameters
-       to use in the request.
-
-       * src/libsoup/soup-socket.h: Make soup_gethostbyname and
-       soup_gethostbyaddr public.
-
-       * src/libsoup/soup-socket-unix.c: Added, split of networking code
-       into unix-specific sections.
-
-       * src/libsoup/soup-socket-win.c: Added, Windows networking code.
-
-       * src/libsoup/soup-socket.c: Holds common socket functions.
-
-2001-09-27  Alex Graveley  <alex@ximian.com>
-
-       * src/libsoup/soup-socket.c: Remove Glib workarounds for Windows 
-       socket io.
-
-2001-09-27  Alex Graveley  <alex@ximian.com>
-
-       * src/libsoup/soup-socket.c (soup_address_new): #ifdef protect the
-       ptrace attach/detach code until I have a chance to look at why it
-       fails on some platforms.
-
-2001-09-27  Alex Graveley  <alex@ximian.com>
-
-       * build/libsoup.def: Update for new exports.
-
-2001-09-27  Alex Graveley  <alex@ximian.com>
-
-       * src/libsoup/soup-dav-server.h: Fix constness for get_dav_prop
-       and get_custom_prop.
-
-2001-09-19  Dan Winship  <danw@ximian.com>
-
-       * src/libsoup/soup-message.c (soup_message_send): Fix this to not
-       return immediately after parsing the first line of the response.
-       (Needed an update for the 09-07 api changes.)
-
-2001-09-17  Vladimir Vukicevic  <vladimir@ximian.com>
-
-       * src/libsoup/soup-socket.c, src/libsoup/soup-socket.h:
-       Added soup_address_copy().  Changed soup_address_new to check
-       whether the ports are the same before using a cached
-       address.
-
-2001-09-14  Alex Graveley  <alex@ximian.com>
-
-       * src/libsoup/soup-serializer.c
-       (soup_serializer_get_namespace_prefix): Return const string.
-
-       * Makefile.am (EXTRA_DIST): Install soup.m4.
-
-       * src/libwsdl/wsdl-soap-marshal.c:
-       * src/libwsdl/wsdl-typecodes.c:
-       * src/soup-wsdl/wsdl-parse.c: Formatting.
-
-2001-09-13  Alex Graveley  <alex@ximian.com>
-
-       * src/libsoup/soup-serializer.c
-       (soup_serializer_get_namespace_prefix): Impl.
-
-2001-09-12  Alex Graveley  <alex@ximian.com>
-
-       * tests/filesys-server.c (main): Pass protocol to soup_server_new.
-       * tests/server-test.c (main): Ditto.
-
-       * src/soup-wsdl/Makefile.am (soup_wsdl_LDADD): Remove libwsdl.so
-       link.
-
-       * src/libwsdl/Makefile.am (libwsdl_build_a_SOURCES): Include
-       libwsdl.so sources in libwsdl-build.a so libtool 1.3.5 doesn't
-       ill.  Remove libwsdl_build_a_LIBADD.
-
-       * src/libsoup/soup-server.c (soup_server_new): Take a SoupProtocol
-       argument.
-
-       * src/libsoup/soup-dav-server.c (move_copy): Serialize multi-status.
-       (i_copy): Fix bug where directory contents were sometimes created
-       before parent. Add multi-status error reporting.
-
-       * src/libsoup/soup-dav.c (soup_dav_response_new): Remove
-       response_phrase param.
-
-2001-09-11  Alex Graveley  <alex@ximian.com>
-
-       * src/libsoup/soup-dav-server.c (dav_proppatch): Rewrite to
-       correctly handle rollback and propstat result.  Fill in missing
-       response errors throughout.
-
-2001-09-11  Alex Graveley  <alex@ximian.com>
-
-       * tests/filesys-server.c: Initial commit of DAV test server which
-       allows manipulation of the filesystem through Web-DAV.
-
-       * tests/Makefile.am (noinst_PROGRAMS): Add filesys-server.
-
-2001-09-10  Alex Graveley  <alex@ximian.com>
-
-       * tests/mod-server-test.sh: Rename from mod-server-test to be
-       obvious that its a script which simply executes soup-httpd.
-
-2001-09-10  Alex Graveley  <alex@ximian.com>
-
-       * build/soup_httpd.dsp (SOURCE): Fix typo.
-
-       * build/libsoup.dsp: Add src/libsoup/soup-ntlm.[ch]
-       (SOURCE): Remove soup-apache.c
-
-2001-09-10  Alex Graveley  <alex@ximian.com>
-
-       * src/libsoup/soup-dav-server.c (dav_mkcol): Report errors.  Check
-       that parent path exists.
-       (dav_put): Ditto.
-       (dav_options): set 404 if path not found.
-       (dav_options): Handle server-level OPTIONS requests.
-       (parent_exists): impl.
-
-2001-09-10  Alex Graveley  <alex@ximian.com>
-
-       * src/libsoup/soup-dav-server.h: Replace opt_search with
-       opt_other.  Remove SOUP_DAV_SEARCH.
-
-       * src/libsoup/soup-dav-server.c: Replace dav_search with
-       dav_other.
-
-2001-09-10  Alex Graveley  <alex@ximian.com>
-
-       * tests/cgi-test.c (main): Pass authtypes param to
-       soup_server_register.
-       * tests/server-test.c (main): Ditto.
-       * tests/mod-server-test.c (soup_server_init): Ditto.
-
-       * tests/stockquote2.wsdl: Format fixes.
-
-2001-09-07  Alex Graveley  <alex@ximian.com>
-
-       * tests/stress-test.c: Rewritten for the new apis, and to be more
-       clean, and to have many settings for varying simultaneous
-       messages, message counts, iterations, posting of data, etc.
-
-       * tests/simple-test.c: Rewritten for the new apis, and to be more
-       clean.
-
-       * tests/server-test.c (main): Added. Simple test for standalone
-       dynamic servers.
-
-       * tests/mod-server-test.c (callback): Added. Simple test for
-       soup-httpd/apache server modules.
-
-       * tests/handler-test.c: Added. Stress test for SoupMessage
-       handlers. 
-
-       * tests/cgi-test.c: Added. Simple test for CGI serving.
-
-       * src/soup-httpd/soup-httpd.c: Use libsoup's SoupServer code for
-       all request processing. soup-httpd becomes a wrapper for module
-       loading and logging.
-
-       * src/libwsdl/Makefile.am (INCLUDES): Remove WSDL_CFLAGS.
-
-       * src/libsoup/soup-socket.c (soup_socket_server_accept): Set
-       O_NONBLOCK on the returned SoupSocket.
-       (soup_socket_server_try_accept): Ditto.
-
-       * src/libsoup/soup-server.c: Reimplement for independent
-       SoupServer support.  Remove separate authorization handler
-       concept. Process based on request paths. Import code from
-       soup-httpd to allow standalone dynamic servers, and cgi support.
-
-       * src/libsoup/soup-queue.c (soup_check_used_headers): Remove
-       special handling of SOAPAction.
-       (soup_queue_connect_cb): Start listening for reads immediately so
-       that we cna process HTTP 1xx intermediate responses.
-       (soup_queue_message): Rename from soup_message_queue.
-       soup_message_queue is now in soup-message.c and simply calls this.
-
-       * src/libsoup/soup-private.h (RESPONSE_BLOCK_SIZE): Rename
-       existing SoupServer to SoupHost.  Create new SoupServer struct.
-       Add server and server_sock elements to SoupMessagePrivate.  Move
-       SoupServerHandler definition to soup-server.h.  Move define for
-       soup_queue_shutdown to new soup-queue.h.
-
-       * src/libsoup/soup-ntlm.c: Add mojo for getting a portable alloca.
-
-       * src/libsoup/soup-message.h: Remove SoupErrorCode. Add
-       SoupKnownErrorCode and SoupErrorClass enums. Add
-       SOUP_ERROR_CANT_CONNECT_PROXY and
-       SOUP_ERROR_CANT_AUTHENTICATE_PROXY for errors related directly to
-       proxy communications.
-
-       * src/libsoup/soup-message.c (soup_message_new): Take the HTTP
-       method name as the second argument.  Remove per-message handlers
-       for authentication and redirection.
-       (soup_message_issue_callback): Uses finalize_message to avoid
-       double cleanup.  Remove error argument, as they should be set
-       using soup_message_set_error.
-       (soup_message_run_handlers): Run per-message handlers followed by
-       global handlers, if a handler requeues a message we stop
-       processing.  If the invoke_type is POST_BODY, we issue the final
-       callback.
-       (soup_message_remove_handler): Make public.
-       (soup_message_set_error): Impl
-       (soup_message_set_error_full): Impl
-       (soup_message_set_handler_error): Impl
-       (soup_get_error_phrase): Impl
-       (soup_get_error_class): Impl
-
-       * src/libsoup/soup-dav-server.c: Add a reference to the SoupServer
-       we are registered with. Use soup_message_set_error throughout.
-       (i_copy): Fix assignment causing this loop to never run.
-       (soup_dav_server_register): Add SoupServer and required authtypes
-       parameters.
-
-       * src/libsoup/soup-context.c: Replace references to SoupServer
-       with SoupHost, so we don't clash with the SoupServer from
-       soup-server.h.  Rename soup_servers to soup_hosts.
-
-       * src/libsoup/Makefile.am (libsoup_la_SOURCES): Add soup-queue.h.
-
-       * configure.in (SOUP_CURRENT): Add some helpful comments and bump
-       to '3'.  Bump version to 0.5.99 (0.6 development).  Use
-       AC_FUNC_ALLOCA instead of just checking for alloca.h.  Remove
-       WSDL_CFLAGS.
-
-2001-08-30  Alex Graveley  <alex@ximian.com>
-
-       * src/soup-wsdl/Makefile.am (soup_wsdl_LDADD): Link with
-       libwsdl.so and libwsdl-build.a.
-
-       * src/libwsdl/Makefile.am (libwsdlinclude_HEADERS): Dont install
-       wsdl-typecodes-c.h. Make libwsdl-build a static lib.
-       (libwsdl_build_a_SOURCES): Remove everthing but wsdl-typecodes-c.[ch].
-       (libwsdl_build_a_LIBADD): Depend on libwsdl.
-
-2001-08-29  Alex Graveley  <alex@ximian.com>
-
-       * build/soup_ssl_proxy.dsp: 
-       * build/soup_httpd.dsp: 
-       * build/libsoupwsdl.dsp: 
-       * build/libsoupapache.dsp: 
-       * build/libsoup.dsp: Update for new layout.
-
-2001-08-29  Alex Graveley  <alex@ximian.com>
-
-       * src/*/*.h: Fix headers for new layout.
-       * tests/*.c: Ditto.
-
-       * tests/Makefile.am (LDFLAGS): Use libtool to link with built
-       libsoup and libwsdl.
-       (libstockquote2_la_LIBADD): Ditto for libsoup-apache.
-
-       * tests/stockquote2.wsdl: Indent prettily.
-
-       * src/Makefile.am (SUBDIRS): Update for new source layout.
-
-       * configure.in (SOUP_INCLUDEDIR): Use @includedir@/soup.
-       (SOUP_WSDL_LIBS): include $SOUP_LIBS.
-       (CFLAGS): Add Makefiles for new layout.
-
-       * soup-config.in: Use @includedir@/soup.
-
-       * soup.pc.in (Cflags): Use @includedir@/soup.
-
-2001-08-28  Alex Graveley  <alex@ximian.com>
-
-       * src/soup-core/soup-socket.c (soup_address_new): Perform deep
-       unix magic in order to identify if we are running in a
-       debugger. This is needed because gdb causes segfaults in child
-       processes that load shlibs due to breakpoints being left over in
-       the new unwatched process. Now, gethostbyname() loads shared libs
-       to do name resolution on many unixes, which would cause soup to be
-       hard to use and otherwise suck when run inside a debugger. So now
-       everything works perfectly both inside and outside of gdb.
-       (soup_address_new_cb): Resolve the hostname syncronously if we are
-       inside a debugger.
-
-2001-08-28  Alex Graveley  <alex@ximian.com>
-
-       * src/soup-core/soup-context.c (soup_try_existing_connections):
-       Remove mega FIXME.
-
-       * src/soup-core/soup-queue.c (soup_queue_read_headers_cb): If the
-       response server is HTTP 1.0, default to non-persistent connections.
-
-       * src/soup-core/soup-httpd.c (soup_httpd_read_headers_cb): Store
-       http version for incoming message.
-
-       * src/soup-core/soup-headers.c (soup_headers_parse_response):
-       Support returning the http version.
-       (soup_headers_parse_request): Ditto.
-
-2001-08-28  Alex Graveley  <alex@ximian.com>
-
-       * src/soup-core/soup-transfer.c (soup_transfer_read_chunk):
-       Rewrite HEX decoding to hopefully be easier to understand and maintain.
-
-       * src/soup-core/soup-message.c (redirect_handler): Don't unref the
-       old context until after we requeue the message using the new
-       context, as we may still have a connection from the old one.
-
-2001-08-27  Alex Graveley  <alex@ximian.com>
-
-       * src/soup-core/soup-auth.c (soup_auth_new_digest): Set the
-       compare func on the returned object.
-
-2001-08-27  Joe Shaw  <joe@ximian.com>
-
-       * src/soup-core/soup-context.c (soup_try_existing_connections):
-       Just return NULL from this function for now. There are some bugs
-       in it. Added a big, triple FIXME.
-
-2001-08-26  Alex Graveley  <alex@ximian.com>
-
-       * src/soup-wsdl/*: Format fixes.
-       * src/soup-wsdl-runtime/*: Format fixes.
-
-2001-08-26  Alex Graveley  <alex@ximian.com>
-
-       * src/soup-core/soup-misc.c (soup_config_ssl_ca_file): impl.
-       (soup_config_ssl_ca_directory): impl.
-       (soup_config_ssl_certificate): impl.
-       Add config file support for client certificates.
-
-2001-08-26  Alex Graveley  <alex@ximian.com>
-
-       * src/soup-core/soup-misc.c (soup_set_ssl_ca_file): impl.
-       (soup_set_ssl_ca_dir): impl.
-       (soup_set_ssl_cert_files): impl.
-
-       * src/soup-core/soup-openssl.c (soup_openssl_init): Load cert
-       authority files found in HTTPS_CA_DIR and HTTPS_CA_FILE.
-       (soup_openssl_get_iochannel): Load certificate found in
-       HTTPS_CERT_FILE and private key from file in
-       HTTPS_KEY_FILE. Client certificates thanks to Scott Hutton
-       (shutton@pobox.com).
-
-2001-08-24  Alex Graveley  <alex@ximian.com>
-
-       * src/soup-core/soup-queue.c (soup_queue_connect_cb): Always
-       regenerate req->priv->req_header.
-
-       * src/soup-core/soup-ntlm.c (soup_ntlm_lanmanager_hash): pass 15
-       byte buffer to work around array bounds read by setup_schedule.
-
-       * src/soup-core/soup-message.c (authorize_handler): No need to
-       free msg->priv->req_header as it is generated on each request now.
-       (soup_message_set_request_header): Ditto.
-
-       * src/soup-core/soup-auth.c (ntlm_auth): Only return
-       auth->response one time. Subsequent calls return NULL.
-
-       * src/soup-core/soup-queue.c (soup_encode_http_auth): Check for
-       NULL auth response.
-
-2001-08-23  Alex Graveley  <alex@ximian.com>
-
-       * src/soup-core/soup-auth.c (ntlm_new): Fix under-allocation.
-       (ntlm_parse): Comment out the NTLM host/domain parsing code, as it
-       segfaults for some reason. Not that this matters as IIS seems to
-       competely ignore these parts of the NTLM message :) There is also
-       some memory corruption in soup-ntlm.c causing segfaults after the
-       message-finished callback returns.
-
-2001-08-23  Alex Graveley  <alex@ximian.com>
-
-       * src/soup-core/soup-auth.c (soup_auth_invalidates_prior): Add
-       SoupAuth.compare_func and call this from here, to remove hardcoded
-       auth scheme knowledge.
-       (soup_auth_new_from_header): Iterate known_auth_schemes looking
-       for a match with auth scheme supplied, instead of hardcoding known
-       auth schemes.
-
-2001-08-23  Alex Graveley  <alex@ximian.com>
-
-       * src/soup-core/soup-auth.c (soup_auth_invalidates_prior): Take an
-       old_auth argument, if auth_types do not match always return
-       TRUE. This allows for a server requested re-auth with a different
-       auth mechanism.
-
-2001-08-23  Alex Graveley  <alex@ximian.com>
-
-       * src/soup-core/soup-ntlm.[ch]: Microsoft NTLM authentication
-       support compliments of Dan Winship (danw@ximian.com).
-
-       * src/soup-core/Makefile.am (libsoup_la_SOURCES): Add soup-ntlm.[ch]
-
-       * src/soup-core/soup-auth.c (soup_auth_new_from_header): Set auth
-       context before header parsing. Add NTLM case. Call
-       auth->parse_func instead of hardcoding.
-       (soup_auth_invalidates_prior): add NTLM, which should always
-       invalidate.
-       (ntlm_new): impl.
-       (ntlm_free): impl.
-       (ntlm_parse): impl. Hack to get domain from the uri's authmech
-       field.
-       (ntlm_auth): impl.
-
-       * src/soup-core/soup-dav-server.c (get_depth): return 0 for
-       unknown value.
-
-       * src/soup-core/soup-server.h: Remove SoupServerAnonymousToken and
-       add SoupServerNTLMToken.
-
-2001-08-20  Joe Shaw  <joe@ximian.com>
-
-       * configure.in: Bump up version to 0.4.4
-       * src/soup-core/soup-private.h: Ditto.
-
-       * src/soup-core/soup-auth.c (compute_response, digest_auth_func):
-       Instead of just passing uri->path, pass
-       uri->path + '?' + uri->querystring if present.
-
-2001-08-17  Alex Graveley  <alex@ximian.com>
-
-       * build/libsoup.def: Update for DAV methods.
-
-2001-08-17  Alex Graveley  <alex@ximian.com>
-
-       * src/soup-core/soup-dav-server.[ch]: Initial WebDAV server
-       support.
-
-       * src/soup-core/soup-dav.[ch]: Beginnings of WebDAV client
-       support.
-
-       * configure.in: Add warning about updating
-       src/soup-core/soup-private.h when version changes.
-
-       * src/soup-core/soup-private.h: Declare SoupAuth here, so
-       including is possible.
-
-2001-08-12  Alex Graveley  <alex@ximian.com>
-
-       * src/soup-core/soup-ssl.c (soup_ssl_get_iochannel): Connect to
-       HUP signal to avoid indefinate hangs. Remove idle waitpid
-       handler. Thanks to Chris Toshok for finding this one.
-
-2001-08-11  Alex Graveley  <alex@ximian.com>
-
-       * src/soup-core/soup-ssl-proxy.c (main): Fix typo causing
-       O_NONBLOCK not to be set.
-
-       * src/soup-core/soup-ssl.c (soup_ssl_get_iochannel): Ditto.
-
-2001-08-10  Alex Graveley  <alex@ximian.com>
-
-       * src/soup-core/soup-private.h: Include sys/socket.h for sa in
-       SoupAddress.
-
-2001-08-08  Alex Graveley  <alex@ximian.com>
-
-       * configure.in: Bump version to 0.4.3.
-
-2001-08-08  Alex Graveley  <alex@ximian.com>
-
-       * src/soup-core/soup-transfer.c (soup_transfer_read_chunk):
-       Handle entity headers after chunk body, closes bug #6846.
-
-       * src/soup-core/soup-queue.c (soup_queue_read_done_cb): Fixup comments.
-
-2001-08-06  Alex Graveley  <alex@ximian.com>
-
-       * src/soup-core/soup-private.h: Define VERSION to "Win/0.4.2" for
-       Windows clients.
-
-2001-08-06  Alex Graveley  <alex@ximian.com>
-
-       * src/soup-core/soup-transfer.c (soup_transfer_read_cb): Remove
-       warning used for testing.
-       (soup_transfer_write_cb): Ditto.
-
-2001-08-06  Alex Graveley  <alex@ximian.com>
-
-       * src/soup-core/soup-transfer.c (soup_transfer_read_cb): Read
-       speedup to read all available data before processing and returning
-       to the mainloop.
-
-       * src/soup-core/soup-message.h: Add defines for standard DAV methods.
-
-2001-07-31  Alex Graveley  <alex@ximian.com>
-
-       * src/soup-core/soup-queue.c (soup_get_request_header): Remove
-       special case for GET and HEAD when adding content-length header.
-
-2001-07-30  Alex Graveley  <alex@ximian.com>
-
-       * configure.in: Bump version to 0.4.2.
-
-2001-07-30  Alex Graveley  <alex@ximian.com>
-
-       * src/soup-core/soup-queue.c (soup_queue_read_headers_cb):
-       Content-length should be avoided for HEAD requests.
-
-2001-07-30  Alex Graveley  <alex@ximian.com>
-
-       * src/soup-core/soup-misc.c (soup_load_config_internal): Fix bug
-       where only the first valid config token is loaded from the config file.
-
-2001-07-30  Alex Graveley  <alex@ximian.com>
-
-       * src/soup-core/soup-socket.c (soup_address_new_cb): Fix dangling
-       pointer error where a resolved SoupAddress is passed to the callback,
-       and then realloc'd.
-
-       * src/soup-core/soup-headers.c (soup_headers_parse_response):
-       Don't require gchar const **status_phrase.
-
-2001-07-29  Alex Graveley  <alex@ximian.com>
-
-       * src/soup-core/soup-apache.c (soup_apache_message_create): strdup
-       response_phrase.
-
-       * src/soup-core/soup-httpd.c (soup_httpd_read_done_cb): Ditto.
-       
-       * src/soup-core/soup-message.c (soup_message_free): Free
-       response_phrase.
-
-       * src/soup-core/soup-context.c (soup_try_existing_connections):
-       Revert accidental commit.
-
-       * src/soup-core/soup-queue.c (soup_get_request_header): Only
-       inhibit Content-Length for GET and HEAD if request.length is 0;
-       (soup_message_queue): Free response_phrase on requeue.
-
-       * src/soup-core/soup-socket.c (soup_address_new): Fix
-       formatting.
-
-2001-07-26  Joe Shaw  <joe@ximian.com>
-
-       * src/soup-core/soup-queue.c (soup_get_request_header): Don't display
-       the SOAPAction header if it's either provided by the user or it is
-       NULL.
-
-2001-07-26  Joe Shaw  <joe@ximian.com>
-
-       * configure.in: Bump the version up to 0.4.1.
-
-       * src/soup-core/soup-queue.c (soup_get_request_header): Fix a logic
-       error. Send the actual version of Soup with the User-Agent header
-       instead of always 0.1.
-
-2001-07-25  Joe Shaw  <joe@ximian.com>
-
-       * src/soup-core/soup-socket.c (soup_address_new,
-       soup_address_get_name): Close a bunch of leaked file descriptors from
-       piping.
-
-2001-07-19  Alex Graveley  <alex@ximian.com>
-
-       * src/soup-core/soup-queue.c (soup_get_request_header): Allow
-       override of http version. Only include Content-Length if method is
-       not GET or HEAD.
-
-       * src/soup-core/soup-message.c (soup_message_new): Set default
-       http_version to SOUP_HTTP_1_1;
-       (soup_message_set_http_version): Impl.
-       (soup_message_get_flags): Check for NULL.
-
-       * src/soup-core/soup-private.h: Add http_version to _SoupMessagePrivate.
-
-2001-07-19  Alex Graveley  <alex@ximian.com>
-
-       * configure.in: Bump version to 0.4.0.
-
-2001-07-19  Alex Graveley  <alex@ximian.com>
-
-       * configure.in: Remove -Werror from WSDL_CFLAGS as this ills on so
-       many redhat distros. Remove unused ISO C99 IEEE754 section. Set
-       the default to hide more warnings.
-
-       * src/soup-wsdl-runtime/wsdl-typecodes.c: Remove \r from end of
-       lines.
-
-       * src/soup-wsdl/Makefile.am: Formatting.
-       * src/soup-wsdl-runtime/Makefile.am: Formatting.
-
-2001-07-17  Alex Graveley  <alex@ximian.com>
-
-       * src/soup-core/soup-context.c (soup_context_uri_hash): Add
-       querysting to hash.
-       (soup_context_uri_equal): Compare querystring for equality.
-
-       * src/soup-core/soup-transfer.c (soup_transfer_read_error_cb): Add
-       gross hack to avoid double frees by only freeing the SoupReader
-       or SoupWriter if we are not currently processing a callback.
-       (soup_transfer_read_cb): Ditto
-       (soup_transfer_write_error_cb): Ditto.
-       (soup_transfer_write_cb): Ditto.
-       (soup_transfer_read_cancel): Return if currently processing a callback.
-       (soup_transfer_write_cancel): Ditto.
-
-       * src/soup-core/soup-message.c (soup_message_new): Add
-       redirect_handler by default.
-       (soup_message_set_flags): Remove redirect handler when
-       SOUP_MESSAGE_NO_REDIRECT is set, and add it when it is unset.
-
-       * src/soup-core/soup-message.h: Change SOUP_MESSAGE_FOLLOW_REDIRECT to
-       SOUP_MESSAGE_NO_REDIRECT, as redirect is on by default now.
-
-2001-07-16  Alex Graveley  <alex@ximian.com>
-
-       * src/soup-core/soup-transfer.c (soup_transfer_read_cb): Set len
-       to 0 before calling callback to handle cases where no content
-       length is specified. Special thanks goes out to Joe Shaw
-       (joe@ximian.com) for finding this one.
-
-2001-07-16  Alex Graveley  <alex@ximian.com>
-
-       * src/soup-core/soup-private.h: Remove the unused digest_data from
-       _SoupMessagePrivate.
-
-       * src/soup-core/soup-auth.c: Reorganize into basic-auth,
-       digest-auth, public interface, and parse routines hopefullly to
-       make this more readable.
-
-2001-07-13  Alex Graveley  <alex@ximian.com>
-
-       * src/soup-wsdl-runtime/wsdl-typecodes.c: Add windows x86 type 
-         alignment defines.
-
-2001-07-10  Alex Graveley  <alex@ximian.com>
-
-       * src/soup-core/soup-uri.h: Replace SOUP_PROTOCOL_SHTTP with
-       SOUP_PROTOCOL_HTTPS.
-       * src/soup-core/soup-context.c (soup_connection_get_iochannel): Ditto.
-       * src/soup-core/soup-httpd.c (soup_httpd_conn_accept): Ditto.
-
-2001-07-09  Alex Graveley  <alex@ximian.com>
-
-       * src/soup-core/soup-socket.c (soup_socket_server_new): Typo to go
-       to SETUP_ERROR on error.
-
-2001-07-09  Alex Graveley  <alex@ximian.com>
-
-       * src/soup-core/soup-uri.c (soup_uri_get_protocol): Use
-       g_strncasecmp.
-
-       * src/soup-core/soup-transfer.c (soup_transfer_write_cb): ifdef
-       wrap all references to SIGPIPE.
-
-       * src/soup-core/soup-ssl.c: ifdef wrap sys/wait.h and sys/socket.h. 
-       (soup_ssl_get_iochannel): Do nothing if on windows.
-
-       * src/soup-core/soup-socket.c: Various never-before compiled
-       windows cleanups.
-
-       * src/soup-core/soup-misc.c (soup_load_config): ifdef wrap
-       SYSCONFDIR souprc loading.
-
-       * src/soup-core/soup-context.c: ifdef wrap sys/socket.h
-       (soup_connection_setup_socket): Do nothing if on windows.
-
-       * src/soup-core/soup-auth.c: If on windows include <process.h> for
-       getpid().
-
-       * configure.in: Add checks for sys/sockio.h and sys/wait.h
-
-2001-07-09  Alex Graveley  <alex@ximian.com>
-
-       * build/Soup_core.dsp
-         build/Soup_wsdl_runtime.dsp
-         build/Soup_wsdl.dsp: Use unique Debug output directory. 
-
-2001-07-09  Alex Graveley  <alex@ximian.com>
-
-       * build/Soup.dsw
-         build/Soup_apache.dsp
-         build/Soup_core.dsp
-         build/Soup_httpd.dsp
-         build/Soup_ssl_proxy.dsp
-         build/Soup_wsdl.dsp
-         build/Soup_wsdl_runtime.dsp: Initial run of windows build scripts.
-
-2001-07-09  Alex Graveley  <alex@ximian.com>
-
-       * src/soup-core/soup-auth.[ch]: New client authentication (basic/digest)
-       code from Joe Shaw (joe@ximian.com).
-
-       * src/soup-core/soup-queue.c (soup_encode_http_auth): Updated to
-       use soup-auth.
-       (soup_get_request_header): Pass the SoupMessage to
-       soup_encode_http_auth instead of just the URI. Check for
-       req->action in header creation.
-       (soup_queue_error_cb): Reset read_tag and write_tag to avoid
-       double free.
-       (soup_encode_http_auth): Use soup_auth_authorize().
-
-       * src/soup-core/soup-private.h: Add SoupAuth to SoupContext.
-
-       * src/soup-core/soup-context.c (soup_context_unref): Free auth.
-
-       * src/soup-core/soup-cgi.c: Flog.
-
-       * src/soup-core/soup-message.c (soup_message_new): Create handlers
-       for 401 (Authorization Required) and 407 (Proxy-Authorization
-       Required) response codes.
-       (soup_message_redirect): Rename to redirect_handler.
-       (redirect_handler): Don't unref existing context if new context
-       creation fails.
-       (soup_message_set_header): Check for value before insertion.
-
-       * src/soup-core/soup-transfer.c (soup_transfer_read_cancel): Free
-       recv_buf contents if no callback has been issued.
-       (soup_transfer_read_cb): Set callback_issued.
-
-2001-07-05  Alex Graveley  <alex@ximian.com>
-
-       * src/soup-core/soup-socks.c (soup_connect_socks_proxy): Use const uris.
-
-       * src/soup-core/soup-queue.c (soup_encode_http_auth): Make uri const.
-
-       * src/soup-core/soup-context.[ch] (soup_context_get_uri): Return a
-       const SoupUri.
-       
-       * src/soup-core/soup-digest.c (soup_digest_md5_finalize): Make
-       compile.
-
-2001-07-02  Alex Graveley  <alex@ximian.com>
-
-       * src/soup-core/soup-digest.c: Formatting fixes.
-       (digest_md5_challenge): Use string auth_header instead of
-       GByteArray for token.
-       (soup_digest_challenge): Free response GByteArray after adding
-       Authorization header.
-
-2001-07-02  Alex Graveley  <alex@ximian.com>
-
-       * src/soup-core/soup-private.h: Remove _SoupMessagePrivate bits
-       covered by soup-transfer.
-
-       * src/soup-core/soup-queue.c: Use soup-transfer.
-       (soup_queue_error_cb): Remove handling of buggy MS IIS server
-       tranferring partial content then closing connection. Report this
-       as SOUP_ERROR_IO instead.
-
-       * src/soup-core/soup-httpd.c: Use soup-transfer.
-
-       * src/soup-core/soup-transfer.[ch]: Added. HTTP Transport
-       abstraction used to clean up client and standalone/cgi server code
-       duplication.
-
-       * configure.in: Bump version to 0.3.
-
-       * src/soup-core/soup-queue.c (soup_check_used_headers): Use
-       toupper in switch instead of upper/lower cases for each.
-
-       * src/soup-core/soup-httpd.c: Declare apache dummy method
-       implementations to avoid warnings.
-
-2001-06-27  Joe Shaw  <joe@ximian.com>
-
-       * src/soup-core/soup-digest.c: Largely gutted. Made RFC 2617
-       compliant. Removed RFC 2831 compliance.
-       (soup_digest_challenge): Implemented.
-
-2001-06-21  Joe Shaw  <joe@ximian.com>
-
-       * src/soup-core/soup-message.c (soup_message_new): Do a
-       g_return_val_if_fail() on the SoupContext being passed in so we don't
-       generate a bad SoupMessage.
-
-2001-06-19  Alex Graveley  <alex@ximian.com>
-
-       * src/soup-core/soup-context.c (soup_context_from_uri): Use
-       soup_context_uri_hash and soup_context_uri_equal for matching
-       existing server contexts instead of just matching on path.
-       (soup_context_uri_hash): Added. Returns a hash of the user, authmech,
-       password, and path of a given SoupUri.
-       (soup_context_uri_equal): Added. Returns TRUE if the user, authmech,
-       password, and path of a two SoupUris match.
-
-2001-06-15  Alex Graveley  <alex@ximian.com>
-
-       * configure.in: add check for unistd.h
-
-       * src/soup-core/soup-apache.c, 
-         src/soup-core/soup-cgi.c, 
-         src/soup-core/soup-context.c, 
-         src/soup-core/soup-digest.c, 
-         src/soup-core/soup-nss.c, 
-         src/soup-core/soup-openssl.c, 
-         src/soup-core/soup-private.h, 
-         src/soup-core/soup-queue.c, 
-         src/soup-core/soup-server.c, 
-         src/soup-core/soup-ssl-proxy.c, 
-         src/soup-core/soup-ssl.c. 
-         src/soup-wsdl-runtime/wsdl-typecodes.c: #ifdef protect config.h
-         and unistd.h inclusion.
-
-2001-06-15  Dick Porter  <dick@ximian.com>
-
-       * src/soup-wsdl-runtime/wsdl-schema.h:
-       * src/soup-wsdl-runtime/wsdl-schema.c:
-       * src/soup-wsdl-runtime/wsdl-schema-glib.h:
-       * src/soup-wsdl-runtime/wsdl-schema-glib.c:
-       * src/soup-wsdl/wsdl-parse.c: 
-       * src/soup-core/soup-serializer.c: 
-       * src/soup-core/soup-parser.c: replace 'childs' with
-       'xmlChildrenNode', 'root' with 'xmlRootNode' and 'CHAR' with
-       'xmlChar' for compatibility with both libxml1 and libxml2
-
-       * configure.in: Check for either libxml1 or libxml2, favouring
-       libxml1 but selectable with --with-libxml=[1,2]
-
-2001-06-14  Joe Shaw  <joe@ximian.com>
-
-       * src/soup-core/soup-misc.c (soup_set_proxy): If we're passing in
-       NULL (to reset the proxy), don't try to soup_context_ref() it.
-
-2001-06-14  Alex Graveley  <alex@ximian.com>
-
-       * src/soup-core/soup-queue.c (soup_read_chunk): Don't start from
-       header_len offset.
-       (soup_finish_read): Don't copy the recv_buf, just reference
-       it. Don't free recv_buf.
-       (soup_queue_read_cb): Handle truncating chunks, also truncate
-       recv_buf after finishing headers. Make recv_buf contents public
-       for chunk handlers.
-
-       * src/soup-core/soup-message.c (soup_message_cleanup): Don't free
-       the recv_buf->data, as we no longer copy it.
-
-       * src/soup-core/soup-httpd.c: Update to missing header_len field.
-
-       * src/soup-core/soup-private.h: change SoupMessage.header_len to a
-       boolean headers_done. As we now truncate the buffer after
-       downloading headers. 
-
-2001-06-14  Alex Graveley  <alex@ximian.com>
-
-       * src/soup-core/soup-message.c (soup_message_set_flags): Remove
-       redirect handler if option is removed.
-       (soup_message_remove_handler): Added. Remove handler given
-       function and user_data. Should this be made public?
-       (soup_message_run_handlers): Remove g_warning. No checks are run
-       against body handlers.
-       (soup_message_cleanup): Zero cur_chunk_len and cur_chunk_idx.
-
-2001-06-13  Joe Shaw  <joe@ximian.com>
-
-       * src/soup-core/soup-socket.c (soup_address_new): If SOUP_SYNC_DNS is
-       in the user's environment, use an old fashioned synchronous DNS lookup
-       on UNIX.
-
-2001-06-07  Joe Shaw  <joe@ximian.com>
-
-       * src/soup-core/soup-message.c (soup_message_redirect): Change
-       msg->priv->flags to msg->priv->msg_flags so it'll build again.
-       (soup_message_run_handlers): Add a default case to the switch
-       statement (for RESPONSE_BODY_HANDLER) to squash a warning.
-
-2001-06-07  Alex Graveley  <alex@ximian.com>
-
-       * src/soup-core/soup-message.c (soup_message_run_handlers): Stop
-       processing if a handler requeues the message.
-
-       * src/soup-core/soup-queue.c (soup_process_headers): Allow a
-       handler to requeue the message without having any more handlers or
-       callbacks called.
-       (soup_finish_read): ditto.
-       (soup_queue_read_cb): ditto.
-
-       * src/soup-core/soup-message.c (soup_message_redirect): Requeue
-       message based on Location header, if response status code is 300,
-       301, 302, 303, or 305.
-       (soup_message_set_flags): If SOUP_MESSAGE_FOLLOW_REDIRECT is set,
-       add a header handler (on Location) which calls
-       soup_message_redirect ().
-
-2001-06-06  Alex Graveley  <alex@ximian.com>
-
-       * src/soup-core/soup-message.c (soup_message_add_header_handler):
-       implement.
-       (soup_message_add_response_code_handler): ditto.
-       (soup_message_add_body_handler): ditto.
-       (soup_message_run_handlers): uh-huh.
-       (soup_message_free): Free allocated handler info.
-
-       * src/soup-core/soup-message.h: Change SOUP_MESSAGE_PROCESS_CHUNKS
-       to SOUP_MESSAGE_OVERWRITE_CHUNKS. This will allow large files to
-       be processed using a BODY_CHUNK handler, instead of keeping
-       everything in memory.
-
-       * src/soup-core/soup-queue.c (soup_process_headers): Run PRE_BODY
-       handlers.
-       (soup_finish_read): Run POST_BODY handlers.
-       (soup_queue_read_cb): Run BODY_CHUNK handlers.
-
-2001-06-06  Joe Shaw  <joe@ximian.com>
-
-       * src/soup-core/soup-message.c (soup_message_set_method,
-       soup_message_get_method): Implement. Sets the HTTP method for a given
-       message.
-       (soup_message_new): Set the default method to SOUP_METHOD_POST.
-
-       * src/soup-core/soup-misc.c (soup_substring_index): Make sure we
-       check the very last possible character (<= instead of <) for substrings.
-
-       * src/soup-core/soup-queue.c (soup_get_request_header): Send an HTTP
-       request for the method set in the message instead of always POST.
-
-       * src/soup-core/soup-parser.c: Change the #include to <parser.h> from
-       <gnome-xml/parser.h>.
-
-       * src/soup-core/soup-serializer.h: Change the #include to <tree.h> from
-       <gnome-xml/tree.h>.
-
-2001-06-04  Alex Graveley  <alex@ximian.com>
-
-       * src/soup-core/soup-httpd.c: (ap_*) Add these empty Apache method
-       implementations so soup modules built using soup-apache can be
-       loaded into soup-http.
-       (main): Pass a SoupHttpdServerSock object representing a listening
-       server to soup_httpd_conn_accept.
-       (soup_httpd_finish_read): Return useful error explanations to
-       client when no SOAPAction header is specified, or no server handler for
-       the specified SOAPAction is found. 
-       (soup_httpd_message_construct): Lookup content-length
-       correctly. Free req_method and req_path.
-
-       * src/soup-core/soup-message.c (soup_message_set_header): if
-       overwriting an existing header, be sure
-       to free the old key and value.
-
-       * src/soup-core/soup-queue.c (soup_queue_read_async): rename to
-       (soup_queue_read_cb): this.
-       (soup_queue_error_async): rename to
-       (soup_queue_error_cb): this.
-       (soup_queue_write_async): rename to
-       (soup_queue_write_cb): this.
-       (soup_queue_connect): rename to
-       (soup_queue_connect_cb): this.
-
-2001-06-04  Dick Porter  <dick@ximian.com>
-
-       * src/soup-wsdl-runtime/wsdl-schema.c: A new error message
-       mechanism for reporting schema parse errors to the calling code
-
-       * src/soup-wsdl-runtime/wsdl-schema-glib.c
-       (wsdl_schema_glib_parse_struct, wsdl_schema_glib_start_element,
-       wsdl_schema_glib_end_element): Use new error message mechanism
-
-       * src/soup-wsdl/wsdl-parse.c (wsdl_parse_warning,
-       wsdl_parse_error, wsdl_parse_fatal): Log messages via wsdl_debug,
-       so the module selection works
-
-2001-06-01  Alex Graveley  <alex@ximian.com>
-
-       * src/soup-core/soup-misc.c: Correctly note copyright for
-       soup_base64_encode() to the FSF, and credit Chris Blizzard as the
-       actual author.
-
-2001-06-01  Alex Graveley  <alex@ximian.com>
-
-       * src/soup-core/Makefile.am (libsoup_la_SOURCES): Take soup-cgi.c
-       out of rotation until server/client codepaths merge.
-
-       * src/soup-core/soup-httpd.c (soup_httpd_finish_read): Don't span
-       mulptiple lines for content-type header.
-
-2001-06-01  Alex Graveley  <alex@ximian.com>
-
-       * src/soup-core/soup-queue.c (soup_check_used_headers): Only mark
-       which custom headers are used, and directly g_string_sprintfa()
-       the custom header.
-       (soup_get_request_header): Soptimize header writing.
-
-2001-06-01  Alex Graveley  <alex@ximian.com>
-
-       * src/soup-core/soup-message.c (soup_message_set_method): 
-       (soup_message_add_header_handler): 
-       (soup_message_add_response_code_handler): 
-       (soup_message_add_body_handler): Added.
-
-       * src/soup-core/soup-socket.c (soup_address_get_name_sync): Allow
-       syncronous reverse name lookups.
-
-       * TODO (TODO): Updated.
-
-       * src/soup-core/Makefile.am (bin_PROGRAMS): Added soup-httpd.
-
-       * src/soup-core/soup-httpd.c: Added. Simple httpd server
-       implementation. This shares a *lot* of code with soup-queue.c, so
-       some hardc0re refactoring action is planned.
-
-       * configure.in (GMODULE_LIBS): Added.
-
-2001-05-29  Dick Porter  <dick@ximian.com>
-
-       * tests/Makefile.am: Put the generated code into the build
-       directory.  Run soup-config through /bin/sh to work around a
-       permissions problem.
-
-2001-05-25  Dick Porter  <dick@ximian.com>
-
-       * Documentation
-
-2001-05-25  Alex Graveley  <alex@ximian.com>
-
-       * src/soup-core/soup-queue.c (soup_message_queue): No need to free
-       priv->recv_buf as it is now done in soup_message_cleanup().
-       (soup_message_queue): Free response_header keys and values before
-       destroying the hash table.
-
-       * src/soup-core/soup-message.c (soup_message_free): Don't free
-       priv->recv_buf here.
-       (soup_message_cleanup): Free priv->recv_buf here instead.
-
-       * src/soup-core/soup-queue.c (soup_finish_read): Since we now
-       g_strdup() all headers, and we already g_memdup the actual body
-       buffer, free the temporary recv_buf.
-
-       * src/soup-core/soup-headers.c (soup_headers_parse_response):
-       g_strdup() the response reason phrase.
-
-2001-05-24  Alex Graveley  <alex@ximian.com>
-
-       * README: Update Licensing section for soup-ssl-proxy.
-
-2001-05-24  Larry Ewing  <lewing@ximian.com>
-
-       * src/soup-wsdl-runtime/wsdl-soap-parse.c: include string.h for
-       strlen and strcmp prototypes.
-       * src/soup-wsdl-runtime/wsdl-soap-memory.c: include string.h for
-       memset prototype.
-
-2001-05-23  Dick Porter  <dick@ximian.com>
-
-       * src/soup-wsdl-runtime/wsdl-typecodes-c.c
-       (wsdl_typecode_write_c_mm_list):
-       * src/soup-wsdl-runtime/wsdl-soap-parse.c
-       (wsdl_soap_set_list_param):
-       * src/soup-wsdl-runtime/wsdl-soap-marshal.c
-       (wsdl_soap_marshal_list_param): Eliminate the extra layer of
-       indirection for list items that are naturally pointers.
-
-       * tests/test-wsdl-runtime.c: Update list tests
-
-       * src/soup-wsdl-runtime/wsdl-typecodes.c: 
-       * src/soup-wsdl-runtime/wsdl-schema.c: 
-       * src/soup-wsdl/wsdl-trace.c: 
-       * src/soup-wsdl/wsdl-soap-emit.c: 
-       * src/soup-wsdl/wsdl-parse.c: 
-       * src/soup-wsdl/wsdl-describe.c: 
-       * docs/reference/soup-sections.txt: Started documenting the code
-
-2001-05-22  Alex Graveley  <alex@ximian.com>
-
-       * RELEASE (ANNOUNCE): Added. All release announcements should be
-       prepended here.
-
-2001-05-22  JP Rosevear  <jpr@ximian.com>
-
-       * src/soup-core/soup-apache.c (soup_apache_read_request): null
-       terminate the buffer
-
-2001-05-22  Rodrigo Moya <rodrigo@ximian.com>
-
-       * src/soup-wsdl/wsdl-soap-parse.c: don't emit code to add the
-       transport headers to the SoupEnv, which is only used for SOAP
-       request/response headers
-       * src/soup-core/soup-env.c (soup_env_set_response_header):
-       g_strdup the hash table key also
-       (soup_env_set_request_header): ditto
-
-2001-05-21  Alex Graveley  <alex@ximian.com>
-
-       * src/soup-core/soup-queue.c (soup_message_queue): gtk-doc fixups.
-
-       * src/soup-core/soup-socket.c (soup_socket_server_new): New.
-       (soup_socket_server_accept): New.
-       (soup_socket_server_try_accept): New.
-
-2001-05-18  Rodrigo Moya <rodrigo@ximian.com>
-
-       * src/soup-wsdl-runtime/wsdl-soap-parse.c (wsdl_soap_headers):
-       use the correct XML node to get the headers
-
-2001-05-18  Alex Graveley  <alex@ximian.com>
-
-       * README: "Subscribe" not "Subject" in
-       soup-list-request@ximian.com message body. :)
-
-2001-05-18  Alex Graveley  <alex@ximian.com>
-
-       * docs/reference/soup-docs.sgml: Prune soup-core internal files.
-
-       * configure.in: Add pretty section headers, move gtk-doc section
-
-2001-05-17  JP Rosevear  <jpr@ximian.com>
-
-       * src/soup-wsdl/wsdl-soap-skels.c
-       (wsdl_emit_soap_skels_binding_operation): do not free the callback
-       data, or the second time the method gets called, *KABOOM*
-       
-2001-05-17  JP Rosevear  <jpr@ximian.com>
-
-       * src/soup-wsdl-runtime/wsdl-soap-parse.c (wsdl_soap_operation):
-       prevent leak and check for fault straight away (instead of
-       operation name)
-
-       * src/soup-core/soup-env.c (soup_env_free): only free the fault if
-       there is one
-       (soup_env_clear_fault): ditto
-
-       * src/soup-wsdl-runtime/wsdl-soap-marshal.c (wsdl_soap_marshal):
-       use the serializer functions to write out the fault and only write
-       the message return if there is no fault
-       
-2001-05-17  JP Rosevear  <jpr@ximian.com>
-
-       * src/soup-core/soup-headers.c (soup_headers_parse): find the end
-       of the value and g_strndup only that as the value, rather than the
-       remainder of the string
-
-       * src/soup-core/soup-message.c (soup_message_issue_callback): free
-       the message only if the callback exists, otherwise send_message is
-       borked.  New a little more design to fix properly
-
-2001-05-17  Dick Porter  <dick@ximian.com>
-
-       * Fixed all gtk-doc moans in soup-core documentation
-
-       * docs/reference: Extract gtk-doc documentation from the code
-
-       * tests/test-wsdl-runtime.c: 
-       * tests/stockquote2-server.c: 
-       * tests/stockquote2-client.c: Updated for new API
-
-       * tests/stress-test.c: 
-       * tests/simple-test.c: Include installed soup headers
-
-       * configure.in: Check for gtk-doc
-
-       * tests/Makefile.am: Made example code just plain
-       "noinst_PROGRAMS", check_PROGRAMS are built as part of "make
-       dist". Wrestled with automake, automake won :-( I wanted to delete
-       the built sources from the dist target, and not have automake try
-       and recreate them with a non-existant soup-wsdl when I type "make
-       distcheck".
-
-       * Makefile.am: Took tests out of SUBDIRS, added a "make examples"
-       target instead.
-
-2001-05-16  Alex Graveley  <alex@ximian.com>
-
-       * src/soup-core/soup-serializer.c: Document. Needs more details
-       and descriptions from the SOAP spec.
-
-       * src/soup-core/soup-queue.c: Document.
-
-       * src/soup-core/soup-misc.c: Document.
-       (soup_load_config): Reset security policy to
-       SOUP_SECURITY_DOMESTIC when reloading config.
-
-       * src/soup-core/soup-message.c: Document.
-
-2001-05-16  JP Rosevear  <jpr@ximian.com>
-
-       * src/soup-core/soup-headers.c (soup_headers_parse): g_strdup the
-       response headers when adding them to the hash
-
-       * src/soup-core/soup-context.c (soup_context_get): ditto
-
-       * src/soup-core/soup-context.h: constify uri passed to
-       soup_context_get
-
-       * src/soup-core/soup-env.h (soup_env_free): new protos
-
-       * src/soup-core/soup-env.c (soup_env_set_address): new accessor to
-       set url to access for service
-       (soup_env_get_address): ditto
-       
-2001-05-16  Alex Graveley  <alex@ximian.com>
-
-       * src/soup-core/soup-apache.c (soup_apache_add_header_from_table):
-       g_strdup headers from the apache headers table.
-       
-2001-05-16  JP Rosevear  <jpr@ximian.com>
-
-       * tests/simple-test.c (main): change this to something sensible
-
-2001-05-16  Rodrigo Moya <rodrigo@ximian.com>
-
-       * src/soup-wsdl/wsdl-soap-stubs.c: fully adapted to the new
-       SoupEnv stuff
-
-2001-05-16  Dick Porter  <dick@ximian.com>
-
-       * tests/test-wsdl-runtime.c: Bring up-to-date with new API, and
-       test typecode freeing too.
-
-       * tests/stockquote2-server.c: 
-       * tests/stockquote2-client.c: Bring up-to-date with new API
-
-       * src/soup-wsdl-runtime/wsdl-soap-memory.c: New file of functions
-       to zero or free a set of types.
-
-       * src/soup-wsdl-runtime/wsdl-typecodes.c
-       (wsdl_typecode_param_type): Handle adding '*' to certain types
-       when written as parameters.
-
-       * src/soup-wsdl-runtime/wsdl-typecodes-c.c: Add pointers to memory
-       free functions to typecode structs.
-       New functions to write those memory free functions.
-
-       * src/soup-wsdl-runtime/wsdl-soap-parse.c
-       (wsdl_soap_set_struct_param): Allocate memory for structs
-       (wsdl_soap_parse): Use the new function in wsdl-soap-memory.c to
-       zero the parameters.
-
-       * src/soup-wsdl-runtime/wsdl-soap-marshal.c
-       (wsdl_soap_marshal_struct_param): Structs are now passed as
-       pointers, so need to add extra indirection here.
-       (wsdl_soap_marshal_param): Make sure we dont try to marshal NULL
-       pointers
-
-       * src/soup-wsdl/wsdl-soap-skels.c
-       (wsdl_emit_soap_skels_binding_operation): Zero output args before
-       calling the callback, and free any memory used by them after
-       sending the response.
-
-       * src/soup-wsdl/wsdl-soap-headers.c
-       (wsdl_emit_soap_headers_binding_operation): Server callback now
-       returns 'void'
-       (wsdl_emit_soap_header_mm): Write memory-management function
-       prototypes
-
-       * src/soup-wsdl/wsdl-soap-emit.c (wsdl_emit_part): Use new
-       parameter-passing API
-
-       * src/soup-wsdl/wsdl-soap-common.c (wsdl_emit_soap_common_mm):
-       Cause memory-management routines to be written for all
-       user-defined types
-
-2001-05-15  JP Rosevear  <jpr@ximian.com>
-
-       * src/soup-wsdl/wsdl-soap-skels.c
-       (wsdl_emit_soap_skels_binding_operation): soup_env_new needed "()"
-       to be a function call
-
-       * src/soup-core/soup.h: explicitly include soup-fault.h and soup-env.h
-
-       * src/soup-wsdl-runtime/wsdl-soap-marshal.h: kludge soup-env.h as
-       well.  We really should rename the dirs properly
-
-       * src/soup-wsdl-runtime/wsdl-soap-parse.h: kludge around include
-       problem
-
-2001-05-15  Rodrigo Moya <rodrigo@ximian.com>
-
-       * src/soup-wsdl/wsdl-soap-stubs.c: replace all SoupFault
-       parameter with SoupEnv, and remove "GHashTable request_headers"
-       from list of parameters in server callbacks, because before
-       calling those callbacks, the stubs take care of adding the
-       SoupMessage's request headers to the SoupEnv being passed
-       * src/soup-wsdl-runtime/wsdl-soap-parse.c
-       (wsdl_soap_parse): replace SoupFault with the new
-       SoupEnv parameter
-       (wsdl_soap_headers): new internal function to parse all
-       the headers in the SOAP message and add them to the SoupEnv
-       * src/soup-wsdl-runtime/wsdl-soap-marshal.c
-       (wsdl_soap_marshal): don't access directly SoupFault
-       struct members.
-       Replace SoupFault parameter with the new SoupEnv
-       * src/soup-core/soup-env.c
-       (soup_env_get_request_header_list): new function
-       (soup_env_get_response_header_list): new function
-       (soup_env_set_fault): new function to associate a SoupFault
-       with a SoupEnv
-
-2001-05-13  Rodrigo Moya <rodrigo@ximian.com>
-
-       * src/soup-core/soup-fault.[ch]: made the SoupFault structure
-       private, and add accessor functions for the struct members
-       * src/soup-core/soup-env.[ch]: added SoupEnv stuff, to easily
-       manage SOAP environments (request/response headers list, faults)
-
-2001-05-12  Alex Graveley  <alex@ximian.com>
-
-       * src/soup-core/soup-message.c (soup_message_set_request_header):
-       g_strdup name and value.
-       (soup_message_set_response_header): ditto.
-       (soup_message_get_response_header): implement.
-       (soup_message_get_request_header): implement.
-
-2001-05-12  Alex Graveley  <alex@ximian.com>
-
-       * src/soup-core/soup-fault.[ch]: Format cleanups.
-
-       * src/soup-core/soup-parser.[ch]: Ditto.
-
-2001-05-12  Rodrigo Moya <rodrigo@ximian.com>
-
-       * src/soup-core/soup-fault.[ch]: moved the SoupFault to its
-       own header file, since it will be also used by the upcoming
-       SoupEnv
-
-2001-05-11  Alex Graveley  <alex@ximian.com>
-
-       * tests/stress-test.c (current_temp_cb): handle
-       SOUP_ERROR_CANT_AUTHENTICATE.
-
-       * tests/simple-test.c (current_temp_cb): handle
-       SOUP_ERROR_CANT_AUTHENTICATE.
-
-2001-05-11  Alex Graveley  <alex@ximian.com>
-
-       * src/soup-core/soup-nss.c (soup_nss_init): Use NSS_InitReadWrite().
-       (soup_nss_get_iochannel): set SSL_BadCertHook().
-
-2001-05-10  Alex Graveley  <alex@ximian.com>
-
-       * src/soup-core/soup-queue.c (soup_finish_read): set
-       response.owner to SOUP_BUFFER_SYSTEM_OWNED.
-
-       * src/soup-core/soup-uri.c (soup_uri_copy): added.
-
-       * src/soup-core/soup-context.c (soup_context_get): Free the
-       temporary URI.
-       (soup_context_from_uri): dup the passed uri if creating a new context.
-
-2001-05-09  JP Rosevear  <jpr@ximian.com>
-
-       * src/soup-wsdl/wsdl-soap-skels.c
-       (wsdl_emit_soap_skels_binding_operation): indent the SoupFault
-       parameter when written to the skels
-
-2001-05-09  Dick Porter  <dick@ximian.com>
-
-       * src/soup-wsdl-runtime/wsdl-typecodes.c: Put the glib namespace
-       prefix back into the typecode struct names
-       (wsdl_typecode_type): Return a namespace-prefixed type name for
-       struct and element types
-       (wsdl_typecode_lookup): Look up typecodes by namespace
-
-       * src/soup-wsdl-runtime/wsdl-typecodes-c.c: Typecode struct names
-       include namespace prefixes
-
-       * src/soup-wsdl-runtime/wsdl-schema-glib.c
-       (wsdl_schema_glib_parse_struct): Typecodes now have namespaces
-       associated with them.
-
-       * src/soup-wsdl/wsdl-soap-headers.c: Deleted all the list
-       callbacks that printed variations on a parameter theme, call
-       wsdl_emit_part_list instead.
-       (wsdl_emit_soap_headers_binding_operation): Don't add a namespace
-       part for every level of WSDL indirection.
-       * src/soup-wsdl/wsdl-soap-stubs.c: ditto
-       * src/soup-wsdl/wsdl-soap-skels.c: ditto
-
-       * src/soup-wsdl/wsdl-soap-emit.c: New file of C code emitting helper
-       functions.
-
-       * src/soup-wsdl/wsdl-parse.c (wsdl_parse_message_part_attrs): Look
-       up typecodes by namespace
-       (wsdl_start_element): Pass more XML info to the schema parser
-
-       * src/soup-core/soup-parser.h: include file wasn't on the search
-       path at compile time
-
-2001-05-09  Rodrigo Moya <rodrigo@ximian.com>
-
-       * src/soup-core/soup-parser.c: retrieve info about faults
-       when parsing the SOAP messages
-       * src/soup-wsdl/wsdl-soap-stubs.c: use 'fault' and not
-       '&fault' in call to wsdl_soap_parse
-       * src/soup-wsdl/: some small fixes for compilation
-       * src/soup-core/soup-parser.[ch]: added a basic SOAP messages
-       parser, which easily lets access to the message parameters
-       and faults
-
-2001-05-05  Rodrigo Moya <rodrigo@ximian.com>
-       
-       * src/soup-wsdl-runtime/wsdl-soap-fault.[ch]: added to manage/retrieve
-       info from SOAP faults
-       * src/soup-wsdl-runtime/wsdl-soap-parse.c (wsdl_soap_parse): retrieve
-       SOAP faults from the message being parsed. Added a wsdl_soap_fault
-       parameter, which will be returned if there was actually a SOAP fault
-       in the message
-       * src/soup-wsdl-runtime/wsdl-soap-marshal.c (wsdl_soap_marhal): add
-       a wsdl_soap_fault parameter, to be serialized along with the rest
-       of the SOAP message
-       * src/soup-wsdl/wsdl-soap-skels.c: use wsdl_soap_fault where appropriate
-       * src/soup-wsdl/wsdl-soap-stubs.c: ditto
-       * src/soup-wsdl/wsdl-soap-headers.c: ditto
-
-2001-05-04  Dick Porter  <dick@ximian.com>
-
-       * src/soup-wsdl-runtime/wsdl-schema.c: Decide which schema parser to
-       call for a WSDL <types> section. This supercedes the old glib schema
-       parser in wsdl-parse.c. The WSDL parser is now effectively decoupled
-       from the schema, which should make it much easier to add new schemas
-       in the future without having to change the parser.
-
-       * src/soup-wsdl-runtime/wsdl-schema-glib.c: Build typecodes from
-       the simple glib schema
-
-       * src/soup-wsdl-runtime/wsdl-typecodes-c.c: Write C code
-       describing a typecode.
-
-       * src/soup-wsdl-runtime/wsdl-soap-parse.c: 
-       * src/soup-wsdl-runtime/wsdl-soap-marshal.c: 
-       * src/soup-wsdl-runtime/wsdl-param.h: Take all instances of 'glib' out
-       of typecode definitions and function names.
-
-       * src/soup-wsdl-runtime/Makefile.am: Build a version of the
-       runtime library more useful for writing C code (ideally i'd make
-       this dynamically link the runtime library, but libtool wont let
-       me)
-
-       * src/soup-wsdl/wsdl-thread.c (wsdl_thread_soap_parts): No need to
-       look up glib types, the message part already holds a pointer to
-       the typecode.
-
-       * src/soup-wsdl/wsdl-soap-stubs.c:
-       * src/soup-wsdl/wsdl-soap-skels.c: Type names are looked up by
-       typecode. All checks for custom glib types have been deleted.
-
-       * src/soup-wsdl/wsdl-soap-headers.c: All typecode declarations are
-       now printed using the runtime library.  Type names are looked up
-       by typecode. All checks for custom glib types have been deleted.
-
-       * src/soup-wsdl/wsdl-soap-common.c: All typecode printing is now
-       done using the runtime library.
-
-       * src/soup-wsdl/wsdl-parse.c: Moved wsdl_qnamecmp() and
-       wsdl_attrnscmp to wsdl-schema.c (in the runtime library)
-       (wsdl_parse_message_part_attrs): Look up typecodes, not glib types.
-       (wsdl_parse_types): Call through the runtime schema parser, instead
-       of the custom glib type parser.
-
-       * src/soup-wsdl/wsdl-memory.c (wsdl_free_types): Delete typecodes
-       rather than glib types.
-
-       * src/soup-wsdl/wsdl-describe.c: Replace the type printing
-       routines with calls to wsdl_typecode_print
-
-       * src/soup-wsdl/main.c (main): No need to initialise the glib
-       types any more.
-
-       * src/soup-wsdl/Makefile.am (soup_wsdl_SOURCES): Don't bother to
-       compile wsdl-types-glib.c, it's been superceded by the typecode
-       builder
-
-2001-05-02  Dick Porter  <dick@ximian.com>
-
-       * src/soup-wsdl/wsdl-soap-stubs.c
-       (wsdl_emit_soap_stubs_binding_operation): Write synchronous client
-       stubs
-
-       * src/soup-wsdl/wsdl-soap-headers.c
-       (wsdl_emit_soap_headers_binding_operation): Emit prototypes for
-       synchronous stubs
-
-       * src/soup-wsdl/wsdl-soap-skels.c
-       (wsdl_emit_soap_skels_binding_operation): Write server skels
-
-       * src/soup-wsdl/wsdl-soap-headers.c
-       (wsdl_emit_soap_headers_binding_operation): Emit prototypes for
-       skels
-       (wsdl_emit_soap_headers): Include the right soup headers
-
-       * src/soup-wsdl/wsdl-soap-stubs.c (wsdl_emit_soap_stubs): Include
-       the right soup headers
-
-       * src/soup-wsdl-runtime/Makefile.am (INCLUDES): 
-       * src/soup-wsdl-runtime/wsdl-soap-marshal.h: A kludge to work
-       around include path searching whether compiling or at runtime
-
-2001-04-30  Dick Porter  <dick@ximian.com>
-
-       * src/soup-wsdl/wsdl-soap-stubs.c: Use the new marshaller instead
-       of a large printf. Drastically reduced the complexity of both the
-       wsdl compiler code and the generated stubs. Deleted huge tracts of
-       now-unused code too.
-
-       * src/soup-wsdl/wsdl-types-glib.c: Deleted unused code
-
-2001-04-29  Dick Porter  <dick@ximian.com>
-
-       * src/soup-wsdl-runtime/wsdl-soap-parse.c
-       (wsdl_soap_set_simple_param): Some more error checking. Read
-       booleans as "true", "false", "yes", "no" as well as an integer.
-       (wsdl_soap_set_param): Give the XML child node to
-       wsdl_soap_set_list_param().
-
-       * src/soup-wsdl-runtime/wsdl-soap-marshal.c: A typecode based soap
-       marshaller
-
-       * src/soup-wsdl-runtime/wsdl-param.h: Moved definition of wsdl_param
-       into a common header
-
-       * tests/test-wsdl-runtime.c: Added marshal test
-
-       * src/soup-core/soup-serializer.c (soup_serializer_write_time):
-       Changed name of "time" parameter to not conflict with time(2)
-
-2001-04-25  JP Rosevear  <jpr@ximian.com>
-
-       * soup-config.in (lib_soup): get this script working again and add
-       wsdl
-
-       * Makefile.am: create and install new script
-
-       * configure.in: create variables for script substitution
-
-       * soup_wsdlConf.sh.in: gnome-config script for wsdl compilation
-       info
-
-2001-04-23  Rodrigo Moya <rodrigo@ximian.com>
-
-       * src/soup-wsdl/wsdl-soap-headers.c
-       (wsdl_emit_soap_headers_binding_operation): added
-       "gpointer user_data" parameter to generated functions
-       * src/soup-wsdl/wsdl-soap-stubs.c
-       (wsdl_emit_soap_stubs_binding_operation): ditto &
-       make use of a private structure to be able to pass both
-       the user callback and a custom parameter to SOUP-generated
-       callback
-
-2001-04-23  Dick Porter  <dick@ximian.com>
-
-       * src/soup-wsdl-runtime/wsdl-typecodes-glib.c: Typecode support
-       for the simple glib schema, similar in style to CORBA typecodes.
-       The alignment and size routines are based on the ones in ORBit.
-       
-       * src/soup-wsdl-runtime/wsdl-soap-parse.c: A parser that walks an
-       XML document, and writes values into memory locations provided
-
-       * tests/test-wsdl-runtime.c: Test the typecode support and parser
-       
-       * src/soup-wsdl/wsdl-soap-stubs.c (wsdl_emit_soap_stubs_params):
-       Write a list of parameter to typecode bindings for the soap
-       document parser
-
-       * src/soup-wsdl/wsdl-soap-headers.c: Write extern prototypes for
-       typecode definitions
-
-       * src/soup-wsdl/wsdl-soap-common.c: Write typecode definitions
-       into a common code file
-
-       * src/Makefile.am: Build new soup-wsdl-runtime directory before
-       soup-wsdl
-
-       * configure.in: Added test to discover alignments
-
-       * acconfig.h: Added defines for alignments
-
-2001-04-23  Alex Graveley  <alex@ximian.com>
-
-       * src/soup-core/soup-socket.h: SoupSocketConnectFn no longer takes
-       a SoupAddress argument, as it can be fetched from the SoupSocket
-       correctly now.
-
-       * src/soup-core/soup-socket.c: lots of rewrites. Cache existing
-       SoupAddresses to avoid duplicate lookups. Handles multiple
-       simultaneous requests for the same address. Add syncronous
-       versions of calls which just run the main loop until completion or
-       request. Make SoupContext use a SoupAddress instead of sockaddr.
-
-       * src/soup-core/soup-uri.h: Add query_elems to SoupUri. Contains a
-       list of query string elements, as delimited by a
-       '&'. SoupUri.protocol is now a SoupProtocol. 
-
-       * src/soup-core/soup-uri.c (soup_uri_new): convert uri_string
-       protocol to SoupProtocol equivalent.
-
-       * src/soup-core/soup-private.h: remove protocol from
-       SoupContext. Use a SoupAddress instead of a sockaddr in SoupSocket.
-
-       * src/soup-core/soup-misc.c (soup_load_config_internal): kill
-       tiny (8 byte) mem leak.
-
-       * src/soup-core/soup-message.h: add SoupOwnership
-       SOUP_BUFFER_STATIC. 
-       add SoupErrorCode SOUP_ERROR_CANT_AUTHENTICATE. 
-
-       * src/soup-core/soup-context.h: move SoupProtocol to soup-uri.h.
-
-       * src/soup-core/soup-context.c (soup_context_new):
-       removed. Protocol is now held only in uri.
-       (soup_context_from_uri): added.
-       (soup_context_get): just calls soup_context_from_uri() after
-       creating uri.
-       (soup_context_unref): don't evaluate a post-decremented refcount.
-       (soup_context_connect_cb): no longer take a SoupAddress arg.
-       (soup_context_get_protocol): removed, use uri.
-
-       * src/soup-core/soup-apache.c (soup_apache_message_create): use
-       SOUP_BUFFER_STATIC for request buffer.
-
-       * src/soup-core/md5-utils.c: initial commit. MD5 encryption.
-
-       * src/soup-core/soup-digest.c: initial commit. no worky.
-
-       * src/soup-core/Makefile.am (libsoup_la_SOURCES): add md5-utils.h,
-       md5-utils.c, soup-digest.h, soup-digest.c.
-
-       * tests/stress-test.c (main): handle ugly refcount bug causing
-       extra unrefs of the context.
-
-2001-04-18  Alex Graveley  <alex@ximian.com>
-
-       * src/soup-core/soup-server.h: Added SoupServerBasicToken,
-       SoupServerDigestToken, SoupServerAnonymousToken structs, all with
-       a SoupServerAuthType as the first element. Added
-       SoupServerAuthToken which is a union of all three auth types.
-
-       * src/soup-core/soup-server.c (soup_server_register_full):
-       Added. Accept method authentication callback and allowed auth types.
-
-       * src/soup-core/soup-apache.c (soup_apache_handler): Use a
-       SoupServerAuthToken. Log to apache only in error conditions.
-
-       * src/soup-core/soup-server.c (soup_server_authorize): Accept a
-       SoupServerAuthToken instead of username/pass/realm.
-
-2001-04-04  Rodrigo Moya <rodrigo@ximian.com>
-
-       * src/soup-wsdl/wsdl-soap-stubs.c (wsdl_emit_soap_stubs):
-       #include <soup/soup-*> and not soup-*
-       * src/soup-wsdl/wsdl-soap-headers.c (wsdl_emit_soap_headers):
-       #include <soup/soup-message.h> and not soup-message.h, to match
-       with the output given by `gnome-config --cflags soup`
-
-2001-03-30  Dick Porter  <dick@ximian.com>
-
-       * src/soup-wsdl/wsdl-types-glib.c,
-       src/soup-wsdl/wsdl-soap-headers.c,
-       src/soup-wsdl/wsdl-soap-stubs.c: Rewrote much of the glib schema
-       code to handle structs with child structs, and lists.
-
-       * src/soup-wsdl/wsdl-thread.c (wsdl_thread_soap_parts): treat
-       message part "type" and "element" attributes as the same.
-       (wsdl_thread_soap_binding_operation): insist that soap:body elements
-       exist in operations.
-
-       * src/soup-wsdl/wsdl-parse.c (wsdl_parse_types): Moved more glib
-       schema logic to wsdl-types-glib.c
-
-       * src/soup-wsdl/wsdl-locate.c: Removed the glib schema locate
-       functions.
-
-       * src/soup-wsdl/wsdl-describe.c: Removed most of the glib schema
-       describe functions
-
-       * src/soup-wsdl/main.c: const-ified option string pointers.
-       (main): Call glib schema init helper functions. Moved "show doc"
-       option handler out of wsdl-parse.c to here.
-
-       * src/soup-core/soup-private.h, src/soup-core/soup-queue.c: fixed
-       prototype for soup_queue_shutdown to avoid warning
-
-       * configure.in: Went wild with gcc warning options, found
-       surprisingly few problems.
-
-2001-03-29  Rodrigo Moya <rodrigo@ximian.com>
-
-       * configure.in: add CFLAGS to apxs parameters, to output the
-       correct compilation flags
-
-2001-03-21  Alex Graveley  <alex@ximian.com>
-
-       * src/soup-core/soup-socks.c: remove hack to look at internals of
-       GNET by using the new forked GNET :)
-
-       * tests/stress-test.c: use soup_message_queue ().
-
-       * tests/simple-test.c: use soup_message_queue ().
-
-       * src/soup-core/soup-private.h: Added SoupAddress and SoupSocket.
-
-       * src/soup-core/soup-misc.c (soup_shutdown): Added, just calls
-       soup_queue_shutdown.
-
-       * src/soup-core/soup-queue.h: Removed. Added to soup-message.h.
-
-       * src/soup-core/soup-queue.c (soup_queue_message): rename to
-       (soup_message_queue): this.
-
-       * src/soup-core/soup-message.h: move SoupErrorCode,
-       SoupCallbackFn, and soup_message_queue() here.
-
-       * src/soup-core/soup-message.c (soup_message_free): Free
-       msg->response if buffer is system owned.
-       (soup_message_issue_callback): set msg->priv->errorcode so
-       syncronous soup_message_send can check for completion.
-       (soup_message_send): Added: Synchronous message send. Queues the
-       message as per usual, then call g_main_iteration() until them
-       essage returns.
-
-       * src/soup-core/soup-context.c: API Document. Switch gnet calls to
-       their soup-socket replacement.
-       (soup_context_get_connection): Remove environment check for
-       syncronous connect method. 
-
-       * src/soup-core/Makefile.am (INCLUDES): replace GNET_CFLAGS with
-       GLIB_CFLAGS.
-       (libsoup_la_LIBADD): replace GNET_LIBS with GLIB_LIBS.
-       (soupinclude_HEADERS): Remove soup-queue.h. Add soup-socket.h.
-       (libsoup_la_SOURCES): Add soup-socket.c.
-
-       * soup.spec.in (Requires): remove GNET. Add libxml.
-
-       * soup.pc.in (Libs): remove GNET.
-       (Cflags): ditto.
-
-       * soup-config.in (depend_libs): remove GNET.
-       (depend_cflags): ditto.
-
-       * configure.in: remove gnet references, look for libnsl and
-       libresolv, add checking to determine gethostbyname_r possibility.
-
-       * acconfig.h: Add undefs for all the gethostbyname_r variants.
-
-       * src/soup-core/soup-socket.[ch]: Fork of GNET, minus synchronous
-       bits. Removes dependency on GNET; we now only rely on Glib and
-       libXml.
-
-2001-03-20  Dick Porter  <dick@ximian.com>
-
-       * src/soup-wsdl/wsdl-types-glib.c: Parse a simple glib schema.
-
-       Handle describe and free operations on the glib schema structures
-       here too.
-
-       * src/soup-wsdl/wsdl-thread.c (wsdl_thread_soap_parts): Locate
-       references to types defined in the glib schema.
-
-       * src/soup-wsdl/wsdl-soap-stubs.c: Handle references to types
-       defined in the glib schema.
-
-       Handle output operation parameters.
-       
-       * src/soup-wsdl/wsdl-soap-headers.c: Emit typedefs for glib schema
-       elements and structs.
-
-       Handle output operation parameters.
-       
-       * src/soup-wsdl/wsdl-parse.c: (wsdl_parse_types): Parse glib schemas
-
-       (wsdl_parse_warning): (wsdl_parse_error): (wsdl_parse_fatal): Made
-       non-static, so that glib schema parsing can be separated.
-
-       All attributes called "xmlns" or "xmlns:..." are ignored by the
-       WSDL part of the XML parser.
-
-       All g_slist_prepend()s have been turned into g_slist_append()s, to
-       keep operation arguments in the expected order.
-       
-       * src/soup-wsdl/wsdl-memory.c (wsdl_free_types): Free glib type
-       schemas
-
-       * src/soup-wsdl/wsdl-locate.c: New functions to look up glib
-       schema element or struct definitions
-
-       * src/soup-wsdl/wsdl-describe.c (indent): Made non-static, so that
-       glib type describing can be separated.
-       (wsdl_describe_types): Describe glib type schemas
-
-2001-03-17  Dick Porter  <dick@ximian.com>
-
-       * src/soup-wsdl/wsdl-thread.c: Thread WSDL structures together.
-
-       * src/soup-wsdl/wsdl-soap-stubs.c: 
-       * src/soup-wsdl/wsdl-soap-headers.h: Most of the element matching
-       has been moved in the new threading routings.
-
-       * src/soup-wsdl/wsdl-parse.h: WSDL elements have extra pointers to
-       thread structures together.
-
-       * src/soup-wsdl/wsdl-memory.c: Free GSLists. WSDL elements have
-       extra pointers to thread structures together, and some of these
-       are GSLists that need freeing too.
-
-       * src/soup-wsdl/wsdl-locate.c: Some more lookup functions.
-
-       * src/soup-wsdl/main.c (main): Call the WSDL element threader, and
-       only proceed to write files if it succeeds.
-
-2001-03-15  JP Rosevear  <jpr@ximian.com>
-
-       * src/soup-core/soup-apache.c (soup_apache_message_create): use
-       the HTTP_OK macro for the response code rather than hard coding
-       200
-       (soup_apache_handler): return should be OK or !OK rather than the
-       http response code value (ie 200)
-
-       * src/soup-core/soup-serializer.c (soup_serializer_reset): Make a
-       blank doc when resetting
-
-2001-03-14  JP Rosevear  <jpr@ximian.com>
-
-       * src/soup-core/soup-apache.c (soup_apache_read_request): oops,
-       deleted too much
-
-2001-03-14  Dick Porter  <dick@ximian.com>
-
-       * src/soup-wsdl/wsdl-parse.h: Support for simple glib types
-
-       * src/soup-wsdl/wsdl-parse.c (wsdl_attrnscmp): Check the namespace
-       prefix of a string.
-       (wsdl_parse_types): Add a placeholder for parsing glib schemas
-       (wsdl_parse_message): Add support for simple glib types in part
-       elements
-
-       * src/soup-wsdl/wsdl-describe.c (wsdl_describe_message_part): Show
-       glib types, if appropriate
-
-2001-03-13  JP Rosevear  <jpr@ximian.com>
-
-       * src/soup-core/soup-queue.c (soup_get_request_header): don't
-       escape the SoapAction header, this makes things work on the server
-       side but need to check if this breaks the spec
-
-       * src/soup-core/soup-message.c (soup_message_free): don't try to
-       free the request body twice
-
-       * src/soup-core/soup-apache.c (soup_apache_message_create): The
-       buffer is user owned. Use ap_contruct_url since the uri function
-       did not include happy things like hostname - will this get the
-       password properly though?
-       (soup_apache_read_request): don't adjust read_left twice
-       (soup_apache_handler): log some stuff to the apache log
-
-2001-03-13  JP Rosevear  <jpr@ximian.com>
-
-       * configure.in: don't chmod the files.  soup-config become
-       executable on install by bin_SCRIPTS and *Conf.sh never need to be
-       executable, fix my apache cflags blunder
-
-2001-03-12  Alex Graveley  <alex@ximian.com>
-
-       * src/soup-core/soup-server.c (soup_server_get_handler): avoid
-       leading and trailing quotes. If an exact match is not found,
-       lookup based only on methodname not uri#methodnmae.
-
-       * src/soup-core/soup-apache.c (soup_apache_handler): compile
-       without warnings.
-
-       * configure.in (AC_OUTPUT): chmod +x soup_apacheConf.sh
-
-2001-03-09  Alex Graveley  <alex@ximian.com>
-
-       * src/soup-wsdl/wsdl-parse.c (wsdl_parse): set definitions = NULL
-       to pass -Werror.
-
-2001-03-09  Alex Graveley  <alex@ximian.com>
-
-       * tests/simple-test.c (main): demonstrate correct behavior here by
-       unref'ing the context after message creation.
-
-       * tests/stress-test.c (main): ditto.
-
-       * src/soup-core/soup-queue.c (soup_queue_message): set
-       req->priv->recv_buf = NULL here, as the media continues to barrate
-       dangling pointers.
-
-       * src/soup-core/soup-server.h: make SoupServerAuthorizeFn typedef
-       const correct
-
-       * src/soup-core/soup-server.c (soup_server_authorize): make const
-       correct.
-
-       * src/soup-core/soup-message.c (soup_message_cleanup): don't free
-       response phrase. Don't set req->priv->recv_buf = NULL here, as
-       leaking memory continues to be considered "bad".
-
-       * src/soup-core/soup-headers.c (soup_headers_parse_response):
-       don't alloc status_phrase, just point into buffer.
-
-       * src/soup-core/soup-cgi.c (soup_cgi_read_cb): deal with response
-       phrase now being const.
-
-       * src/soup-core/soup-apache.c (soup_apache_message_create): action
-       is already strdup'd in soup_message_new (). response_phrase
-       is now a const string. Remove unneeded content-type header.
-       (soup_apache_read_request): slight reorg, also use ap_palloc()
-       instead of ap_calloc().
-       (soup_apache_handler): initial authentication handling, only basic
-       auth at this point.
-
-2001-03-09  Dick Porter  <dick@ximian.com>
-
-       * src/soup-wsdl/wsdl-parse.h: Each WSDL struct has a pointer into
-       the XML tree document
-
-       * src/soup-wsdl/wsdl-parse.c (wsdl_qnamecmp): A function for
-       comparing element names and namespaces.
-
-       Use wsdl_qnamecmp instead of strcmp to make parsing
-       namespace-aware.
-       
-       (wsdl_end_element): Maintain a pointer into the XML tree for each
-       WSDL node.
-
-       * src/soup-wsdl/wsdl-memory.c (wsdl_free_definitions): Free the
-       XML document
-
-       * src/soup-wsdl/main.c (main): Move the xml doc dump to here, for
-       better modularity
-
-2001-03-08  Alex Graveley  <alex@ximian.com>
-
-       * src/soup-core/soup-ssl.c (soup_ssl_get_iochannel): after failing
-       an explicit path execution, use execlp (instead of execl) to
-       search the path for soup-ssl-proxy.
-
-       * configure.in: set the default openssl library prefix to /usr/lib
-       to fix weird linking problems when compiling with both openssl and
-       nss.
-
-2001-03-08  JP Rosevear  <jpr@ximian.com>
-
-       * configure.in: send the apache info to the config script
-
-       * src/soup-core/soup-apache.c (soup_apache_handler): upon further
-       reading, content_type is for the outgoing document
-       (soup_apache_read_request): if ap_should_client_block != 0 we
-       want to keep going
-
-2001-03-08  JP Rosevear  <jpr@ximian.com>
-
-       * soup_apacheConf.sh.in: script to provide soup-apache config info
-       through gnome-config
-
-       * Makefile.am: subst in the soup_apache config script
-
-       * configure.in: create vars for soup-apache config foo
-
-       * src/soup-core/soup-apache.c (soup_apache_handler): check for
-       null because content type can be null
-
-2001-03-07  JP Rosevear  <jpr@ximian.com>
-
-       * src/soup-core/soup-server.h: soup_server_init should be an
-       extern function
-
-2001-03-07  Alex Graveley  <alex@ximian.com>
-
-       * src/soup-core/soup-server.c (soup_server_set_global_auth): add
-       allowable authentication types mask.
-       (soup_server_set_method_auth): ditto. NOTE: This server auth stuff
-       may be removed altogether, so don't rely on it.
-
-       * src/soup-core/soup-server.h: added SoupServerAuthType, a mask of
-       allowable authentication types. Make soup_server_init an extern
-       declaration instead of a function pointer.
-
-       * src/soup-core/soup-apache.c (soup_apache_read_request): move
-       chunked data checking to here from soup_apache_handler.
-
-2001-03-07  JP Rosevear  <jpr@ximian.com>
-
-       * soupConf.sh.in: use configure.in vars for subst
-
-       * configure.in: create variables for config script
-
-       * Makefile.am: generate the soupConf.sh script in the makefile for
-       proper substitution
-
-2001-03-07  Alex Graveley  <alex@ximian.com>
-
-       * src/soup-core/soup-cgi.c: created. moved cgi-related request
-       processing here. do not use it. completely broken.
-
-       * src/soup-core/soup-apache.c: initial commit of Apache module
-       handling, server registration should be performed in a
-       soup_server_init function. Authorization handling still needs to
-       be written.
-
-       * src/soup-core/soup-server.c: cleaned up to have only generic
-       server functions. removed extraneous unregister functions.
-       (soup_server_set_global_auth): set the global server authorize
-       function, to be called in the absence of a method-specific
-       authorize function.
-       (soup_server_set_method_auth): set per-method authorize function.
-
-       * src/soup-core/soup-queue.c (soup_parse_headers): remove unneeded
-       variables.
-
-       * src/soup-core/soup-private.h: add SoupServerHandler,
-       soup_server_get_handler(), and soup_server_authorize().
-
-       * src/soup-wsdl/Makefile.am (INCLUDES): add WSDL_CFLAGS, to get
-       -Werror.
-
-       * src/soup-core/Makefile.am: add new libsoup-apache.so target.
-
-       * soup.spec.in: update and remove hardcoded library version.
-
-       * soup-config.in: add module soup-apache.
-
-       * configure.in: Fix library versioning. Switch version to
-       0.2.1. Add APACHE_CFLAGS and APACHE_LIBS, gotten from running
-       `apxs`. Remove -Werror from CFLAGS, as apache_conf.h is missing a
-       prototype. Add WSDL_CFLAGS="-Werror" back.
-
-       * TODO (TODO): Updated.
-
-2001-03-06  JP Rosevear  <jpr@ximian.com>
-
-       * configure.in: properly version the project and give an option to
-       disable more warnings
-
-2001-03-02  Alex Graveley  <alex@ximian.com>
-
-       * src/soup-wsdl/Makefile.am (INCLUDES): Remove WSDL_CFLAGS.
-
-       * tests/simple-test.c (current_temp_cb): handle SOUP_ERROR_HANDLER
-       so we pass -Werror.
-
-       * tests/stress-test.c (current_temp_cb): handle SOUP_ERROR_HANDLER
-       so we pass -Werror.
-
-       * configure.in: remove some excess version-related cruft. Display
-       a Configuration list on completion. Add -Werror. Remove WSDL_CFLAGS.
-
-2001-03-02  Alex Graveley  <alex@ximian.com>
-
-       * src/soup-core/gionspr.c: remove, as this is not used.
-
-2001-03-02  Alex Graveley  <alex@ximian.com>
-
-       * configure.in: remove gmodule dependency. Fix OPENSSL_LIBS and
-       NSS_LIBS to include the library name and not only the path.
-
-       * src/soup-core/soup-ssl-proxy.c (soup_ssl_proxy_init): remove
-       call to g_module_supported().
-
-       * src/soup-core/soup-nss.c: remove GModule NSS loading,
-       link conventionally instead.
-
-       * src/soup-core/soup-openssl.c: remove GModule OpenSSL loading,
-       link conventionally instead.
-
-2001-03-02  Alex Graveley  <alex@ximian.com>
-
-       * src/soup-core/soup-ssl-proxy.c: oops. should have been added
-       yesterday.
-       
-2001-03-02  Alex Graveley  <alex@ximian.com>
-
-       * tests/stress-test.c (main): exit nicely if no test URL is supplied.
-
-       * tests/simple-test.c (main): use http://www.ximian.com is no test
-       URL is supplied.
-
-       * tests/Makefile.am (INCLUDES): include glib headers.
-
-       * src/soup-wsdl/Makefile.am (INCLUDES): include glib, popt, and
-       libxml headers.
-       (soup_wsdl_LDADD): explicitly add glib, popt, libxml deps.
-
-       * src/soup-core/Makefile.am (INCLUDES): include gnet, libxml,
-       openssl, and nss headers.
-       (libsoup_la_LIBADD): explicitly add gnet, libxml deps.
-       (soup_ssl_proxy_LDADD): explicitly add glib, nss and openssl deps.
-
-       * soup.spec.in: remove OpenSSL advertising clause.
-
-       * soupConf.sh.in: list out dependencies (gnet, libxml).
-
-       * soup.pc.in: list out dependencies (gnet, libxml).
-
-       * soup-config.in: list out dependencies (gnet, libxml).
-
-       * configure.in: Cleanups to remove unnecessary dependencies.
-
-2001-02-28  Alex Graveley  <alex@ximian.com>
-
-       * src/soup-core/soup-ssl.c (soup_ssl_idle_waitpid): glib idle
-       callback which calls waitpid (nonblockingously) on all the
-       soup-ssl-proxy children to make sure their resources are freed.
-       (soup_ssl_get_iochannel): execute soup-ssl-proxy, setting up STDIN
-       and STDOUT to point to the fd we will return a GIOChannel for,
-       also passing the security policy and the destination socket fd
-       number in the environments SECURITY_POLICY and SOCKFD,
-       respectively.
-
-       * src/soup-core/soup-ssl-proxy.c: Created. This is a small SSL
-       proxy executable, licensed GPL, which allows us to use OpenSSL and
-       NSS without requiring applications which link with libsoup to have
-       to comply with the licenses of those SSL libraries.
-
-       * src/soup-core/soup-server.c (soup_server_register): add handler
-       to list.
-
-       * src/soup-core/soup-queue.c (soup_queue_write_async): ignore
-       SIGPIPE and handle errno.
-
-       * src/soup-core/soup-misc.c (soup_set_security_policy): move from
-       soup-ssl.c.
-       (soup_get_security_policy): add.
-
-       * src/soup-core/soup-context.c (soup_connection_get_iochannel):
-       setup TCP socket before getting an SSL wrapper channel.
-
-       * src/soup-core/Makefile.am (INCLUDES): add -DBINDIR
-       (libsoup_la_SOURCES): remove ssl backends
-       (soup_ssl_proxy_SOURCES): create soup-ssl-proxy
-
-       * src/soup-core/.cvsignore: add soup-ssl-proxy
-
-2001-02-28  Dick Porter  <dick@ximian.com>
-
-       * src/soup-wsdl/wsdl-trace.[ch]: New file of better debugging routines.
-
-       * src/soup-wsdl/wsdl-soap-stubs.[ch]: New file that emits C code
-       for client stubs.
-
-       * src/soup-wsdl/wsdl-soap-skels.[ch]: New file that will emit C
-       code for server skeleton functions.
-
-       * src/soup-wsdl/wsdl-soap-headers.[ch]: New file that emits
-       structure definitions and function prototypes for stubs and skels
-
-       * src/soup-wsdl/wsdl-soap-common.[ch]: New file that will emit C
-       code for functions common to stubs and skels.
-
-       * src/soup-wsdl/wsdl-memory.[ch]: New file of routines to
-       recursively free WSDL structures.
-
-       * src/soup-wsdl/wsdl-locate.[ch]: New file of routines to look up
-       WSDL structures given a name and a parent structure.
-
-       * src/soup-wsdl/wsdl-describe.[ch]: New file of structure printing
-       routines.
-
-       * src/soup-wsdl/wsdl.h: Deleted the debug logging stuff, added a
-       much better version in wsdl-trace.[ch]
-
-       * src/soup-wsdl/wsdl-parse.h: Structures moved here from
-       wsdl-parse.c. Added all of the SOAP extensions.
-
-       * src/soup-wsdl/wsdl-parse.c: Added the rest of the SOAP
-       extensions. Moved some of the parser internal struct definitions
-       into wsdl-parse.h.
-       Moved the structure printing routines into their own file.
-       (wsdl_get_location): Made the error reporting slightly more useful
-       (wsdl_parse_porttype_operation): Tell the difference between a
-       request-response operation and a solicit-response operation.
-       (wsdl_parse_xml): Combine tree and SAX parsing styles, so I can
-       build an xmlDocPtr tree, yet still fill in the WSDL structures as
-       the XML is being read.
-       (wsdl_parse): Set up the SAX parser so it calls the internal
-       libxml tree building routines, except for those elements that I
-       use to build WSDL structures. These elements must call the
-       corresponding xmlDefaultSAXHandler functions themselves.
-
-       * src/soup-wsdl/main.c: Added options for code generation
-       (main): Call code generation routines
-
-       * src/soup-wsdl/Makefile.am: Added a lot of new files
-       
-       * configure.in: Add -Werror to the WSDL CFLAGS
-
-2001-02-20  Alex Graveley  <alex@ximian.com>
-
-       * src/soup-core/Makefile.am (libsoup_la_LDFLAGS): remove -release
-       tag so libsoup is named libsoup.so.0.1.9 not libsoup-0.1.9.so.0.0.0
-
-       * soupConf.sh.in (SOUP_INCLUDEDIR): use $CPPFLAGS instead of $CFLAGS.
-
-       * soup-config.in (depend_cflags): use $CPPFLAGS instead of $CFLAGS.
-
-       * configure.in: Clean up to use $CPPFLAGS instead of $CFLAGS for
-       storing glib, gnet, libxml, openssl, nspr, and nss header
-       locations. 
-
-2001-02-20  Alex Graveley  <alex@ximian.com>
-
-       * configure.in: cleaned up to no longer link with an SSL
-       library. Added options --with-nspr-includes, --with-nspr-libs,
-       --with-nss-includes, --with-nss-libs, --with-openssl-includes, and
-       --with-openssl-libs.
-
-       * src/soup-core/Makefile.am (libsoup_la_SOURCES): Add
-       soup-nss.[ch], and soup-openssl.[ch].
+       * libsoup/Makefile.am: Rename library to libsoup-2.0, put includes
+       in ${includedir}/soup-2.0
        
-       * src/soup-core/soup-openssl.c: Added. Move existing OpenSSL code
-       here. Convert to using GModule to load the shared library at runtime.
-
-       * src/soup-core/soup-nss.c: Added. Initial implementation of NSS
-       SSL support. Uses GModule to perform runtime loading. Needs
-       serious testing.
-
-       * src/soup-core/soup-ssl.c (soup_set_security_policy): Sets the
-       underlying SSL library's policy wrt allowed ciphers. Valid options
-       are DOMESTIC, EXPORT, and FRANCE, though these may change as
-       domestic and export are confusing terms.
-       (soup_ssl_init): Now simply chains SSL library initialization until
-       one is loaded successfully. Attempts to start NSS then OpenSSL, then
-       simply fails gracefully for future SSL connections.
-       (soup_ssl_get_iochannel): dispatch to the underlying SSL library
-       in use, or return NULL if none are available.
-
-       * src/soup-core/soup-misc.c (soup_load_config_internal): Converted
-       to use generic config file option table.
-       (soup_config_connection_limit): Added. Set the connection limit
-       given a "connection-limit" config file option.
-       (soup_config_proxy_uri): Added. Set the proxy uri given a
-       "proxy-uri" or "proxy-url" config file option.
-       (soup_config_security_policy): Added. Allows setting the SSL security
-       policy from the config file.
-
-2001-02-16  Alex Graveley  <alex@ximian.com>
-
-       * tests/Makefile.am: clear out some unneccassry cruft as currently
-       all tests link against libsoup.
-
-       * src/soup-wsdl/Makefile.am (soup_wsdl_SOURCES): add wsdl.h.
-
-       * src/soup-core/Makefile.am (libsoup_la_SOURCES): add
-       soup-headers.h, soup-private.h, soup-socks.h, and soup-ssl.h to
-       pass distcheck.
-
-2001-02-15  Alex Graveley  <alex@ximian.com>
-
-       * tests/stress-test.c (current_temp_cb): update to return void
-       from the callback.
-       (main): do not requeue existing messages when they have finished,
-       as they will be freed. instead create new SoupMessage objects.
-
-       * tests/simple-test.c (current_temp_cb): update to return void
-       from the callback.
-
-       * src/soup-core/soup-serializer.c (soup_serializer_start_element):
-       support creation of the request's SOAPAction header my taking the
-       namespace uri and name of the first element after starting the
-       body tag.
-
-       * src/soup-core/soup-queue.h: add SOUP_ERROR_HANDLER which will be
-       used by the upcoming handler/interceptor stuff to return an
-       application-level error to the message callback. Make
-       SoupCallbackFn return void.
-
-       * src/soup-core/soup-queue.c (soup_debug_print_headers): make public.
-       (soup_queue_write_async): attempt to write again if the first
-       write was okay and didn't block.
-
-       * src/soup-core/soup-uri.c (soup_debug_print_uri): make public.
-
-       * src/soup-core/soup-message.c (soup_message_issue_callback):
-       message callback now returns void, meaning that soup_queue_message()
-       takes ownership of the message and always frees it after calling
-       the callback (unless it was requeued from within the callback).
-
-       * src/soup-core/soup-headers.c (soup_headers_parse_request):
-       renamed from soup_parse_request_headers.
-       (soup_headers_parse_response): renamed from soup_parse_response_headers.
-       (soup_headers_parse): renamed from soup_parse_headers.
-
-2001-02-13  Alex Graveley  <alex@ximian.com>
-
-       * src/soup-core/soup-ssl.c (soup_get_ssl_iochannel): renamed to
-       soup_ssl_get_iochannel.
-
-2001-02-13  Alex Graveley  <alex@ximian.com>
-
-       * src/soup-core/soup-ssl.c (soup_ssl_add_watch): work around fact
-       that data available in the socket does not always mean unencrypted
-       data is available for reading.
-       (soup_ssl_read_cb): called on socket data available. Only call the
-       real callback if SSL_pending() returns > 0 meaning there is actual
-       data to read. there is a bug here as SSL_pending() always returns
-       false, so its commented out.
-
-       * src/soup-core/soup-queue.c (soup_queue_connect): add explicit
-       check for SOCKS protocol, remove call to soup_setup_socket.
-
-       * src/soup-core/soup-context.c (soup_connection_get_iochannel):
-       add channel member to SoupConnection, and serve it up for future
-       requests.
-
-       * src/soup-core/soup-queue.c (soup_setup_socket): removed.
-       (soup_get_request_header): change default Content-Type to 
-       "text/xml; charset=utf-8".
-
-       * src/soup-core/soup-context.c (soup_connection_setup_socket):
-       moved soup-queue.c:soup_setup_socket() to here. 
-
-2001-02-12  alex  <alex@ximian.com>
-
-       * src/soup-core/soup-server.[ch]: Initial revision of server side 
-         request handling dispatcher.
-
-2001-02-11  alex  <alex@ximian.com>
-
-       * TODO: add items left before a release.
-
-       * soup-queue.c: change default Content-Type to "text/xml" from
-         "text/xml\r\n\tcharset=\"utf-8\"".
-
-       * soup-serializer.[ch]: added soup_serializer_new_full which
-         removes unnecessary args to soup_serializer_start_envelope. 
-         rearrange namespace args to soup_serializer_start_element to match 
-         other methods. added soup_serializer_set_type to set the xsi:type,
-         and soup_serializer_set_null to set xsi:null="1".
-
-2001-02-06  alex  <alex@ximian.com>
-
-       * soup-config.in: remove some cruft.
-
-       * soupConf.sh.in: remove some cruft.
-
-       * src/soup-core/Makefile.am: build soup-headers.c
-
-       * src/soup-core/soup-headers.[ch]: created. refactor of header parsing
-         logic for use in requests and responses.
-
-       * src/soup-core/soup-message.c: free req->response_phrase as it is now 
-         allocated.
-
-       * src/soup-core/soup-queue.c (soup_parse_headers): use 
-         soup_parse_response_headers. (soup_queue_reqest): free 
-         req->response_phrase.
-
-       * src/soup-core/soup-serializer.h: include <time.h>
-
-2001-01-31  Jeffrey Stedfast  <fejj@ximian.com>
-
-       * src/soup-core/gionspr.c: Implemented (probably somewhat broken).
-
-2001-01-25  Rodrigo Moya <rodrigo@ximian.com>
-
-       * soup-config.in: replaced @glib_cflags@ and @glib_libs@ with
-       @GLIB_CFLAGS@ and @GLIB_LIBS@. Added -I@includedir@/soup to
-       $cflags
-
-2001-01-23  alex  <alex@ximian.com>
-
-       * ChangeLog: Created from rcs2log.
-
-       * AUTHORS: Added Dick Porter.
-
-       * soup.pc.in, soup-config.in, soupConf.sh, soup.m4:
-       Created with a dash of Maintainer Love.
-
-       * soup.spec.in: RPM spec file. Needs fixing wrt to displaying the
-       OpenSSL license conditionally (if it was statically linked).
-
-       * Makefile.am: Updated to install new config scripts and macros.
-
-       * configure.in: add --enable-ssl, --with-ssl=[nss/openssl/none],
-       and --with-nss-prefix=PFX to support choosing of an SSL library to
-       use, even though openssl is the only one currently supported.
-
-       * src/soup-core/Makefile.am: don't install soup-ssl.h or
-       soup-socks.h, they're internal.
-
-       * src/soup-core/soup-ssl.c: wrap openssl calls with a conditional
-       to avoid building if --enable-ssl=no or NSS is chosen as the
-       library. soup_get_ssl_iochannel() will print "SSL Not Supported."
-       and return NULL if no library has been chosen.
-
-       * tests/stress-test.c: make the callback handle errors by
-       requeuing request and not just g_error'ing.
-
-2001-01-23  alex  <alex@ximian.com>
-
-       * soup-context.c (soup_context_get_connection): check environment
-       for SOUP_NO_ASYNC_CONNECT, and if set use syncronous name lookup
-       and connect. Use this when debugging.
-
-       * soup-queue.c (soup_read_chunk): fix buffer overflow.
-
-       * soup-queue.c (soup_queue_read_async): set header_len to include
-       trailing \r\n\r\n as this makes more sense.
-
-       * soup-serializer.[ch] (soup_serializer_get_xml_doc): allows
-       getting at the serializer's internal xml tree.
-
-       * soup.h: install soup-serializer.h.
-
-2001-01-21  alex  <alex@ximian.com>
-
-       * /cvs/helixcode/services/soup/src/soup-wsdl/Makefile.am,
-       /cvs/helixcode/services/soup/tests/Makefile.am,
-       /cvs/helixcode/services/soup/configure.in,
-       /cvs/helixcode/services/soup/src/Makefile.am: Update Makefile.ams
-       and configure.in to work with new layout.
-
-       * /cvs/helixcode/services/soup/src/soup.h,
-       /cvs/helixcode/services/soup/src/soup-socks.h,
-       /cvs/helixcode/services/soup/src/soup-ssl.c,
-       /cvs/helixcode/services/soup/src/soup-ssl.h,
-       /cvs/helixcode/services/soup/src/soup-uri.c,
-       /cvs/helixcode/services/soup/src/soup-uri.h,
-       /cvs/helixcode/services/soup/src/soup-context.c,
-       /cvs/helixcode/services/soup/src/soup-context.h,
-       /cvs/helixcode/services/soup/src/soup-message.c,
-       /cvs/helixcode/services/soup/src/soup-message.h,
-       /cvs/helixcode/services/soup/src/soup-misc.c,
-       /cvs/helixcode/services/soup/src/soup-misc.h,
-       /cvs/helixcode/services/soup/src/soup-private.h,
-       /cvs/helixcode/services/soup/src/soup-queue.c,
-       /cvs/helixcode/services/soup/src/soup-queue.h,
-       /cvs/helixcode/services/soup/src/soup-serializer.c,
-       /cvs/helixcode/services/soup/src/soup-serializer.h,
-       /cvs/helixcode/services/soup/src/soup-socks.c: Adding Dick's wsdl
-       compiler to the soup package, to src/soup-wsdl. Moving existing
-       soup stuff to src/soup-core.
-
-2001-01-19  dick  <dick@ximian.com>
-
-       * /cvs/helixcode/services/soup/src/soup-wsdl/main.c,
-       /cvs/helixcode/services/soup/src/soup-wsdl/Makefile.am,
-       /cvs/helixcode/services/soup/src/soup-wsdl/wsdl.h,
-       /cvs/helixcode/services/soup/src/soup-wsdl/wsdl-parse.c,
-       /cvs/helixcode/services/soup/src/soup-wsdl/wsdl-parse.h,
-       /cvs/helixcode/services/soup/tests/stockquote2.wsdl,
-       /cvs/helixcode/services/soup/tests/stockquote.wsdl: First part of
-       the WSDL compiler.
-
-       The parser accepts an XML file in WSDL syntax. Some syntax
-       checking is done, but there is no consistency checking yet.
-
-       User-specified types are not yet supported.
-
-2001-01-17  alex  <alex@ximian.com>
-
-       * src/soup-serializer.c (soup_serializer_start_element): handle
-       cases where users want to be lazy and supply a namespace prefix
-       but not a uri (i.e. broken xml).
-
-       * src/soup-misc.c (soup_load_config_internal): warn the user if a
-       config file entry is not allowed by system config.
-
-       * src/soup-serializer.[ch]: initial commit of simple serializer
-       API. Uses libxml to handle tree creation.
-
-       * configure.in: check for libxml.
-
-2001-01-15  alex  <alex@ximian.com>
-
-       * src/soup-misc.c: Fix a typo
-
-       * src/soup-misc.c: hacked to support permissions in the global
-       config file on which options can be set from user config
-       files. Global config file is now always loaded first, before
-       either a program specified file or the user's dot-file. Also
-       supports "allow all" and "deny all" which have the expected
-       results.
-
-       * src/soup-ssl.[ch]: move unneeded #include's to the source file.
-
-       * soup-socks.c: Umm, ya. So I was like umm, sleepy last night and
-       stuff. So this umm makes last night's commit a little less
-       embarrassing.
-
-2001-01-14  alex  <alex@ximian.com>
-
-       * src/soup-misc.c: oops, forgot to mention that user local config
-       file (~/.souprc) is now loaded after the system config file. This
-       needs to be thought out more as administrators may not want
-       variables overwritten.
-
-       * src/soup-socks.[ch]: SOCKS version 4 and version 5 support. This
-       code is not very simple because we are attempting to make a
-       multi-step conversation completely asyncronous. Also this includes
-       a hack to get at GNET's GInetAddr private memebers (the
-       sockaddr_in) for SOCKS4, as the client has to lookup the
-       destination host address and send it to the socks proxy, and we
-       want to use gnet to do this asyncronously.
-
-       * src/soup-context.[ch]: Added soup_context_get_protocol(),
-       soup_connection_get_context(), and soup_connection_is_new() so
-       that we can keep the abstractions between the contexts/connections
-       and messages clean. soup_context_get_uri() changed to return a
-       SoupUri instead of a string, as this is more useful. Made
-       SoupProtocol a public enum so it can be returned by
-       soup_context_get_protocol().
-
-       * src/soup-queue.c: updated to use context/connection accessors,
-       instead of looking at private members. AB-STRAC-SHUN!
-
-2001-01-12  alex  <alex@ximian.com>
-
-        * soup-misc.c (soup_load_config): simple config file
-       loading. Passing NULL as the config file name will load from the
-       system config file, which is $(sysconfdir)/souprc. Only options
-       supported now are proxy-url and connection-limit.
-
-       * */.cvsignore: a little maintainer love.
-
-2001-01-11  alex  <alex@ximian.com>
-
-       * soup-queue.c (soup_get_request_header): append a '?' between
-       path and query string in request header. NULL terminate the call
-       to g_strconcat.
-
-       * soup-context.c (soup_context_get): bomb if url passed in does
-       not have a protocol. do not default to HTTP.
-
-2001-01-08  alex  <alex@ximian.com>
-
-       * /cvs/helixcode/services/soup/src/soup-message.c,
-       /cvs/helixcode/services/soup/src/soup-message.h,
-       /cvs/helixcode/services/soup/src/soup-request.c,
-       /cvs/helixcode/services/soup/src/soup-request.h: * Oops. Forget to
-       add new files and remove old ones when I renamed SoupRequest to
-       SoupMessage.
-
-       * /cvs/helixcode/services/soup/src/soup-ssl.c,
-       /cvs/helixcode/services/soup/src/soup-queue.c: * soup-ssl.c
-       (soup_ssl_add_watch): make ssl work. pass the ssl iochannel to the
-       underlying iochannel's funcs->io_add_watch, so that our ssl
-       functions get called. this is a hack. this will need to be fixed
-       in order to get windows portability, as the SoupSSLChannel struct
-       is mimicing GIOUnixChannel so the add_watch will work correctly.
-
-       * soup-queue.c (soup_queue_read_async): fix bug when searching for
-       end of http headers where req->priv->header_len was being set
-       whether the end was found or not.
-
-       * /cvs/helixcode/services/soup/src/Makefile.am,
-        /cvs/helixcode/services/soup/src/soup.h,
-        /cvs/helixcode/services/soup/src/soup-private.h,
-        /cvs/helixcode/services/soup/src/soup-queue.c,
-        /cvs/helixcode/services/soup/src/soup-queue.h,
-        /cvs/helixcode/services/soup/tests/simple-test.c,
-        /cvs/helixcode/services/soup/tests/stress-test.c: * Renamed
-        SoupRequest to SoupMessage, as it contains both the request and
-        the response, changed all API names accordingly. This had to be
-        done, so what better time than now?
-
-       * /cvs/helixcode/services/soup/configure.in,
-       /cvs/helixcode/services/soup/src/Makefile.am,
-       /cvs/helixcode/services/soup/src/soup-context.c,
-       /cvs/helixcode/services/soup/src/soup-context.h,
-       /cvs/helixcode/services/soup/src/soup-private.h,
-       /cvs/helixcode/services/soup/src/soup-queue.c,
-       /cvs/helixcode/services/soup/src/soup-request.c,
-       /cvs/helixcode/services/soup/src/soup-ssl.c,
-       /cvs/helixcode/services/soup/src/soup-ssl.h: * soup-queue.c:
-       chunked encoding support finalized, fixed a few small buffer over
-       allocations, use strcasecmp instead of strcmp when comparing
-       custom request headers, better error handling in
-       soup_queue_error_async which fixes a bug found in certain IIS
-       servers.
-
-       * soup-context.c: (soup_connection_get_iochannel) return iochannel
-       from soup-ssl.c:soup_get_ssl_iochannel() if protocol for
-       connection is SOUP_PROTOCOL_SHTTP.
-
-       * soup-ssl.c: simple GIOChannel wrapper around the OpenSSL
-       library.
-
-2000-12-27  alex  <alex@ximian.com>
-
-       * /cvs/helixcode/services/soup/src/soup-core/soup-private.h,
-       /cvs/helixcode/services/soup/src/soup-core/soup-queue.c,
-       /cvs/helixcode/services/soup/src/soup-private.h,
-       /cvs/helixcode/services/soup/src/soup-queue.c: * soup-private.h:
-       Content length is now a guint.
-
-       * soup-queue.c (soup_parse_headers): Added minimum status-line
-       length check.
-
-       * soup-queue.c (soup_queue_request): Removed g_error() call for
-       user-iwned response buffers. We now just issue a
-       SOUP_ERROR_CANCELLED callback and print a warning.
-
-       * /cvs/helixcode/services/soup/tests/Makefile.am,
-       /cvs/helixcode/services/soup/tests/stress-test.c: * Added
-       tests/stress-test.c which makes 3 simultaneous requests to a url,
-       each repeating 110 times (enough to trigger Apache to kill
-       keep-alive connections), goes to sleep for 20 seconds (long enough
-       for Apache to kill keep-alive connections again) and repeats. It
-       also sets the connection limit to 2.
-
-       * /cvs/helixcode/services/soup/tests/simple-test.c: *
-       SOUP_ERROR_UNKNOWN has been removed. Don't check for it.
-
-2000-12-26  alex  <alex@ximian.com>
-
-       * /cvs/helixcode/services/soup/src/soup-context.c,
-       /cvs/helixcode/services/soup/src/soup-context.h,
-       /cvs/helixcode/services/soup/src/soup-misc.c,
-       /cvs/helixcode/services/soup/src/soup-private.h,
-       /cvs/helixcode/services/soup/src/soup-queue.c,
-       /cvs/helixcode/services/soup/src/soup-queue.h,
-       /cvs/helixcode/services/soup/src/soup-request.c,
-       /cvs/helixcode/services/soup/src/soup-request.h,
-       /cvs/helixcode/services/soup/src/soup-uri.c: * Made SoupConnection
-       wrap Gnet's TcpSocket. This means there are no gnet references in
-       the public interface.
-
-       * Lots of code cleanup/reorg/bugfixes.
-
-2000-12-20  alex  <alex@ximian.com>
-
-       * /cvs/helixcode/services/soup/src/soup-context.c,
-       /cvs/helixcode/services/soup/src/soup-private.h,
-       /cvs/helixcode/services/soup/src/soup-queue.c,
-       /cvs/helixcode/services/soup/src/soup-request.c,
-       /cvs/helixcode/services/soup/src/soup-uri.c,
-       /cvs/helixcode/services/soup/tests/simple-test.c: * Header parsing
-       works according to spec, including multi-line headers.
-
-       * Content-length driven responses work correctly.
-
-       * Chunked encoding almost working :)
-
-       * Updated simple-test to take a url from the command line.
-
-2000-12-13  alex  <alex@ximian.com>
-
-       * /cvs/helixcode/services/soup/src/soup-core/soup-uri.c,
-       /cvs/helixcode/services/soup/src/soup-uri.c: * soup-uri.c
-       (soup_uri_new): Forgot to set the path for cases where we don't
-       have a querystring (which is most of the time). Doh.
-
-       * soup-uri.c (soup_uri_get_default_port): No such thing as an
-       smtp://foo@bar uri, only mailto:foo@bar.
-
-       * /cvs/helixcode/services/soup/tests/Makefile.am,
-       /cvs/helixcode/services/soup/tests/simple-test.c,
-       /cvs/helixcode/services/soup/configure.in,
-       /cvs/helixcode/services/soup/Makefile.am,
-       /cvs/helixcode/services/soup/src/soup-context.c,
-       /cvs/helixcode/services/soup/src/soup-context.h,
-       /cvs/helixcode/services/soup/src/soup-misc.c,
-       /cvs/helixcode/services/soup/src/soup-private.h,
-       /cvs/helixcode/services/soup/src/soup-queue.c,
-       /cvs/helixcode/services/soup/src/soup-queue.h,
-       /cvs/helixcode/services/soup/src/soup-request.c,
-       /cvs/helixcode/services/soup/src/soup-request.h,
-       /cvs/helixcode/services/soup/src/soup-uri.c,
-       /cvs/helixcode/services/soup/src/soup-uri.h: * Beginnings of
-       test-suite added.
-
-       * Made SoupContext opaque. Removed SoupContextPrivate. Added
-       soup_context_get_uri() to get the uri string for a given context.
-
-       * Added a response_headers hashtable to SoupRequest so the
-       callback can do whatever it wants with passed headers. All entries
-       in this hashtable are just parsed strings from
-       req->priv->recv_buf, so no new strings are allocated.
-
-       * Renamed custom_headers to request_headers
-
-       * Fixed context creation logic
-
-       * Made soup_servers hashtable use case insensitive hostname
-       matching.
-
-       * Removed SOUP_ERROR_URI_NOT_FOUND, SOUP_ERROR_URI_NOT_PERMITTED,
-       and SOUP_ERROR_URI_OBJECT_MOVED from SoupCallbackResult enum. Its
-       up to the application to figure out all the different HTTP
-       states. This may change however.
-
-       * Added querystring to SoupUri, so that contexts can be cached
-       based only on path.
-
-       * Added default port logic to SoupUri. Known protocols are https
-       (port 443), http (80), smtp/mailto (25), and ftp (20).
-
-2000-12-12  alex  <alex@ximian.com>
-
-       * /cvs/helixcode/services/soup/src/soup-context.c,
-       /cvs/helixcode/services/soup/src/soup-queue.c: * Also changed the
-       passing of a gchar** to a gchar* in soup_process_headers()'s
-       sscanf().
-
-       * /cvs/helixcode/services/soup/src/soup-context.c,
-       /cvs/helixcode/services/soup/src/soup-context.h,
-       /cvs/helixcode/services/soup/src/soup-queue.c,
-       /cvs/helixcode/services/soup/src/soup-request.c: * Internal rehash
-       of handling cases where the connection limit is reached, involves
-       setting a timeout event source to check for the ability to create
-       a connection, and allowing either the timeout or the gnet connect
-       routine to be canceled depending on the current connect
-       state. Clients should now use soup_context_cancel_connect() to
-       cancel a connection in progress.
-
-       * /cvs/helixcode/services/soup/src/soup-queue.c: * Don't use glibc
-       sscanf extensions.
-
-2000-12-11  alex  <alex@ximian.com>
-
-       * /cvs/helixcode/services/soup/src/soup-queue.c: Better error
-       checking on HTTP response line. Avoid doing a lookup for every
-       used header by iterating the hash table and doing a strcmp for all
-       known headers. This is not necessarily faster for several cases,
-       but it allows us to gather custom headers at the same time and
-       avoid a second iteration.
-
-       * /cvs/helixcode/services/soup/configure.in,
-       /cvs/helixcode/services/soup/src/Makefile.am,
-       /cvs/helixcode/services/soup/src/soup-context.c,
-       /cvs/helixcode/services/soup/src/soup-context.h,
-       /cvs/helixcode/services/soup/src/soup.h,
-       /cvs/helixcode/services/soup/src/soup-misc.c,
-       /cvs/helixcode/services/soup/src/soup-misc.h,
-       /cvs/helixcode/services/soup/src/soup-private.h,
-       /cvs/helixcode/services/soup/src/soup-queue.c,
-       /cvs/helixcode/services/soup/src/soup-queue.h,
-       /cvs/helixcode/services/soup/src/soup-request.c,
-       /cvs/helixcode/services/soup/src/soup-request.h,
-       /cvs/helixcode/services/soup/src/soup-uri.h: * Rewrote the
-       connection pool logic, and cleaned up the request queueing loop.
-
-       * Added ref/unref to SoupContext.
-
-       * Made getting a connection for a SoupContext generic which cleans
-       up the code and makes it useable for purposes other than soup.
-
-       * Connection limits handling moved to the connection pooling to
-       avoid races, and allows for better handling when we have hit the
-       connection limit.
-
-       * Added soup-misc.[ch] which provide global functions for getting
-       and setting the proxy context and the connection limit.
-
-       * Changed proxy to be a SoupContext.
-
-       * Support for http headers near completion.
-
-       * Added support for custom request headers which can override the
-       standard headers without duplication.
-
-       * Lots of code reorg and cleaning up.
-
-2000-12-07  alex  <alex@ximian.com>
-
-       * /cvs/helixcode/services/soup/configure.in,
-       /cvs/helixcode/services/soup/src/soup-queue.c: Replaced CVS gnet
-       feature for setting TCP_NODELAY
-
-2000-12-06  alex  <alex@ximian.com>
-
-       * /cvs/helixcode/services/soup/acconfig.h,
-       /cvs/helixcode/services/soup/AUTHORS,
-       /cvs/helixcode/services/soup/autogen.sh,
-       /cvs/helixcode/services/soup/ChangeLog,
-       /cvs/helixcode/services/soup/configure.in,
-       /cvs/helixcode/services/soup/docs/soap-encoding.txt,
-       /cvs/helixcode/services/soup/docs/soap-envelope.txt,
-       /cvs/helixcode/services/soup/Makefile.am,
-       /cvs/helixcode/services/soup/NEWS,
-       /cvs/helixcode/services/soup/README,
-       /cvs/helixcode/services/soup/src/Makefile.am,
-       /cvs/helixcode/services/soup/src/soup-context.c,
-       /cvs/helixcode/services/soup/src/soup-context.h,
-       /cvs/helixcode/services/soup/src/soup.h,
-       /cvs/helixcode/services/soup/src/soup-private.h,
-       /cvs/helixcode/services/soup/src/soup-queue.c,
-       /cvs/helixcode/services/soup/src/soup-queue.h,
-       /cvs/helixcode/services/soup/src/soup-request.c,
-       /cvs/helixcode/services/soup/src/soup-request.h,
-       /cvs/helixcode/services/soup/src/soup-uri.c,
-       /cvs/helixcode/services/soup/src/soup-uri.h: Initial version
+       * libsoup/*: Merge soup-0-7 back onto the trunk. Remove
+       SOAP-specific stuff, Windows support, and other things that
+       weren't being maintained.
 
+       * soup-config.in, soupConf.sh: Kill these. We only support
+       pkg-config now.
diff --git a/HACKING b/HACKING
index 568ab77..51dd265 100644 (file)
--- a/HACKING
+++ b/HACKING
@@ -1,13 +1,14 @@
 In order to build Soup, just follow the generic directions in the INSTALL file.
 
-All changes to Soup must be approved by the maintainers before they can be
-commited.  Mail your patch (created using diff -u) with a detailed ChangeLog and
-a description of changes to soup-list@ximian.com [1], and do not apply it until
-it is approved by Alex or Dick.
+All changes to Soup must be approved by the maintainers before they
+can be commited. Mail your patch (created using diff -u) with a
+detailed ChangeLog and a description of changes to
+soup-list@ximian.com [1], and do not apply it until it is approved by
+one of the maintainers.
 
 Please be sure to follow the GNOME Programming guidelines for all code
-submitted.  The programming guidelines can be found in the white-papers CVS
-module.
+submitted. The programming guidelines can be found in the white-papers
+CVS module.
 
 [1] To subscribe to the Soup discussion list, send mail with the word
     "Subscribe" in the message body to soup-list-request@ximian.com.
diff --git a/MAINTAINERS b/MAINTAINERS
new file mode 100644 (file)
index 0000000..2a6f53a
--- /dev/null
@@ -0,0 +1,3 @@
+Alex Graveley <alex@ximian.com>
+Joe Shaw <joe@ximian.com>
+Dan Winship <danw@ximian.com>
index 8559c7c..5b2c4df 100644 (file)
@@ -1,63 +1,9 @@
 ## Process this file with automake to produce Makefile.in
 
-SUBDIRS = src docs
+SUBDIRS = libsoup
 
-# I want to include tests in the distributed version, but that requires
-# some automake deep magic to stop it trying to include generated files in
-# the automated dependency logic. (hint: OMIT_DEPENDENCIES did SFA)
-#DIST_SUBDIRS = $(SUBDIRS) tests
-
-EXTRA_DIST =                   \
-       autogen.sh              \
-       soupConf.sh.in          \
-       soup_apacheConf.sh.in   \
-       soup_wsdlConf.sh.in     \
-       soup.m4                 \
-       soup.pc.in              \
-       soup.spec.in
-
-bin_SCRIPTS = soup-config
-
-soupConf.sh: $(top_srcdir)/soupConf.sh.in Makefile
-       sed -e 's?\@SOUP_LIBDIR\@?$(SOUP_LIBDIR)?g' \
-           -e 's?\@SOUP_INCLUDEDIR\@?$(SOUP_INCLUDEDIR)?g' \
-           -e 's?\@VERSION\@?$(VERSION)?g' \
-           -e 's?\@SOUP_LIBS\@?$(SOUP_LIBS)?g' \
-             < $(top_srcdir)/soupConf.sh.in > soupConf.tmp \
-         && mv soupConf.tmp soupConf.sh
-
-soup_apacheConf.sh: $(top_srcdir)/soup_apacheConf.sh.in Makefile
-       sed -e 's?\@SOUP_APACHE_LIBDIR\@?$(SOUP_APACHE_LIBDIR)?g' \
-           -e 's?\@SOUP_APACHE_INCLUDEDIR\@?$(SOUP_APACHE_INCLUDEDIR)?g' \
-           -e 's?\@VERSION\@?$(VERSION)?g' \
-           -e 's?\@SOUP_APACHE_LIBS\@?$(SOUP_APACHE_LIBS)?g' \
-             < $(top_srcdir)/soup_apacheConf.sh.in > soup_apacheConf.tmp \
-         && mv soup_apacheConf.tmp soup_apacheConf.sh
-
-soup_wsdlConf.sh: $(top_srcdir)/soup_wsdlConf.sh.in Makefile
-       sed -e 's?\@SOUP_WSDL_LIBDIR\@?$(SOUP_WSDL_LIBDIR)?g' \
-           -e 's?\@SOUP_WSDL_INCLUDEDIR\@?$(SOUP_WSDL_INCLUDEDIR)?g' \
-           -e 's?\@VERSION\@?$(VERSION)?g' \
-           -e 's?\@SOUP_WSDL_LIBS\@?$(SOUP_WSDL_LIBS)?g' \
-             < $(top_srcdir)/soup_wsdlConf.sh.in > soup_wsdlConf.tmp \
-         && mv soup_wsdlConf.tmp soup_wsdlConf.sh
-
-confexecdir = $(libdir)
-confexec_DATA = soupConf.sh soup_apacheConf.sh soup_wsdlConf.sh
-
-m4datadir = $(datadir)/aclocal
-m4data_DATA = soup.m4
+EXTRA_DIST = soup-2.0.pc.in
 
 pkgconfigdir = $(libdir)/pkgconfig
-pkgconfig_DATA = soup.pc
-
-examples:
-       $(MAKE) -C tests
-
-dist-hook: soup.spec
-       cp soup.spec $(distdir)
-
-rpms: distcheck
-       rpm -ta $(top_builddir)/@PACKAGE@-@VERSION@.tar.gz
+pkgconfig_DATA = soup-2.0.pc
 
-CLEANFILES = soupConf.sh soup_apacheConf.sh soup_wsdlConf.sh
diff --git a/README b/README
index 53bfd89..ee4d22e 100644 (file)
--- a/README
+++ b/README
@@ -1,18 +1,12 @@
-Soup is a SOAP (Simple Object Access Protocol) implementation in C. 
+Libsoup is an HTTP library implementation in C. It was originally part
+of a SOAP (Simple Object Access Protocol) implementation called Soup, but
+the SOAP and non-SOAP parts have now been split into separate packages.
 
-It provides an queued asynchronous callback-based mechanism for sending and
-servicing SOAP requests, and a WSDL (Web Service Definition Language) to C
-compiler which generates client stubs and server skeletons for easily calling
-and implementing SOAP methods.
-
-It uses the Glib main loop and is designed to work well with GTK
-applications.  This enables GNOME applications to access SOAP servers
-on the network in a completely asynchronous fashion, very similar to the
-Gtk+ programming model (a synchronous operation mode is also supported
-for those who want it).
-
-The WSDL compiler will help you make your applications interoperate
-with services that expose their descriptions through WSDL.
+libsoup uses the Glib main loop and is designed to work well with GTK
+applications. This enables GNOME applications to access HTTP servers
+on the network in a completely asynchronous fashion, very similar to
+the Gtk+ programming model (a synchronous operation mode is also
+supported for those who want it).
 
 Features:
   * Completely Asynchronous
@@ -20,24 +14,14 @@ Features:
   * HTTP chunked transfer support
   * HTTP, SOCKS4, and SOCKS5 authenticated proxy support
   * SSL Support using OpenSSL or Mozilla NSS
-  * Apache module server support
   * Client support for Digest, NTLM, and Basic authentication
-  * Standalone SOAP server support
 
 Planned Features:
   * Server digest authentication
   * Gconf configuration and proxy integration
-  * UDDI Support
-  * Disco support
-  * GTK or Bonobo object generation
 
-To subscribe to the Soup discussion list, send mail with the word "Subscribe" in
-the message body to soup-list-request@ximian.com.
+To subscribe to the Soup discussion list, send mail with the word
+"Subscribe" in the message body to soup-list-request@ximian.com.
 
 Licensing:
-  * The Soup runtime is licensed LGPL, see COPYING.LIB for more details.
-  * The WSDL compiler is licensed GPL, see COPYING for more details.
-  * The soup-ssl-proxy application is licensed GPL, see COPYING for more
-    details. This is in order to comply with the licensing restrictions
-    imposed by the SSL libraries used by Soup, while allowing the Soup
-    application libraries and runtime to remain LGPL.
+libsoup is licensed under the LGPL, see COPYING for more details.
index 293b797..9dd6c02 100755 (executable)
 # Run this to generate all the initial makefiles, etc.
 
 srcdir=`dirname $0`
-PKG_NAME="the package."
+test -z "$srcdir" && srcdir=.
 
-DIE=0
+PKG_NAME="libsoup"
 
-(autoconf --version) < /dev/null > /dev/null 2>&1 || {
-  echo
-  echo "**Error**: You must have \`autoconf' installed to."
-  echo "Download the appropriate package for your distribution,"
-  echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/"
-  DIE=1
+(test -f $srcdir/configure.in \
+  && test -f $srcdir/ChangeLog \
+  && test -d $srcdir/libsoup) || {
+    echo -n "**Error**: Directory "\`$srcdir\'" does not look like the"
+    echo " top-level $PKG_NAME directory"
+    exit 1
 }
 
-(grep "^AM_PROG_LIBTOOL" $srcdir/configure.in >/dev/null) && {
-  (libtool --version) < /dev/null > /dev/null 2>&1 || {
-    echo
-    echo "**Error**: You must have \`libtool' installed."
-    echo "Get ftp://ftp.gnu.org/pub/gnu/libtool-1.2d.tar.gz"
-    echo "(or a newer version if it is available)"
-    DIE=1
-  }
+which gnome-autogen.sh || {
+    echo "You need to install gnome-common from the GNOME CVS"
+    exit 1
 }
-
-grep "^AM_GNU_GETTEXT" $srcdir/configure.in >/dev/null && {
-  grep "sed.*POTFILES" $srcdir/configure.in >/dev/null || \
-  (gettext --version) < /dev/null > /dev/null 2>&1 || {
-    echo
-    echo "**Error**: You must have \`gettext' installed."
-    echo "Get ftp://alpha.gnu.org/gnu/gettext-0.10.35.tar.gz"
-    echo "(or a newer version if it is available)"
-    DIE=1
-  }
-}
-
-grep "^AM_GNOME_GETTEXT" $srcdir/configure.in >/dev/null && {
-  grep "sed.*POTFILES" $srcdir/configure.in >/dev/null || \
-  (gettext --version) < /dev/null > /dev/null 2>&1 || {
-    echo
-    echo "**Error**: You must have \`gettext' installed."
-    echo "Get ftp://alpha.gnu.org/gnu/gettext-0.10.35.tar.gz"
-    echo "(or a newer version if it is available)"
-    DIE=1
-  }
-}
-
-(automake --version) < /dev/null > /dev/null 2>&1 || {
-  echo
-  echo "**Error**: You must have \`automake' installed."
-  echo "Get ftp://ftp.gnu.org/pub/gnu/automake-1.3.tar.gz"
-  echo "(or a newer version if it is available)"
-  DIE=1
-  NO_AUTOMAKE=yes
-}
-
-
-# if no automake, don't bother testing for aclocal
-test -n "$NO_AUTOMAKE" || (aclocal --version) < /dev/null > /dev/null 2>&1 || {
-  echo
-  echo "**Error**: Missing \`aclocal'.  The version of \`automake'"
-  echo "installed doesn't appear recent enough."
-  echo "Get ftp://ftp.gnu.org/pub/gnu/automake-1.3.tar.gz"
-  echo "(or a newer version if it is available)"
-  DIE=1
-}
-
-if test "$DIE" -eq 1; then
-  exit 1
-fi
-
-if test -z "$*"; then
-  echo "**Warning**: I am going to run \`configure' with no arguments."
-  echo "If you wish to pass any to it, please specify them on the"
-  echo \`$0\'" command line."
-  echo
-fi
-
-case $CC in
-xlc )
-  am_opt=--include-deps;;
-esac
-
-for coin in `find $srcdir -name configure.in -print`
-do 
-  dr=`dirname $coin`
-  if test -f $dr/NO-AUTO-GEN; then
-    echo skipping $dr -- flagged as no auto-gen
-  else
-    echo processing $dr
-    macrodirs=`sed -n -e 's,AM_ACLOCAL_INCLUDE(\(.*\)),\1,gp' < $coin`
-    ( cd $dr
-      aclocalinclude="$ACLOCAL_FLAGS"
-      for k in $macrodirs; do
-       if test -d $k; then
-          aclocalinclude="$aclocalinclude -I $k"
-       ##else 
-       ##  echo "**Warning**: No such directory \`$k'.  Ignored."
-        fi
-      done
-      if grep "^AM_GNU_GETTEXT" configure.in >/dev/null; then
-       if grep "sed.*POTFILES" configure.in >/dev/null; then
-         : do nothing -- we still have an old unmodified configure.in
-       else
-         echo "Creating $dr/aclocal.m4 ..."
-         test -r $dr/aclocal.m4 || touch $dr/aclocal.m4
-         echo "Running gettextize...  Ignore non-fatal messages."
-         echo "no" | gettextize --force --copy
-         echo "Making $dr/aclocal.m4 writable ..."
-         test -r $dr/aclocal.m4 && chmod u+w $dr/aclocal.m4
-        fi
-      fi
-      if grep "^AM_GNOME_GETTEXT" configure.in >/dev/null; then
-       echo "Creating $dr/aclocal.m4 ..."
-       test -r $dr/aclocal.m4 || touch $dr/aclocal.m4
-       echo "Running gettextize...  Ignore non-fatal messages."
-       echo "no" | gettextize --force --copy
-       echo "Making $dr/aclocal.m4 writable ..."
-       test -r $dr/aclocal.m4 && chmod u+w $dr/aclocal.m4
-      fi
-      if grep "^AM_PROG_LIBTOOL" configure.in >/dev/null; then
-       echo "Running libtoolize..."
-       libtoolize --force --copy
-      fi
-      echo "Running aclocal $aclocalinclude ..."
-      aclocal $aclocalinclude
-      if grep "^AM_CONFIG_HEADER" configure.in >/dev/null; then
-       echo "Running autoheader..."
-       autoheader
-      fi
-      echo "Running automake --gnu $am_opt ..."
-      automake --add-missing --gnu $am_opt
-      echo "Running autoconf ..."
-      autoconf
-    )
-  fi
-done
-
-#conf_flags="--enable-maintainer-mode --enable-compile-warnings" #--enable-iso-c
-
-if test x$NOCONFIGURE = x; then
-  echo Running $srcdir/configure $conf_flags "$@" ...
-  $srcdir/configure $conf_flags "$@" \
-  && echo Now type \`make\' to compile $PKG_NAME
-else
-  echo Skipping configure process.
-fi
+USE_GNOME2_MACROS=1 . gnome-autogen.sh
index 74aa944..4629d66 100644 (file)
@@ -2,13 +2,20 @@ dnl *******************************************
 dnl *** Initialize automake and set version ***
 dnl *******************************************
 
-AC_INIT(src/libsoup/soup.h)
+AC_PREREQ(2.53)
+AC_INIT(libsoup, 2.0)
+AC_CONFIG_SRCDIR(soup-2.0.pc.in)
+
+AM_INIT_AUTOMAKE(AC_PACKAGE_NAME, AC_PACKAGE_VERSION)
+AM_CONFIG_HEADER(config.h)
+AM_MAINTAINER_MODE
+AC_PROG_MAKE_SET
 
 # Increment on interface addition. Reset on removal.
-SOUP_AGE=1
+SOUP_AGE=0
 
 # Increment on interface add, remove, or change.
-SOUP_CURRENT=4
+SOUP_CURRENT=0
 
 # Increment on source change. Reset when CURRENT changes.
 SOUP_REVISION=0
@@ -17,14 +24,6 @@ AC_SUBST(SOUP_CURRENT)
 AC_SUBST(SOUP_REVISION)
 AC_SUBST(SOUP_AGE)
 
-# Update in src/soup-core/soup-private.h for Windows
-AM_INIT_AUTOMAKE(soup, 0.7.99)
-
-AM_CONFIG_HEADER(config.h)
-AM_MAINTAINER_MODE
-AC_PROG_MAKE_SET
-
-
 dnl ***************************
 dnl *** Set debugging flags ***
 dnl ***************************
@@ -66,142 +65,19 @@ AM_PROG_LIBTOOL
 # This isn't a program, but it doesn't fit anywhere else...
 AC_FUNC_ALLOCA
 
-
-dnl ***************************
-dnl *** Checks for glib 1.2 ***
-dnl ***************************
-
-AM_PATH_GLIB(1.2.0,,
-             AC_MSG_ERROR([Cannot find GLIB: Is glib-config in path?]))
-
-GLIB_CFLAGS=`glib-config --cflags glib`
-GLIB_LIBS=`glib-config --libs glib`
-GMODULE_LIBS=`glib-config --libs gmodule`
-
-AC_SUBST(GLIB_CFLAGS)
-AC_SUBST(GLIB_LIBS)
-AC_SUBST(GMODULE_LIBS)
-
-
-dnl ****************************
-dnl *** Checks for gnome-xml ***
-dnl ****************************
-
-FAVOUR_LIBXML=1
-AC_ARG_WITH(libxml,
-       [  --with-libxml=[1/2] which version of libxml to use [default=$FAVOUR_LIBXML]],,
-       with_libxml=$FAVOUR_LIBXML)
-
-if test "x$with_libxml" = "x" -o "$with_libxml" = "yes"; then
-       with_libxml=$FAVOUR_LIBXML
-fi
-
-if test "$with_libxml" = "1"; then
-       AC_PATH_PROG(XML_CONFIG,xml-config,no)
-       if test x$XML_CONFIG = xno; then
-               AC_MSG_ERROR([Cannot find LIBXML: Is xml-config in path?])
-       fi
-
-       XML_MIN_VERSION=1.8.8
-else
-       if test "$with_libxml" = "2"; then
-               AC_PATH_PROG(XML_CONFIG,xml2-config,no)
-               if test x$XML_CONFIG = xno; then
-                       AC_MSG_ERROR([Cannot find LIBXML2: Is xml2-config in path?])
-               fi
-
-               XML_MIN_VERSION=2.3.10
-       else
-               AC_MSG_ERROR(Can't use libxml version $with_libxml)
-       fi
-fi
-
-dnl Check version
-XML_VERSION=`$XML_CONFIG --version`
-ver=`echo $XML_VERSION | awk -F. '{printf("%d", ($1*1000+$2)*1000+$3);}'`
-minver=`echo $XML_MIN_VERSION | awk -F. '{printf("%d", ($1*1000+$2)*1000+$3);}'`
-if test "$minver" -gt "$ver"
-then
-       AC_MSG_ERROR(Found libxml version $XML_VERSION. You need $XML_MIN_VERSION or newer)
-fi
-
-XML_CFLAGS=`$XML_CONFIG --cflags`
-XML_LIBS=`$XML_CONFIG --libs`
-
-AC_SUBST(XML_CFLAGS)
-AC_SUBST(XML_LIBS)
-
-
 dnl ***********************
-dnl *** Checks for popt ***
+dnl *** Checks for glib ***
 dnl ***********************
 
-AC_ARG_WITH(popt-includes,
-           [  --with-popt-includes     Specify location of popt headers],
-           [popt_inc_prefix=-I$withval])
-
-AC_ARG_WITH(popt-libs,
-           [  --with-popt-libs         Specify location of popt libs],
-           [popt_prefix=$withval],
-           [popt_prefix=/usr/lib])
-       
-save_CPPFLAGS=$CPPFLAGS
-save_LIBS=$LIBS
-CPPFLAGS="$CPPFLAGS $popt_inc_prefix"
-LIBS="$LIBS -L$prefix"
-
-AC_CHECK_LIB(popt, 
-            poptGetContext, 
-            [POPT_LIBS="$LIBS -lpopt"] , 
-            AC_MSG_ERROR([popt is required]))
-AC_CHECK_HEADERS(popt.h, [POPT_CFLAGS="$CFLAGS"], AC_MSG_ERROR([popt.h is required]))
-
-CPPFLAGS=$save_CPPFLAGS
-LIBS=$save_LIBS
-
-AC_SUBST(POPT_CFLAGS)
-AC_SUBST(POPT_LIBS)
-
-
-dnl **********************************************
-dnl *** Variable substitution for soup*Conf.sh ***
-dnl **********************************************
-
-### soupConf.sh
-SOUP_LIBDIR='-L${libdir}'
-SOUP_INCLUDEDIR=" -I${includedir}/soup $GLIB_CFLAGS $XML_CFLAGS"
-SOUP_LIBS="-lsoup $GLIB_LIBS $XML_LIBS"
-
-AC_SUBST(SOUP_LIBDIR)
-AC_SUBST(SOUP_INCLUDEDIR)
-AC_SUBST(SOUP_LIBS)
-
-### soup-apacheConf.sh
-SOUP_APACHE_LIBDIR='-L${libdir}'
-SOUP_APACHE_INCLUDEDIR="$SOUP_INCLUDEDIR $APACHE_CFLAGS"
-SOUP_APACHE_LIBS="$SOUP_LIBS -lsoup-apache $APACHE_LIBS"
-
-AC_SUBST(SOUP_APACHE_LIBDIR)
-AC_SUBST(SOUP_APACHE_INCLUDEDIR)
-AC_SUBST(SOUP_APACHE_LIBS)
-
-### soup-wsdlConf.sh
-SOUP_WSDL_LIBDIR='-L${libdir}'
-SOUP_WSDL_INCLUDEDIR=" -I${includedir}/soup $GLIB_CFLAGS $XML_CFLAGS"
-SOUP_WSDL_LIBS="$SOUP_LIBS -lwsdl"
-
-AC_SUBST(SOUP_WSDL_LIBDIR)
-AC_SUBST(SOUP_WSDL_INCLUDEDIR)
-AC_SUBST(SOUP_WSDL_LIBS)
-
+PKG_CHECK_MODULES(GLIB, glib-2.0)
+AC_SUBST(GLIB_CFLAGS)
+AC_SUBST(GLIB_LIBS)
 
 dnl *********************************
 dnl *** Networking library checks ***
 dnl *********************************
 
-AC_CHECK_HEADERS(unistd.h)
-AC_CHECK_HEADERS(netinet/in.h netinet/tcp.h)
-AC_CHECK_HEADERS(sys/socket.h sys/sockio.h sys/poll.h sys/param.h sys/wait.h)
+AC_CHECK_HEADERS(sys/sockio.h sys/poll.h sys/param.h)
 AC_CHECK_HEADERS(sys/ioctl.h sys/filio.h)
 
 AC_CHECK_FUNC(socket, , AC_CHECK_LIB(socket, socket))
@@ -228,7 +104,8 @@ AC_CHECK_FUNC(gethostbyname_r,
          dnl Have glibc gethostbyname_r
 
          AC_MSG_RESULT(yes)
-         AC_DEFINE(HAVE_GETHOSTBYNAME_R_GLIBC)
+         AC_DEFINE(HAVE_GETHOSTBYNAME_R_GLIBC, 1,
+                   [Define if you have a glibc-style gethostbyname_r()])
          HAVE_GETHOSTBYNAME_R=yes
 
         ], [
@@ -250,7 +127,8 @@ AC_CHECK_FUNC(gethostbyname_r,
          dnl Have Solaris/Irix gethostbyname_r
 
          AC_MSG_RESULT(yes)
-         AC_DEFINE(HAVE_GETHOSTBYNAME_R_SOLARIS)
+         AC_DEFINE(HAVE_GETHOSTBYNAME_R_SOLARIS, 1,
+                   [Define if you have a Solaris-style gethostbyname_r()])
          HAVE_GETHOSTBYNAME_R=yes
 
        ], [
@@ -268,7 +146,8 @@ AC_CHECK_FUNC(gethostbyname_r,
           dnl Have HP-UX gethostbyname_r
 
           AC_MSG_RESULT(yes)
-         AC_DEFINE(HAVE_GETHOSTBYNAME_R_HPUX)
+         AC_DEFINE(HAVE_GETHOSTBYNAME_R_HPUX, 1,
+                   [Define if you have an HP-UX-style gethostbyname_r()])
          HAVE_GETHOSTBYNAME_R=yes
 
        ]
@@ -276,16 +155,15 @@ AC_CHECK_FUNC(gethostbyname_r,
   )]
 )])
 
-### If we don't have gethostbyname_r, try to use Glib mutexes
+# If we don't have gethostbyname_r, we'll use Glib mutexes, but give a warning
 if test -z "$HAVE_GETHOSTBYNAME_R"; then
-       AM_PATH_GLIB(1.2.0, 
-                    AC_DEFINE(HAVE_GETHOSTBYNAME_R_GLIB_MUTEX), [
-                    AC_MSG_WARN(You have neither Glib threads nor the function
-                                gethostbyname_r.  This means that calls to
-                                gethostbyname (called by the Soup address
-                                functions) will not be thread safe so could
-                                malfunction in programs that use threads.)
-                    ])
+       AC_DEFINE(HAVE_GETHOSTBYNAME_R_GLIB_MUTEX, 1,
+                 [Define if you have no gethostbyname_r()])
+       AC_MSG_WARN([You have neither Glib threads nor the function
+                   gethostbyname_r.  This means that calls to
+                   gethostbyname (called by the Soup address
+                   functions) will not be thread safe so could
+                   malfunction in programs that use threads.])
 fi
 
 
@@ -328,12 +206,14 @@ AC_ARG_WITH(openssl-libs,
 ###
 ### Allow for a custom SSL proxy name
 ###
+SSL_PROXY_NAME=libsoup-ssl-proxy
 AC_ARG_WITH(ssl-proxy-name,
-           [  --with-ssl-proxy-name    Custom name for ssl proxy executable [default=soup-ssl-proxy]],
+           [  --with-ssl-proxy-name    Custom name for ssl proxy executable [default=libsoup-ssl-proxy]],
            [SSL_PROXY_NAME=$withval],
-           [SSL_PROXY_NAME=soup-ssl-proxy])
+           [SSL_PROXY_NAME=libsoup-ssl-proxy])
 
-AC_DEFINE_UNQUOTED(SSL_PROXY_NAME, "${SSL_PROXY_NAME}")
+AC_DEFINE_UNQUOTED(SSL_PROXY_NAME, "${SSL_PROXY_NAME}",
+                  [The name to use for the SSL proxy binary. Defaults to libsoup-ssl-proxy])
 AC_SUBST(SSL_PROXY_NAME)
 
 ###
@@ -361,7 +241,8 @@ if test "x$enable_ssl" = xyes; then
                        OPENSSL_LIBS="-L$openssl_prefix -lssl -lcrypto $DL_LDFLAGS"
                fi
                OPENSSL_CFLAGS=$CPPFLAGS
-               AC_DEFINE(HAVE_OPENSSL)
+               AC_DEFINE(HAVE_OPENSSL, 1,
+                         [Defined if you are using OpenSSL for SSL support])
        else
                OPENSSL_LIBS=
                OPENSSL_CFLAGS=
@@ -387,7 +268,8 @@ if test "x$enable_ssl" = xyes; then
                        NSS_LIBS="-lpthread -L$nspr_prefix -lnspr4 -lplc4 -lplds4 $nss_prefix -lnss3 -lssl3"
                fi
                NSS_CFLAGS=$CPPFLAGS
-               AC_DEFINE(HAVE_NSS)
+               AC_DEFINE(HAVE_NSS, 1,
+                         [Defined if you are using Mozilla NSS for SSL support])
        else
                NSS_LIBS=
                NSS_CFLAGS=
@@ -399,30 +281,6 @@ if test "x$enable_ssl" = xyes; then
 fi
 
 
-dnl *************************
-dnl *** Checks for Apache ***
-dnl *************************
-
-enable_apache="no"
-
-AC_PATH_PROG(APXS,apxs,no)
-if test x$APXS != xno; then
-       APACHE_CFLAGS="-I`apxs -q INCLUDEDIR CFLAGS`"
-       APACHE_LIBS=`apxs -q LDFLAGS_SHLIB LIBS_SHLIB`
-
-       save_CPPFLAGS=$CPPFLAGS
-       CPPFLAGS=$APACHE_CFLAGS
-       AC_CHECK_HEADERS(httpd.h http_config.h http_core.h http_log.h http_main.h http_protocol.h,
-                         [enable_apache="yes"],
-                         [enable_apache="no"
-                          break])
-       CPPFLAGS=$save_CPPFLAGS
-
-       AC_SUBST(APACHE_CFLAGS)
-       AC_SUBST(APACHE_LIBS)
-fi
-
-
 dnl *********************************************
 dnl *** Checks for gtk-doc (lifted from glib) ***
 dnl *********************************************
@@ -463,64 +321,6 @@ dnl       to make this work with the tarballs.
 AM_CONDITIONAL(ENABLE_GTK_DOC, test x$enable_gtk_doc = xyes)
 
 
-dnl *******************************************************
-dnl *** Type alignment test (based on the one in ORBit) ***
-dnl *******************************************************
-
-AC_DEFUN(AC_CHECK_ALIGNOF,
-[changequote(<<, >>)dnl
-dnl The name to #define.
-define(<<AC_TYPE_NAME>>, translit(alignof_$1, [a-z *], [A-Z_P]))dnl
-dnl The cache variable name.
-define(<<AC_CV_NAME>>, translit(ac_cv_alignof_$1, [ *], [_p]))dnl
-changequote([, ])dnl
-AC_MSG_CHECKING(alignment of $1)
-align_save_libs="$LIBS"
-LIBS="$GLIB_LIBS $LIBS"
-AC_CACHE_VAL(AC_CV_NAME,
-[AC_TRY_RUN([
-#include <stdio.h>
-#include <glib.h>
-typedef struct {char s1;} gstruct;
-struct test {char s1; $1 s2;};
-main()
-{
-  FILE *f=fopen("conftestval", "w");
-  if (!f) exit(1);
-  fprintf(f, "%d\n", &(((struct test*)0)->s2));
-  exit(0);
-}], AC_CV_NAME=`cat conftestval`, AC_CV_NAME=0, AC_CV_NAME=0)])dnl
-AC_MSG_RESULT($AC_CV_NAME)
-LIBS="$align_save_libs"
-AC_DEFINE_UNQUOTED(AC_TYPE_NAME, $AC_CV_NAME)
-undefine([AC_TYPE_NAME])dnl
-undefine([AC_CV_NAME])dnl
-])
-
-orig_CPPFLAGS=$CPPFLAGS
-CPPFLAGS=$GLIB_CFLAGS
-AC_CHECK_ALIGNOF(gboolean)
-AC_CHECK_ALIGNOF(gchar)
-AC_CHECK_ALIGNOF(guchar)
-AC_CHECK_ALIGNOF(gint)
-AC_CHECK_ALIGNOF(guint)
-AC_CHECK_ALIGNOF(gshort)
-AC_CHECK_ALIGNOF(gushort)
-AC_CHECK_ALIGNOF(glong)
-AC_CHECK_ALIGNOF(gulong)
-AC_CHECK_ALIGNOF(gint8)
-AC_CHECK_ALIGNOF(guint8)
-AC_CHECK_ALIGNOF(gint16)
-AC_CHECK_ALIGNOF(guint16)
-AC_CHECK_ALIGNOF(gint32)
-AC_CHECK_ALIGNOF(guint32)
-AC_CHECK_ALIGNOF(gfloat)
-AC_CHECK_ALIGNOF(gdouble)
-AC_CHECK_ALIGNOF(gpointer)
-AC_CHECK_ALIGNOF(gstruct)
-CPPFLAGS=$orig_CPPFLAGS
-
-
 dnl *************************************
 dnl *** Warnings to show if using GCC ***
 dnl *************************************
@@ -538,26 +338,36 @@ fi
 # Use reentrant functions
 CFLAGS="$CFLAGS -D_REENTRANT"
 
+dnl *****************************
+dnl *** link proxy statically ***
+dnl *****************************
+AC_ARG_ENABLE(static-proxy, 
+  [  --enable-static-proxy  Build ${SSL_PROXY_NAME} statically ])
+
+if test x"$enable_static_proxy" = xyes; then
+       LINK_STATIC="-Wl,-Bstatic"
+       LINK_DYNAMIC="-Wl,-Bdynamic"
+       FORCE_SHLIBS="dl resolv rt nsl"
+       for lib in $FORCE_SHLIBS; do
+         OPENSSL_LIBS=`echo $OPENSSL_LIBS | sed "s/-l$lib/-Wl,-Bdynamic -l$lib -Wl,-Bstatic/"`
+         GMODULE_LIBS=`echo $GMODULE_LIBS | sed "s/-l$lib/-Wl,-Bdynamic -l$lib -Wl,-Bstatic/"`
+       done
+else
+       LINK_STATIC=
+       LINK_DYNAMIC=
+fi
+
+AC_SUBST(LINK_STATIC)
+AC_SUBST(LINK_DYNAMIC)
 
 dnl *************************
 dnl *** Output Everything ***
 dnl *************************
 
 AC_OUTPUT([
-       soup-config
-       soup.pc
-       soup.spec
+       soup-2.0.pc
        Makefile
-       docs/Makefile
-       docs/reference/Makefile
-       src/Makefile
-       src/libsoup/Makefile
-       src/libsoup-apache/Makefile
-       src/libwsdl/Makefile
-       src/soup-httpd/Makefile
-       src/soup-ssl-proxy/Makefile
-       src/soup-wsdl/Makefile
-       tests/Makefile
+       libsoup/Makefile
        ])
 
 echo "
@@ -568,9 +378,10 @@ Configuration:
   Compiler:                    ${CC}
   Build flags:                 ${CFLAGS} ${SOUP_DEBUG_FLAGS}
 
+  Static SSL Proxy:            ${enable_static_proxy:-no}
+  SSL Proxy Name:              ${SSL_PROXY_NAME}
+
   OpenSSL support:             ${enable_openssl}
   Mozilla NSS support:         ${enable_nss}
 
-  Apache module support:       ${enable_apache}
-
 "
index 6763e82..5e0c5a7 100644 (file)
@@ -9,7 +9,7 @@ DOC_MODULE=soup
 DOC_MAIN_SGML_FILE=soup-docs.sgml
 
 # The directory containing the source code. Relative to $(srcdir)
-DOC_SOURCE_DIR=../../src
+DOC_SOURCE_DIR=../../libsoup
 
 # Extra options to supply to gtkdoc-scan
 SCAN_OPTIONS=--deprecated-guards="G_DISABLE_DEPRECATED"
index 69fb0bd..0be24a0 100644 (file)
@@ -4,3 +4,4 @@
 .libs
 Makefile
 Makefile.in
+libsoup-ssl-proxy
index e47c575..8e6f169 100644 (file)
@@ -1,71 +1,57 @@
 ## Process this file with automake to produce Makefile.in
 
-@SET_MAKE@
-
 INCLUDES =                             \
        -DG_LOG_DOMAIN=\"SOUP\"         \
        -DSYSCONFDIR=\"$(sysconfdir)\"  \
        -DBINDIR=\"$(bindir)\"          \
-       -I$(top_srcdir)/src             \
+       -I$(top_srcdir)                 \
        $(SOUP_DEBUG_FLAGS)             \
        $(GLIB_CFLAGS)                  \
-       $(XML_CFLAGS)                   \
-       $(NSS_CFLAGS)
+       $(NSS_CFLAGS)                   \
+       $(OPENSSL_CFLAGS)
 
-libsoupincludedir = $(includedir)/soup/libsoup
+libsoupincludedir = $(includedir)/soup-2.0/libsoup
 
 libsoupinclude_HEADERS =       \
        soup.h                  \
        soup-context.h          \
-       soup-dav.h              \
-       soup-dav-server.h       \
-       soup-env.h              \
        soup-error.h            \
-       soup-fault.h            \
        soup-headers.h          \
        soup-message.h          \
        soup-method.h           \
        soup-misc.h             \
-       soup-parser.h           \
-       soup-serializer.h       \
+       soup-ntlm.h             \
        soup-server-auth.h      \
        soup-server.h           \
        soup-socket.h           \
        soup-uri.h
 
-lib_LTLIBRARIES = libsoup.la
+lib_LTLIBRARIES = libsoup-2.0.la
 
-libsoup_la_LDFLAGS = -version-info $(SOUP_CURRENT):$(SOUP_REVISION):$(SOUP_AGE)
+libsoup_2_0_la_LDFLAGS =       \
+       -version-info $(SOUP_CURRENT):$(SOUP_REVISION):$(SOUP_AGE)
 
-libsoup_la_LIBADD =            \
+libsoup_2_0_la_LIBADD =                \
        $(GLIB_LIBS)            \
-       $(XML_LIBS)             \
        $(NSS_LIBS)
 
-libsoup_la_SOURCES =           \
+libsoup_2_0_la_SOURCES =       \
        md5-utils.h             \
        md5-utils.c             \
        soup-auth.h             \
        soup-auth.c             \
        soup-context.c          \
-       soup-dav.c              \
-       soup-dav-server.c       \
-       soup-env.c              \
        soup-error.c            \
-       soup-fault.c            \
        soup-headers.c          \
        soup-message.c          \
        soup-method.c           \
        soup-misc.c             \
        soup-nss.h              \
        soup-nss.c              \
-       soup-ntlm.h             \
        soup-ntlm.c             \
-       soup-parser.c           \
        soup-private.h          \
        soup-queue.h            \
        soup-queue.c            \
-       soup-serializer.c       \
        soup-server.c           \
        soup-server-auth.c      \
        soup-socket.c           \
@@ -78,5 +64,19 @@ libsoup_la_SOURCES =         \
        soup-transfer.c         \
        soup-uri.c
 
-EXTRA_DIST = 
+noinst_PROGRAMS = libsoup-ssl-proxy
+
+libsoup_ssl_proxy_LDADD =      \
+       $(LINK_STATIC)          \
+       $(OPENSSL_LIBS)         \
+       $(GLIB_LIBS)            \
+       $(LINK_DYNAMIC)
+
+libsoup_ssl_proxy_SOURCES =    \
+       soup-openssl.h          \
+       soup-openssl.c          \
+       soup-ssl-proxy.c
 
+install-exec-hook:
+       $(mkinstalldirs) $(DESTDIR)$(bindir)
+       $(INSTALL_PROGRAM) libsoup-ssl-proxy $(DESTDIR)$(bindir)/$(SSL_PROXY_NAME)
index dd28292..2b3b22d 100644 (file)
 #include <config.h>
 #endif
 
-#ifdef HAVE_UNISTD_H
 #include <unistd.h>
-#endif
-
-#ifdef SOUP_WIN32
-#include <process.h>
-#endif
-
 #include <string.h>
 #include <stdlib.h>
 #include <glib.h>
@@ -46,12 +39,6 @@ typedef struct {
        gchar *token;
 } SoupAuthBasic;
 
-static gboolean
-basic_compare_func (SoupAuth *a, SoupAuth *b)
-{
-       return FALSE;
-}
-
 static char *
 basic_auth_func (SoupAuth *auth, SoupMessage *message)
 {
@@ -105,7 +92,6 @@ soup_auth_new_basic (void)
        auth = (SoupAuth *) basic;
        auth->type = SOUP_AUTH_TYPE_BASIC;
 
-       auth->compare_func = basic_compare_func;
        auth->parse_func = basic_parse_func;
        auth->init_func = basic_init_func;
        auth->auth_func = basic_auth_func;
@@ -140,7 +126,6 @@ typedef struct {
        char *nonce;
        QOPType qop_options;
        AlgorithmType algorithm;
-       gboolean stale;
 
        /* These are generated by the client */
        char *cnonce;
@@ -148,12 +133,6 @@ typedef struct {
        QOPType qop;
 } SoupAuthDigest;
 
-static gboolean
-digest_compare_func (SoupAuth *a, SoupAuth *b)
-{
-       return ((SoupAuthDigest *) a)->stale;
-}
-
 static void
 digest_hex (guchar *digest, guchar hex[33])
 {
@@ -285,6 +264,7 @@ digest_auth_func (SoupAuth *auth, SoupMessage *message)
                url,
                response);
 
+       g_free (response);
        g_free (url);
        g_free (nc);
 
@@ -369,15 +349,6 @@ digest_parse_func (SoupAuth *auth, const char *header)
 
        g_free (tmp);
 
-       tmp = soup_header_param_copy_token (tokens, "stale");
-
-       if (tmp && g_strcasecmp (tmp, "true") == 0)
-               digest->stale = TRUE;
-       else
-               digest->stale = FALSE;
-
-       g_free (tmp);
-
        tmp = soup_header_param_copy_token (tokens, "algorithm");
        digest->algorithm = decode_algorithm (tmp);
        g_free (tmp);
@@ -447,7 +418,6 @@ soup_auth_new_digest (void)
        auth = (SoupAuth *) digest;
        auth->type = SOUP_AUTH_TYPE_DIGEST;
 
-       auth->compare_func = digest_compare_func;
        auth->parse_func = digest_parse_func;
        auth->init_func = digest_init_func;
        auth->auth_func = digest_auth_func;
@@ -462,6 +432,8 @@ soup_auth_new_digest (void)
        /* We're just going to do qop=auth for now */
        digest->qop = QOP_AUTH;
 
+       g_free (bgen);
+
        return auth;
 }
 
@@ -474,15 +446,8 @@ typedef struct {
        SoupAuth  auth;
        gchar    *response;
        gchar    *header;
-       gboolean  completed;
 } SoupAuthNTLM;
 
-static gboolean
-ntlm_compare_func (SoupAuth *a, SoupAuth *b)
-{
-       return !((SoupAuthNTLM *)b)->completed;
-} 
-
 /*
  * SoupAuthNTLMs are one time use. Just return the response, and set our
  * reference to NULL so future requests do not include this header.
@@ -530,41 +495,42 @@ ntlm_parse (SoupAuth *sa, const char *header)
        g_strstrip (auth->header);
 }
 
-/*
- * FIXME: Because NTLM is a two step process, we parse the host and domain out
- *        of the context's uri twice. This is because there is no way to reparse
- *        a new header with an existing SoupAuth, so a new one is created for
- *        each negotiation step.
- */
 static void
 ntlm_init (SoupAuth *sa, const SoupUri *uri)
 {
        SoupAuthNTLM *auth = (SoupAuthNTLM *) sa;
-       gchar *host, *domain;
-
-       host   = ntlm_get_authmech_token (uri, "host=");
-       domain = ntlm_get_authmech_token (uri, "domain=");
 
        if (strlen (auth->header) < sizeof ("NTLM"))
                auth->response = soup_ntlm_request ();
        else {
-               gchar lm_hash [21], nt_hash [21];
-
-               soup_ntlm_lanmanager_hash (uri->passwd, lm_hash);
-               soup_ntlm_nt_hash (uri->passwd, nt_hash);
-
-               auth->response = 
-                       soup_ntlm_response (auth->header,
-                                           uri->user,
-                                           (gchar *) &lm_hash,
-                                           (gchar *) &nt_hash,
-                                           host,
-                                           domain);
-               auth->completed = TRUE;
-       }
+               gchar *host, *domain, *nonce;
+
+               host   = ntlm_get_authmech_token (uri, "host=");
+               domain = ntlm_get_authmech_token (uri, "domain=");
+
+               if (!soup_ntlm_parse_challenge (auth->header,
+                                               &nonce,
+                                               domain ? NULL : &domain))
+                       auth->response = NULL;
+               else {
+                       auth->response = 
+                               soup_ntlm_response (nonce,
+                                                   uri->user,
+                                                   uri->passwd,
+                                                   host,
+                                                   domain);
+                       g_free (nonce);
+               }
 
-       g_free (host);
-       g_free (domain);
+               g_free (host);
+               g_free (domain);
+
+               /* Set this now so that if the server returns 401,
+                * soup will fail instead of looping (since that
+                * probably means the password was incorrect).
+                */
+               sa->status = SOUP_AUTH_STATUS_SUCCESSFUL;
+       }
 
        g_free (auth->header);
        auth->header = NULL;
@@ -587,7 +553,6 @@ ntlm_new (void)
        auth = g_new0 (SoupAuthNTLM, 1);
        auth->auth.type = SOUP_AUTH_TYPE_NTLM;
 
-       auth->auth.compare_func = ntlm_compare_func;
        auth->auth.parse_func = ntlm_parse;
        auth->auth.init_func = ntlm_init;
        auth->auth.auth_func = ntlm_auth;
@@ -626,6 +591,33 @@ soup_auth_lookup (SoupContext  *ctx)
 }
 
 void
+soup_auth_invalidate (SoupAuth *auth, SoupContext *ctx)
+{
+       SoupHost *server;
+       const SoupUri *uri;
+       SoupAuth *old_auth;
+       char *old_path;
+
+       g_return_if_fail (ctx != NULL);
+       g_return_if_fail (auth != NULL);
+
+       server = ctx->server;
+
+       if (!server->valid_auths)
+               return;
+
+       uri = soup_context_get_uri (ctx);
+       if (g_hash_table_lookup_extended (server->valid_auths,
+                                         uri->path,
+                                         (gpointer *) &old_path,
+                                         (gpointer *) &old_auth)) {
+               g_hash_table_remove (server->valid_auths, old_path);
+               g_free (old_path);
+               soup_auth_free (old_auth);
+       }
+}
+
+void
 soup_auth_set_context (SoupAuth *auth, SoupContext *ctx)
 {
        SoupHost *server;
@@ -647,6 +639,9 @@ soup_auth_set_context (SoupAuth *auth, SoupContext *ctx)
                                               uri->path,
                                               (gpointer *) &old_path,
                                               (gpointer *) &old_auth)) {
+               if (auth == old_auth)
+                       return;
+
                g_hash_table_remove (server->valid_auths, old_path);
                g_free (old_path);
                soup_auth_free (old_auth);
@@ -673,7 +668,8 @@ static AuthScheme known_auth_schemes [] = {
 };
 
 SoupAuth *
-soup_auth_new_from_header_list (const GSList  *vals)
+soup_auth_new_from_header_list (const SoupUri *uri,
+                               const GSList  *vals)
 {
        gchar *header = NULL;
        AuthScheme *scheme = NULL, *iter;
@@ -682,9 +678,14 @@ soup_auth_new_from_header_list (const GSList  *vals)
        g_return_val_if_fail (vals != NULL, NULL);
 
        while (vals) {
-               for (iter = known_auth_schemes; iter->scheme; iter++) {
-                       gchar *tryheader = vals->data;
+               gchar *tryheader = vals->data;
 
+               for (iter = known_auth_schemes; iter->scheme; iter++) {
+                       if (uri->authmech &&
+                           g_strncasecmp (uri->authmech,
+                                          iter->scheme,
+                                          strlen (iter->scheme)) != 0)
+                               continue;
                        if (!g_strncasecmp (tryheader, 
                                            iter->scheme, 
                                            strlen (iter->scheme))) {
@@ -706,8 +707,7 @@ soup_auth_new_from_header_list (const GSList  *vals)
        auth = scheme->ctor ();
        if (!auth) return NULL;
 
-       if (!auth->compare_func || 
-           !auth->parse_func || 
+       if (!auth->parse_func || 
            !auth->init_func || 
            !auth->auth_func || 
            !auth->free_func)
@@ -744,18 +744,3 @@ soup_auth_free (SoupAuth *auth)
        g_free (auth->realm);
        auth->free_func (auth);
 }
-
-gboolean
-soup_auth_invalidates_prior (SoupAuth *new_auth, SoupAuth *old_auth)
-{
-       g_return_val_if_fail (new_auth != NULL, FALSE);
-       g_return_val_if_fail (old_auth != NULL, TRUE);
-
-       if (new_auth == old_auth) 
-               return FALSE;
-
-       if (new_auth->type != old_auth->type) 
-               return TRUE;
-
-       return new_auth->compare_func (new_auth, old_auth);
-}
index 75a4945..f163453 100644 (file)
 #include <libsoup/soup-message.h>
 #include <libsoup/soup-misc.h>
 
-typedef struct _SoupAuth SoupAuth;
+typedef   enum _SoupAuthStatus SoupAuthStatus;
+typedef struct _SoupAuth       SoupAuth;
+
+enum _SoupAuthStatus {
+       SOUP_AUTH_STATUS_INVALID = 0,
+       SOUP_AUTH_STATUS_PENDING,
+       SOUP_AUTH_STATUS_FAILED,
+       SOUP_AUTH_STATUS_SUCCESSFUL
+};
+
 struct _SoupAuth {
        SoupAuthType  type;
        gchar        *realm;
 
-       gboolean (*compare_func) (SoupAuth      *a, 
-                                 SoupAuth      *b);
+       SoupAuthStatus status;
+       SoupMessage *controlling_msg;
 
        void     (*parse_func)   (SoupAuth      *auth,
                                  const gchar   *header);
@@ -40,7 +49,11 @@ SoupAuth *soup_auth_lookup                 (SoupContext   *ctx);
 void      soup_auth_set_context            (SoupAuth      *auth,
                                            SoupContext   *ctx);
 
-SoupAuth *soup_auth_new_from_header_list   (const GSList  *header);
+void      soup_auth_invalidate             (SoupAuth      *auth,
+                                           SoupContext   *ctx);
+
+SoupAuth *soup_auth_new_from_header_list   (const SoupUri *uri,
+                                           const GSList  *header);
 
 void      soup_auth_initialize             (SoupAuth      *auth,
                                            const SoupUri *uri);
@@ -50,7 +63,4 @@ void      soup_auth_free                   (SoupAuth      *auth);
 gchar    *soup_auth_authorize              (SoupAuth      *auth, 
                                            SoupMessage   *msg);
 
-gboolean  soup_auth_invalidates_prior      (SoupAuth      *new_auth, 
-                                           SoupAuth      *old_auth);
-
 #endif /* SOUP_AUTH_H */
index 28d2c5f..bd21d69 100644 (file)
@@ -1,6 +1,6 @@
 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
 /*
- * soup-context.c: Asyncronous Callback-based SOAP Request Queue.
+ * soup-context.c: Asyncronous Callback-based HTTP Request Queue.
  *
  * Authors:
  *      Alex Graveley (alex@helixcode.com)
 #include <config.h>
 #endif
 
-#ifdef HAVE_UNISTD_H
 #include <unistd.h>
-#endif
-
 #include <string.h>
 #include <stdlib.h>
 #include <glib.h>
 #include <fcntl.h>
 #include <sys/types.h>
 
-#ifdef HAVE_SYS_SOCKET_H
 #include <sys/socket.h>
-#endif
-
-#ifdef HAVE_NETINET_TCP_H
 #include <netinet/tcp.h>
-#endif
-#ifdef HAVE_NETINET_IN_H
 #include <netinet/in.h>
-#endif
 
 #include "soup-auth.h"
 #include "soup-context.h"
@@ -85,17 +75,31 @@ static guint
 soup_context_uri_hash (gconstpointer key)
 {
        const SoupUri *uri = key;
-       guint ret = 0;
-
-       ret += uri->protocol;
-       ret += g_str_hash (uri->path ? uri->path : "");
-       ret += g_str_hash (uri->querystring ? uri->querystring : "");
-       ret += g_str_hash (uri->user ? uri->user : "");
-       ret += g_str_hash (uri->passwd ? uri->passwd : "");
+       guint ret;
+
+       ret = uri->protocol;
+       if (uri->path)
+               ret += g_str_hash (uri->path);
+       if (uri->querystring)
+               ret += g_str_hash (uri->querystring);
+       if (uri->user)
+               ret += g_str_hash (uri->user);
+       if (uri->passwd)
+               ret += g_str_hash (uri->passwd);
 
        return ret;
 }
 
+static inline gboolean
+parts_equal (const char *one, const char *two)
+{
+       if (!one && !two)
+               return TRUE;
+       if (!one || !two)
+               return FALSE;
+       return !strcmp (one, two);
+}
+
 /**
  * soup_context_uri_equal:
  * @v1: a %SoupUri
@@ -110,18 +114,18 @@ soup_context_uri_equal (gconstpointer v1, gconstpointer v2)
        const SoupUri *one = v1;
        const SoupUri *two = v2;
 
-       if (one->protocol == two->protocol &&
-           !strcmp (one->path ? one->path : "",
-                    two->path ? two->path : "") &&
-           !strcmp (one->querystring ? one->querystring : "",
-                    two->querystring ? two->querystring : "") &&
-           !strcmp (one->user ? one->user : "",
-                    two->user ? two->user : "") &&
-           !strcmp (one->passwd ? one->passwd : "",
-                    two->passwd ? two->passwd : ""))
-               return TRUE;
+       if (one->protocol != two->protocol)
+               return FALSE;
+       if (!parts_equal (one->path, two->path))
+               return FALSE;
+       if (!parts_equal (one->user, two->user))
+               return FALSE;
+       if (!parts_equal (one->passwd, two->passwd))
+               return FALSE;
+       if (!parts_equal (one->querystring, two->querystring))
+               return FALSE;
 
-       return FALSE;
+       return TRUE;
 }
 
 /**
@@ -545,8 +549,10 @@ soup_context_cancel_connect (SoupConnectId tag)
 
        if (data->timeout_tag)
                g_source_remove (data->timeout_tag);
-       else if (data->connect_tag)
+       else if (data->connect_tag) {
+               connection_count--;
                soup_socket_connect_cancel (data->connect_tag);
+       }
 
        g_free (data);
 }
@@ -590,14 +596,12 @@ soup_connection_release (SoupConnection *conn)
 static void
 soup_connection_setup_socket (GIOChannel *channel)
 {
-#if TCP_NODELAY && !SOUP_WIN32
        int yes = 1, flags = 0, fd = g_io_channel_unix_get_fd (channel);
 
        setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &yes, sizeof(yes));
 
        flags = fcntl(fd, F_GETFL, 0);
        fcntl (fd, F_SETFL, flags | O_NONBLOCK);
-#endif
 }
 
 /**
@@ -628,7 +632,7 @@ soup_connection_get_iochannel (SoupConnection *conn)
 }
 
 /**
- * soup_connection_set_keepalive:
+ * soup_connection_set_keep_alive:
  * @conn: a %SoupConnection.
  * @keep_alive: boolean keep-alive value.
  *
@@ -642,7 +646,7 @@ soup_connection_set_keep_alive (SoupConnection *conn, gboolean keep_alive)
 }
 
 /**
- * soup_connection_set_keepalive:
+ * soup_connection_is_keep_alive:
  * @conn: a %SoupConnection.
  *
  * Returns the keep-alive flag for the %SoupConnection pointed to by
index c10fe21..e0b008a 100644 (file)
@@ -1,6 +1,6 @@
 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
 /*
- * soup-context.h: Asyncronous Callback-based SOAP Request Queue.
+ * soup-context.h: Asyncronous Callback-based HTTP Request Queue.
  *
  * Authors:
  *      Alex Graveley (alex@helixcode.com)
index 99cf232..6924f39 100644 (file)
@@ -1,6 +1,6 @@
 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
 /*
- * soup-headers.c: Asyncronous Callback-based SOAP Request Queue.
+ * soup-headers.c: Asyncronous Callback-based HTTP Request Queue.
  *
  * Authors:
  *      Alex Graveley (alex@ximian.com)
@@ -121,7 +121,7 @@ soup_headers_parse_request (gchar            *str,
        guint http_major, http_minor;
        gchar method[16], path[1024];
 
-       if (!str || !*str || len < sizeof ("GET / HTTP/0.0\r\n\r\n"))
+       if (!str || !*str || len < sizeof ("GET / HTTP/0.0\r\n\r\n") - 1)
                goto THROW_MALFORMED_HEADER;
 
        if (sscanf (str, 
index 5f33480..70aaa7b 100644 (file)
@@ -1,6 +1,6 @@
 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
 /*
- * soup-headers.h: Asyncronous Callback-based SOAP Request Queue.
+ * soup-headers.h: Asyncronous Callback-based HTTP Request Queue.
  *
  * Authors:
  *      Alex Graveley (alex@ximian.com)
index 654ee19..16e87fc 100644 (file)
@@ -1,6 +1,6 @@
 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
 /*
- * soup-message.c: Asyncronous Callback-based SOAP Request Queue.
+ * soup-message.c: Asyncronous Callback-based HTTP Request Queue.
  *
  * Authors:
  *      Alex Graveley (alex@helixcode.com)
 #include "soup-queue.h"
 #include "soup-transfer.h"
 
-typedef struct {
-       SoupHandlerEvent   type;
-       gchar             *name;
-       SoupHandlerWhen    order;
-       SoupHandlerFilter  filter;
-       SoupHandlerFn      handler_cb;
-       gpointer           user_data;
-
-       SoupMessage       *msg; 
-       guint              timeout_tag;
-} SoupHandlerData;
-
 /**
  * soup_message_new:
  * @context: a %SoupContext for the destination endpoint.
@@ -193,6 +181,11 @@ soup_message_cleanup (SoupMessage *req)
                                                  req->connection);
                req->priv->read_tag = 0;
                req->connection = NULL;
+               /* 
+                * The buffer doesn't belong to us until the message is 
+                * finished.
+                */
+               req->response.owner = SOUP_BUFFER_STATIC;
        }
 
        if (req->priv->read_tag) {
@@ -219,22 +212,6 @@ soup_message_cleanup (SoupMessage *req)
 }
 
 static void
-handler_free (SoupHandlerData *data)
-{
-       if (data->filter.type == SOUP_FILTER_HEADER)
-               g_free ((gchar *) data->filter.data.header);
-
-       if (data->timeout_tag)
-               g_source_remove (data->timeout_tag);
-
-       data->msg->priv->content_handlers = 
-               g_slist_remove (data->msg->priv->content_handlers, data);
-
-       g_free (data->name);
-       g_free (data);
-}
-
-static void
 finalize_message (SoupMessage *req)
 {
        if (req->context)
@@ -251,10 +228,8 @@ finalize_message (SoupMessage *req)
        soup_message_clear_headers (req->response_headers);
        g_hash_table_destroy (req->response_headers);
 
-       while (req->priv->content_handlers) {
-               SoupHandlerData *data = req->priv->content_handlers->data;
-               handler_free (data);
-       }
+       g_slist_foreach (req->priv->content_handlers, (GFunc) g_free, NULL);
+       g_slist_free (req->priv->content_handlers);
 
        g_free ((gchar *) req->errorphrase);
        g_free (req->priv);
@@ -322,6 +297,11 @@ void
 soup_message_cancel (SoupMessage *msg) 
 {
        soup_message_set_error (msg, SOUP_ERROR_CANCELLED);
+
+       /* Kill the connection as a safety measure */
+       if (msg->connection)
+               soup_connection_set_keep_alive (msg->connection, FALSE);
+
        soup_message_issue_callback (msg);
 }
 
@@ -513,6 +493,122 @@ soup_message_foreach_remove_header (GHashTable        *hash,
 }
 
 /**
+ * soup_message_set_request_header:
+ * @req: a %SoupMessage.
+ * @name: header name.
+ * @value: header value.
+ *
+ * ** DEPRECATED **
+ * 
+ * Adds a new transport header to be sent on an outgoing request. Passing a NULL
+ * @value will remove all headers with a name equal to @name.
+ */
+void
+soup_message_set_request_header (SoupMessage *req,
+                                const gchar *name,
+                                const gchar *value) 
+{
+       g_return_if_fail (req != NULL);
+       g_return_if_fail (name != NULL || name [0] != '\0');
+
+       g_warning ("soup_message_set_request_header is DEPRECATED. Use "
+                  "soup_message_add_header, with msg->request_headers as "
+                  "the first argument.\n");
+
+       soup_message_add_header (req->request_headers, name, value);
+}
+
+/**
+ * soup_message_get_request_header:
+ * @req: a %SoupMessage.
+ * @name: header name.
+ * 
+ * ** DEPRECATED **
+ * 
+ * Lookup the first transport request header with a key equal to @name.
+ *
+ * Return value: the header's value or NULL if not found.
+ */
+const gchar *
+soup_message_get_request_header (SoupMessage *req,
+                                const gchar *name) 
+{
+       GSList *vals;
+       g_return_val_if_fail (req != NULL, NULL);
+       g_return_val_if_fail (name != NULL || name [0] != '\0', NULL);
+
+       g_warning ("soup_message_get_request_header is DEPRECATED. Use "
+                  "soup_message_get_header, with msg->request_headers as "
+                  "the first argument.\n");
+
+       if (req->request_headers) {
+               vals = g_hash_table_lookup (req->request_headers, name);
+               if (vals) 
+                       return vals->data;
+       }
+
+       return NULL;
+}
+
+/**
+ * soup_message_set_response_header:
+ * @req: a %SoupMessage.
+ * @name: header name.
+ * @value: header value.
+ * 
+ * ** DEPRECATED **
+ * 
+ * Adds a new transport header to be sent on an outgoing response. Passing a
+ * NULL @value will remove all headers with a name equal to @name.
+ */
+void
+soup_message_set_response_header (SoupMessage *req,
+                                 const gchar *name,
+                                 const gchar *value) 
+{
+       g_return_if_fail (req != NULL);
+       g_return_if_fail (name != NULL || name [0] != '\0');
+
+       g_warning ("soup_message_set_response_header is DEPRECATED. Use "
+                  "soup_message_add_header, with msg->response_headers as "
+                  "the first argument.\n");
+
+       soup_message_add_header (req->response_headers, name, value);
+}
+
+/**
+ * soup_message_get_response_header:
+ * @req: a %SoupMessage.
+ * @name: header name.
+ * 
+ * ** DEPRECATED **
+ * 
+ * Lookup the transport response header with a key equal to @name.
+ *
+ * Return value: the header's value or NULL if not found.
+ */
+const gchar *
+soup_message_get_response_header (SoupMessage *req,
+                                 const gchar *name) 
+{
+       GSList *vals;
+       g_return_val_if_fail (req != NULL, NULL);
+       g_return_val_if_fail (name != NULL || name [0] != '\0', NULL);
+
+       g_warning ("soup_message_get_response_header is DEPRECATED. Use "
+                  "soup_message_get_header, with msg->response_headers as "
+                  "the first argument.\n");
+
+       if (req->response_headers) {
+               vals = g_hash_table_lookup (req->response_headers, name);
+               if (vals) 
+                       return vals->data;
+       }
+
+       return NULL;
+}
+
+/**
  * soup_message_queue:
  * @req: a %SoupMessage.
  * @callback: a %SoupCallbackFn which will be called after the message completes
@@ -604,6 +700,7 @@ requeue_read_finished (const SoupDataBuffer *buf,
        if (!soup_connection_is_keep_alive (msg->connection))
                requeue_read_error (FALSE, data);
        else {
+               g_free (data);
                msg->connection = NULL;
 
                soup_queue_message (msg, 
@@ -677,15 +774,56 @@ soup_message_send (SoupMessage *msg)
        return msg->errorclass;
 }
 
-static SoupHandlerResult 
-authorize_handler (SoupMessage *msg, gpointer user_data)
+static void
+maybe_validate_auth (SoupMessage *msg, gpointer user_data)
 {
        gboolean proxy = GPOINTER_TO_INT (user_data);
+       int auth_failure;
+       SoupContext *ctx;
+       SoupAuth *auth;
+
+       if (proxy) {
+               ctx = soup_get_proxy ();
+               auth_failure = SOUP_ERROR_PROXY_UNAUTHORIZED; /* 407 */
+       }
+       else {
+               ctx = msg->context;
+               auth_failure = SOUP_ERROR_UNAUTHORIZED; /* 401 */
+       }
+
+       auth = soup_auth_lookup (ctx);
+       if (!auth)
+               return;
+
+       if (msg->errorcode == auth_failure) {
+               /* Pass through */
+       }
+       else if (msg->errorclass == SOUP_ERROR_CLASS_SERVER_ERROR) {
+               /* 
+                * We have no way of knowing whether our auth is any good
+                * anymore, so just invalidate it and start from the
+                * beginning next time.
+                */
+               soup_auth_invalidate (auth, ctx);
+       }
+       else {
+               auth->status = SOUP_AUTH_STATUS_SUCCESSFUL;
+               auth->controlling_msg = NULL;
+       }
+} /* maybe_validate_auth */
+
+static void 
+authorize_handler (SoupMessage *msg, gboolean proxy)
+{
        const GSList *vals;
-       SoupAuth *auth, *old_auth;
+       SoupAuth *auth;
        SoupContext *ctx;
        const SoupUri *uri;
 
+       if (msg->connection->auth &&
+           msg->connection->auth->status == SOUP_AUTH_STATUS_SUCCESSFUL)
+               goto THROW_CANT_AUTHENTICATE;
+
        ctx = proxy ? soup_get_proxy () : msg->context;
        uri = soup_context_get_uri (ctx);
 
@@ -695,18 +833,59 @@ authorize_handler (SoupMessage *msg, gpointer user_data)
                                                     "WWW-Authenticate");
        if (!vals) goto THROW_CANT_AUTHENTICATE;
 
-        auth = soup_auth_new_from_header_list (vals);
+       auth = soup_auth_lookup (ctx);
+       if (auth) {
+               g_assert (auth->status != SOUP_AUTH_STATUS_INVALID);
+
+               if (auth->status == SOUP_AUTH_STATUS_PENDING) {
+                       if (auth->controlling_msg == msg) {
+                               auth->status = SOUP_AUTH_STATUS_FAILED;
+                               goto THROW_CANT_AUTHENTICATE;
+                       }
+                       else {
+                               soup_message_requeue (msg);
+                               return;
+                       }
+               }
+               else if (auth->status == SOUP_AUTH_STATUS_FAILED ||
+                        auth->status == SOUP_AUTH_STATUS_SUCCESSFUL) {
+                       /*
+                        * We've failed previously, but we'll give it
+                        * another go, or we've been successful
+                        * previously, but it's not working anymore.
+                        *
+                        * Invalidate the auth, so it's removed from the
+                        * hash and try it again as if we never had it
+                        * in the first place.
+                        */
+                       soup_auth_invalidate (auth, ctx);
+                       soup_message_requeue (msg);
+                       return;
+               }
+       }
+
        if (!auth) {
-               soup_message_set_error_full (
-                       msg, 
-                       proxy ? 
-                               SOUP_ERROR_CANT_AUTHENTICATE_PROXY : 
-                               SOUP_ERROR_CANT_AUTHENTICATE,
-                       proxy ? 
-                               "Unknown authentication scheme required by "
-                               "proxy" :
-                               "Unknown authentication scheme required");
-               return SOUP_HANDLER_RESTART;
+               auth = soup_auth_new_from_header_list (uri, vals);
+
+               if (!auth) {
+                       soup_message_set_error_full (
+                               msg, 
+                               proxy ? 
+                                       SOUP_ERROR_CANT_AUTHENTICATE_PROXY : 
+                                       SOUP_ERROR_CANT_AUTHENTICATE,
+                               proxy ? 
+                                       "Unknown authentication scheme "
+                                       "required by proxy" :
+                                       "Unknown authentication scheme "
+                                       "required");
+                       return;
+               }
+
+               auth->status = SOUP_AUTH_STATUS_PENDING;
+               auth->controlling_msg = msg;
+               soup_message_add_handler (msg, SOUP_HANDLER_PRE_BODY,
+                                         maybe_validate_auth,
+                                         GINT_TO_POINTER (proxy));
        }
 
        /*
@@ -724,47 +903,38 @@ authorize_handler (SoupMessage *msg, gpointer user_data)
        }
 
        /*
-        * Initialize with auth data (possibly returned from auth callback).
+        * Initialize with auth data (possibly returned from 
+        * auth callback).
         */
        soup_auth_initialize (auth, uri);
 
-       if (auth->type == SOUP_AUTH_TYPE_NTLM)
-               old_auth = msg->connection->auth;
-       else
-               old_auth = soup_auth_lookup (ctx);
-
-       if (old_auth) {
-               if (!soup_auth_invalidates_prior (auth, old_auth)) {
-                       soup_auth_free (auth);
-                       goto THROW_CANT_AUTHENTICATE;
-               }
-       }
-
        if (auth->type == SOUP_AUTH_TYPE_NTLM) {
-               if (old_auth) 
+               SoupAuth *old_auth = msg->connection->auth;
+
+               if (old_auth)
                        soup_auth_free (old_auth);
                msg->connection->auth = auth;
        } else
                soup_auth_set_context (auth, ctx);
 
-        return SOUP_HANDLER_RESEND;
+       soup_message_requeue (msg);
+
+        return;
 
  THROW_CANT_AUTHENTICATE:
        soup_message_set_error (msg, 
                                proxy ? 
                                        SOUP_ERROR_CANT_AUTHENTICATE_PROXY : 
                                        SOUP_ERROR_CANT_AUTHENTICATE);
-       return SOUP_HANDLER_RESTART;
 }
 
-static SoupHandlerResult  
+static void 
 redirect_handler (SoupMessage *msg, gpointer user_data)
 {
        const gchar *new_loc;
 
        if (msg->errorclass != SOUP_ERROR_CLASS_REDIRECT || 
-           msg->priv->msg_flags & SOUP_MESSAGE_NO_REDIRECT) 
-               return SOUP_HANDLER_CONTINUE;
+           msg->priv->msg_flags & SOUP_MESSAGE_NO_REDIRECT) return;
 
        new_loc = soup_message_get_header (msg->response_headers, "Location");
 
@@ -798,141 +968,96 @@ redirect_handler (SoupMessage *msg, gpointer user_data)
                soup_message_set_context (msg, new_ctx);
                soup_context_unref (new_ctx);
 
-               return SOUP_HANDLER_RESEND;
+               soup_message_requeue (msg);
        }
 
-       return SOUP_HANDLER_CONTINUE;
+       return;
 
  INVALID_REDIRECT:
        soup_message_set_error_full (msg, 
                                     SOUP_ERROR_MALFORMED,
                                     "Invalid Redirect URL");
-       return SOUP_HANDLER_RESTART;
 }
 
+typedef enum {
+       RESPONSE_HEADER_HANDLER = 1,
+       RESPONSE_ERROR_CODE_HANDLER,
+       RESPONSE_ERROR_CLASS_HANDLER
+} SoupHandlerKind;
+
+typedef struct {
+       SoupHandlerType   type;
+       SoupCallbackFn    handler_cb;
+       gpointer          user_data;
+
+       SoupHandlerKind   kind;
+       union {
+               guint             errorcode;
+               SoupErrorClass    errorclass;
+               const gchar      *header;
+       } data;
+} SoupHandlerData;
+
 static SoupHandlerData global_handlers [] = {
        /* 
         * Handle redirect response codes 300, 301, 302, 303, and 305.
         */
        {
-               SOUP_HANDLER_HEADERS,
-               "redirect",
-               0,
-               { 
-                       SOUP_FILTER_HEADER,
-                       {
-                               (guint) "Location"
-                       },
-               },
+               SOUP_HANDLER_PRE_BODY,
                redirect_handler, 
                NULL, 
+               RESPONSE_HEADER_HANDLER, 
+               { (guint) "Location" }
        },
        /* 
         * Handle authorization.
         */
        {
-               SOUP_HANDLER_HEADERS,
-               "authenticate",
-               0,
-               { 
-                       SOUP_FILTER_ERROR_CODE,
-                       {
-                               401
-                       },
-               },
-               authorize_handler, 
+               SOUP_HANDLER_PRE_BODY,
+               (SoupCallbackFn) authorize_handler, 
                GINT_TO_POINTER (FALSE), 
+               RESPONSE_ERROR_CODE_HANDLER, 
+               { 401 }
        },
        /* 
         * Handle proxy authorization.
         */
        {
-               SOUP_HANDLER_HEADERS,
-               "proxy-authenticate",
-               0,
-               { 
-                       SOUP_FILTER_ERROR_CODE,
-                       {
-                               407
-                       },
-               },
-               authorize_handler, 
+               SOUP_HANDLER_PRE_BODY,
+               (SoupCallbackFn) authorize_handler, 
                GINT_TO_POINTER (TRUE), 
+               RESPONSE_ERROR_CODE_HANDLER, 
+               { 407 }
        },
        { 0 }
 };
 
-static inline SoupHandlerResult 
-run_handler (SoupMessage      *msg, 
-            SoupHandlerEvent  invoke_type, 
-            SoupHandlerEvent  when, 
-            SoupHandlerData  *data)
+static inline void 
+run_handler (SoupMessage     *msg, 
+            SoupHandlerType  invoke_type, 
+            SoupHandlerData *data)
 {
-       SoupHandlerResult result;
+       if (data->type != invoke_type) return;
 
-       if (data->type != invoke_type || data->order != when) 
-               return SOUP_HANDLER_CONTINUE;
-
-       switch (data->filter.type) {
-       case SOUP_FILTER_HEADER:
+       switch (data->kind) {
+       case RESPONSE_HEADER_HANDLER:
                if (!soup_message_get_header (msg->response_headers,
-                                             data->filter.data.header))
-                       return SOUP_HANDLER_CONTINUE;
-               break;
-       case SOUP_FILTER_ERROR_CODE:
-               if (msg->errorcode != data->filter.data.errorcode) 
-                       return SOUP_HANDLER_CONTINUE;
-               break;
-       case SOUP_FILTER_ERROR_CLASS:
-               if (msg->errorclass != data->filter.data.errorclass) 
-                       return SOUP_HANDLER_CONTINUE;
-               break;
-       case SOUP_FILTER_TIMEOUT:
-               return SOUP_HANDLER_CONTINUE;
-       default:
-               break;
-       }
-
-       result = (*data->handler_cb) (msg, data->user_data);
-
-       switch (result) {
-       case SOUP_HANDLER_STOP:
-               if (invoke_type == SOUP_HANDLER_FINISHED && 
-                   msg->errorclass != SOUP_ERROR_CLASS_INFORMATIONAL)
-                       soup_message_issue_callback (msg);
+                                             data->data.header))
+                       return;
                break;
-       case SOUP_HANDLER_KILL:
-               soup_message_issue_callback (msg);
+       case RESPONSE_ERROR_CODE_HANDLER:
+               if (msg->errorcode != data->data.errorcode) return;
                break;
-       case SOUP_HANDLER_RESEND:
-               if (msg->status != SOUP_STATUS_QUEUED)
-                       soup_message_queue (msg,
-                                           msg->priv->callback,
-                                           msg->priv->user_data);
+       case RESPONSE_ERROR_CLASS_HANDLER:
+               if (msg->errorclass != data->data.errorclass) return;
                break;
        default:
-               if (msg->status == SOUP_STATUS_QUEUED)
-                       result = SOUP_HANDLER_RESEND;
                break;
        }
 
-       return result;
+       (*data->handler_cb) (msg, data->user_data);
 }
 
-#define PROCESS_HANDLER_RESULT(result) ({ \
-       switch (result) {                 \
-       case SOUP_HANDLER_STOP:           \
-               return FALSE;             \
-       case SOUP_HANDLER_KILL:           \
-       case SOUP_HANDLER_RESEND:         \
-               return TRUE;              \
-       case SOUP_HANDLER_RESTART:        \
-               goto RESTART;             \
-       default:                          \
-               break;                    \
-       }                                 \
-})
-
 /*
  * Run each handler with matching criteria (first per-message then global
  * handlers). If a handler requeues a message, we stop processing and terminate
@@ -945,55 +1070,34 @@ run_handler (SoupMessage      *msg,
  * processing.  
  */
 gboolean
-soup_message_run_handlers (SoupMessage *msg, SoupHandlerEvent invoke_type)
+soup_message_run_handlers (SoupMessage *msg, SoupHandlerType invoke_type)
 {
        GSList *list;
        SoupHandlerData *data;
-       SoupHandlerResult result;
 
        g_return_val_if_fail (msg != NULL, FALSE);
 
- RESTART:
-       /*
-        * Pre-Global handlers
-        */
        for (list = msg->priv->content_handlers; list; list = list->next) {
                data = list->data;
-               result = run_handler (msg, 
-                                     invoke_type, 
-                                     SOUP_HANDLER_FIRST, 
-                                     data);
-               PROCESS_HANDLER_RESULT (result);
+
+               run_handler (msg, invoke_type, data);
+
+               if (msg->status == SOUP_STATUS_QUEUED ||
+                   msg->status == SOUP_STATUS_CONNECTING) return TRUE;
        }
 
-       /*
-        * Global handlers
-        */
        for (data = global_handlers; data->type; data++) {
-               result = run_handler (msg, 
-                                     invoke_type, 
-                                     0, 
-                                     data);
-               PROCESS_HANDLER_RESULT (result);
-       }
+               run_handler (msg, invoke_type, data);
 
-       /*
-        * Post-Global handlers
-        */
-       for (list = msg->priv->content_handlers; list; list = list->next) {
-               data = list->data;
-               result = run_handler (msg, 
-                                     invoke_type, 
-                                     SOUP_HANDLER_LAST, 
-                                     data);
-               PROCESS_HANDLER_RESULT (result);
+               if (msg->status == SOUP_STATUS_QUEUED ||
+                   msg->status == SOUP_STATUS_CONNECTING) return TRUE;
        }
 
        /*
-        * Issue final callback if the invoke_type is FINISHED and the error
+        * Issue final callback if the invoke_type is POST_BODY and the error
         * class is not INFORMATIONAL. 
         */
-       if (invoke_type == SOUP_HANDLER_FINISHED && 
+       if (invoke_type == SOUP_HANDLER_POST_BODY && 
            msg->errorclass != SOUP_ERROR_CLASS_INFORMATIONAL) {
                soup_message_issue_callback (msg);
                return TRUE;
@@ -1002,201 +1106,146 @@ soup_message_run_handlers (SoupMessage *msg, SoupHandlerEvent invoke_type)
        return FALSE;
 }
 
-static gboolean
-timeout_handler (gpointer user_data)
+static void 
+add_handler (SoupMessage      *msg,
+            SoupHandlerType   type,
+            SoupCallbackFn    handler_cb,
+            gpointer          user_data,
+            SoupHandlerKind   kind,
+            const gchar      *header,
+            guint             errorcode,
+            guint             errorclass)
 {
-       SoupHandlerData *data = user_data;
-       SoupMessage *msg = data->msg;
-       SoupHandlerResult result;
-
-       switch (data->type) {
-       case SOUP_HANDLER_PREPARE:
-               if (msg->status >= SOUP_STATUS_SENDING_REQUEST)
-                       goto REMOVE_SOURCE;
-       case SOUP_HANDLER_HEADERS:
-       case SOUP_HANDLER_DATA:
-               if (msg->status >= SOUP_STATUS_READING_RESPONSE &&
-                   g_hash_table_size (msg->response_headers) > 0)
-                       goto REMOVE_SOURCE;
-       case SOUP_HANDLER_FINISHED:
-               if (msg->status == SOUP_STATUS_FINISHED)
-                       goto REMOVE_SOURCE;
-       }
+       SoupHandlerData *data;
 
-       result = (*data->handler_cb) (msg, data->user_data);
+       data = g_new0 (SoupHandlerData, 1);
+       data->type = type;
+       data->handler_cb = handler_cb;
+       data->user_data = user_data;
+       data->kind = kind;
 
-       switch (result) {
-       case SOUP_HANDLER_KILL:
-               soup_message_cancel (msg);
+       switch (kind) {
+       case RESPONSE_HEADER_HANDLER:
+               data->data.header = header;
                break;
-       case SOUP_HANDLER_RESEND:
-               soup_message_queue (msg,
-                                   msg->priv->callback,
-                                   msg->priv->user_data);
+       case RESPONSE_ERROR_CODE_HANDLER:
+               data->data.errorcode = errorcode;
+               break;
+       case RESPONSE_ERROR_CLASS_HANDLER:
+               data->data.errorclass = errorclass;
                break;
        default:
                break;
        }
 
- REMOVE_SOURCE:
-       data->timeout_tag = 0;
-       return FALSE;
+       msg->priv->content_handlers = 
+               g_slist_append (msg->priv->content_handlers, data);
 }
 
 void 
-soup_message_add_handler_full (SoupMessage       *msg,
-                              const gchar       *name,
-                              SoupHandlerEvent   type,
-                              SoupHandlerWhen    order,
-                              SoupHandlerFilter *filter,
-                              SoupHandlerFn      handler_cb,
-                              gpointer           user_data)
+soup_message_add_header_handler (SoupMessage      *msg,
+                                const gchar      *header,
+                                SoupHandlerType   type,
+                                SoupCallbackFn    handler_cb,
+                                gpointer          user_data)
 {
-       SoupHandlerData *data;
-
        g_return_if_fail (msg != NULL);
-       g_return_if_fail (type != 0);
-       g_return_if_fail (order != 0);
+       g_return_if_fail (header != NULL);
        g_return_if_fail (handler_cb != NULL);
 
-       data = g_new0 (SoupHandlerData, 1);
-       data->type = type;
-       data->handler_cb = handler_cb;
-       data->user_data = user_data;
-       data->name = g_strdup (name);
-       data->order = order;
-       data->msg = msg;
-
-       if (filter) {
-               data->filter.type = filter->type;
-       
-               switch (filter->type) {
-               case SOUP_FILTER_HEADER:
-                       data->filter.data.header = 
-                               g_strdup (filter->data.header);
-                       break;
-               case SOUP_FILTER_ERROR_CODE:
-                       data->filter.data.errorcode = filter->data.errorcode;
-                       break;
-               case SOUP_FILTER_ERROR_CLASS:
-                       data->filter.data.errorclass = filter->data.errorclass;
-                       break;
-               case SOUP_FILTER_TIMEOUT:
-                       data->filter.data.timeout = filter->data.timeout;
-                       data->timeout_tag = 
-                               g_timeout_add (filter->data.timeout * 1000,
-                                              timeout_handler,
-                                              data);
-                       break;
-               default:
-                       break;
-               }
-       }
-
-       msg->priv->content_handlers = 
-               g_slist_append (msg->priv->content_handlers, data);
+       add_handler (msg, 
+                    type, 
+                    handler_cb, 
+                    user_data, 
+                    RESPONSE_HEADER_HANDLER, 
+                    header, 
+                    0,
+                    0);
 }
 
 void 
-soup_message_add_handler (SoupMessage       *msg,
-                         SoupHandlerEvent   type,
-                         SoupHandlerFilter *filter,
-                         SoupHandlerFn      handler_cb,
-                         gpointer           user_data)
+soup_message_add_error_code_handler (SoupMessage      *msg,
+                                    guint             errorcode,
+                                    SoupHandlerType   type,
+                                    SoupCallbackFn    handler_cb,
+                                    gpointer          user_data)
 {
        g_return_if_fail (msg != NULL);
-       g_return_if_fail (type != 0);
+       g_return_if_fail (errorcode != 0);
        g_return_if_fail (handler_cb != NULL);
 
-       soup_message_add_handler_full (msg,
-                                      NULL,
-                                      type,
-                                      SOUP_HANDLER_LAST,
-                                      filter,
-                                      handler_cb,
-                                      user_data);
-}
-
-GSList *
-soup_message_list_handlers (SoupMessage *msg)
-{
-       GSList *ret = NULL, *list;
-
-       g_return_val_if_fail (msg != NULL, NULL);
-
-       for (list = msg->priv->content_handlers; list; list = list->next) {
-               SoupHandlerData *data = list->data;
-               if (data->name)
-                       ret = g_slist_append (ret, data->name);
-       }
-
-       return ret;
+       add_handler (msg, 
+                    type, 
+                    handler_cb, 
+                    user_data, 
+                    RESPONSE_ERROR_CODE_HANDLER, 
+                    NULL, 
+                    errorcode,
+                    0);
 }
 
 void 
-soup_message_remove_handler (SoupMessage       *msg, 
-                            gchar             *name)
+soup_message_add_error_class_handler (SoupMessage      *msg,
+                                     SoupErrorClass    errorclass,
+                                     SoupHandlerType   type,
+                                     SoupCallbackFn    handler_cb,
+                                     gpointer          user_data)
 {
-       GSList *iter;
-
        g_return_if_fail (msg != NULL);
-       g_return_if_fail (name != NULL);
-
-       iter = msg->priv->content_handlers;
-       while (iter) {
-               SoupHandlerData *data = iter->data;
-
-               if (data->name && !g_strcasecmp (data->name, name)) {
-                       handler_free (data);
-                       break;
-               }
+       g_return_if_fail (errorclass != 0);
+       g_return_if_fail (handler_cb != NULL);
 
-               iter = iter->next;
-       }
+       add_handler (msg, 
+                    type, 
+                    handler_cb, 
+                    user_data, 
+                    RESPONSE_ERROR_CLASS_HANDLER, 
+                    NULL, 
+                    0,
+                    errorclass);
 }
 
 void 
-soup_message_remove_handler_by_func (SoupMessage       *msg, 
-                                    SoupHandlerFn      handler_cb)
+soup_message_add_handler (SoupMessage      *msg,
+                         SoupHandlerType   type,
+                         SoupCallbackFn    handler_cb,
+                         gpointer          user_data)
 {
-       GSList *iter;
-
        g_return_if_fail (msg != NULL);
        g_return_if_fail (handler_cb != NULL);
 
-       iter = msg->priv->content_handlers;
-       while (iter) {
-               SoupHandlerData *data = iter->data;
-
-               if (data->handler_cb == handler_cb) {
-                       handler_free (data);
-                       break;
-               }
-
-               iter = iter->next;
-       }
+       add_handler (msg, 
+                    type, 
+                    handler_cb, 
+                    user_data, 
+                    0, 
+                    NULL, 
+                    0,
+                    0);
 }
 
-void 
-soup_message_remove_handler_by_func_and_data (SoupMessage       *msg, 
-                                             SoupHandlerFn      handler_cb,
-                                             gpointer           user_data)
+void
+soup_message_remove_handler (SoupMessage     *msg, 
+                            SoupHandlerType  type,
+                            SoupCallbackFn   handler_cb,
+                            gpointer         user_data)
 {
-       GSList *iter;
-
-       g_return_if_fail (msg != NULL);
-       g_return_if_fail (handler_cb != NULL);
+       GSList *iter = msg->priv->content_handlers;
 
-       iter = msg->priv->content_handlers;
        while (iter) {
                SoupHandlerData *data = iter->data;
 
-               if (data->handler_cb == handler_cb && 
-                   data->user_data == user_data) {
-                       handler_free (data);
+               if (data->handler_cb == handler_cb &&
+                   data->user_data == user_data &&
+                   data->type == type) {
+                       msg->priv->content_handlers = 
+                               g_slist_remove_link (
+                                       msg->priv->content_handlers,
+                                       iter);
+                       g_free (data);
                        break;
                }
-
+               
                iter = iter->next;
        }
 }
index 631da19..c46c6e9 100644 (file)
@@ -1,6 +1,6 @@
 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
 /*
- * soup-message.h: Asyncronous Callback-based SOAP Request Queue.
+ * soup-message.h: Asyncronous Callback-based HTTP Request Queue.
  *
  * Authors:
  *      Alex Graveley (alex@ximian.com)
@@ -173,103 +173,39 @@ guint          soup_message_get_flags           (SoupMessage        *msg);
  * Handler Registration 
  */
 typedef enum {
-       SOUP_HANDLER_PREPARE = 0,
-       SOUP_HANDLER_HEADERS,
-       SOUP_HANDLER_DATA,
-       SOUP_HANDLER_FINISHED,
-} SoupHandlerEvent;
-
-typedef enum {
-       SOUP_FILTER_HEADER      = (1 << 0),
-       SOUP_FILTER_ERROR_CODE  = (1 << 1),
-       SOUP_FILTER_ERROR_CLASS = (1 << 2),
-       SOUP_FILTER_TIMEOUT     = (1 << 3),
-} SoupHandlerFilterType;
-
-typedef struct {
-       gint type;
-
-       union {
-               guint               errorcode;
-               SoupErrorClass      errorclass;
-               const gchar        *header;
-               guint               timeout;
-       } data;
-} SoupHandlerFilter;
-
-typedef enum {
-       /*
-        * Continue processing as normal.
-        */
-       SOUP_HANDLER_CONTINUE,
-
-       /*
-        * Do not process further handlers.  Continue receiving data.
-        */
-       SOUP_HANDLER_STOP,
-
-       /*
-        * do not process further handlers.  Stop receiving data and 
-        * issue final callback.
-        */
-       SOUP_HANDLER_KILL,
-
-       /*
-        * Restart handler processing.  This should be returned if a 
-        * handler changes the message's errorcode.
-        */
-       SOUP_HANDLER_RESTART,
-
-       /*
-        * Requeue the request immediately.  Stop processing handlers 
-        * and do not issue final callback.
-        */
-       SOUP_HANDLER_RESEND
-} SoupHandlerResult;
-
-typedef SoupHandlerResult (*SoupHandlerFn) (SoupMessage *req, 
-                                           gpointer     user_data);
+       SOUP_HANDLER_PRE_BODY = 1,
+       SOUP_HANDLER_BODY_CHUNK,
+       SOUP_HANDLER_POST_BODY
+} SoupHandlerType;
 
 void           soup_message_add_handler         (SoupMessage       *msg,
-                                                SoupHandlerEvent   type,
-                                                SoupHandlerFilter *filter,
-                                                SoupHandlerFn      handler_cb,
+                                                SoupHandlerType    type,
+                                                SoupCallbackFn     handler_cb,
                                                 gpointer           user_data);
 
-typedef enum {
-       /*
-        * Run before global handlers and previously registered message
-        * handlers. 
-        */
-       SOUP_HANDLER_FIRST,
-
-       /*
-        * Run after global handlers and previously registered message
-        * handlers. 
-        */
-       SOUP_HANDLER_LAST
-} SoupHandlerWhen;
+void           soup_message_add_header_handler  (SoupMessage       *msg,
+                                                const gchar       *header,
+                                                SoupHandlerType    type,
+                                                SoupCallbackFn     handler_cb,
+                                                gpointer           user_data);
 
-void           soup_message_add_handler_full    (SoupMessage       *msg,
-                                                const gchar       *name,
-                                                SoupHandlerEvent   type,
-                                                SoupHandlerWhen    order,
-                                                SoupHandlerFilter *filter,
-                                                SoupHandlerFn      handler_cb,
+void           soup_message_add_error_code_handler (
+                                                SoupMessage       *msg,
+                                                guint              errorcode,
+                                                SoupHandlerType    type,
+                                                SoupCallbackFn     handler_cb,
                                                 gpointer           user_data);
 
-GSList        *soup_message_list_handlers       (SoupMessage       *msg);
+void           soup_message_add_error_class_handler (
+                                                SoupMessage       *msg,
+                                                SoupErrorClass     errorclass,
+                                                SoupHandlerType    type,
+                                                SoupCallbackFn     handler_cb,
+                                                gpointer           user_data);
 
 void           soup_message_remove_handler      (SoupMessage       *msg, 
-                                                gchar             *name);
-
-void           soup_message_remove_handler_by_func (
-                                                SoupMessage       *msg, 
-                                                SoupHandlerFn      handler_cb);
-
-void           soup_message_remove_handler_by_func_and_data (
-                                                SoupMessage       *msg, 
-                                                SoupHandlerFn      handler_cb,
+                                                SoupHandlerType    type,
+                                                SoupCallbackFn     handler_cb,
                                                 gpointer           user_data);
 
 /*
@@ -286,4 +222,24 @@ void           soup_message_set_handler_error   (SoupMessage       *msg,
                                                 guint              errcode, 
                                                 const gchar       *errphrase);
 
+/** DEPRECATED API **/
+
+/** DEPRECATED **/
+void           soup_message_set_request_header  (SoupMessage       *req,
+                                                const gchar       *name,
+                                                const gchar       *value);
+
+/** DEPRECATED **/
+const gchar   *soup_message_get_request_header  (SoupMessage       *req,
+                                                const gchar       *name);
+
+/** DEPRECATED **/
+void           soup_message_set_response_header (SoupMessage       *req,
+                                                const gchar       *name,
+                                                const gchar       *value);
+
+/** DEPRECATED **/
+const gchar   *soup_message_get_response_header (SoupMessage       *req,
+                                                const gchar       *name);
+
 #endif /*SOUP_MESSAGE_H*/
index 1310fe5..aa7765c 100644 (file)
@@ -687,6 +687,11 @@ soup_shutdown ()
        soup_queue_shutdown ();
 }
 
+static char *ssl_ca_file   = NULL;
+static char *ssl_ca_dir    = NULL;
+static char *ssl_cert_file = NULL;
+static char *ssl_key_file  = NULL;
+
 /**
  * soup_set_ca_file:
  * @ca_file: the path to a CA file
@@ -695,9 +700,11 @@ soup_shutdown ()
  * peers.
  */
 void
-soup_set_ssl_ca_file (gchar *ca_file)
+soup_set_ssl_ca_file (const gchar *ca_file)
 {
-       putenv (g_strdup_printf ("HTTPS_CA_FILE=%s", ca_file));
+       g_free (ssl_ca_file);
+
+       ssl_ca_file = g_strdup (ca_file);
 }
 
 /**
@@ -708,9 +715,11 @@ soup_set_ssl_ca_file (gchar *ca_file)
  * peers.
  */
 void
-soup_set_ssl_ca_dir (gchar *ca_dir)
+soup_set_ssl_ca_dir (const gchar *ca_dir)
 {
-       putenv (g_strdup_printf ("HTTPS_CA_DIR=%s", ca_dir));
+       g_free (ssl_ca_dir);
+
+       ssl_ca_dir = g_strdup (ca_dir);
 }
 
 /**
@@ -719,13 +728,58 @@ soup_set_ssl_ca_dir (gchar *ca_dir)
  * @key_file: the file containing the SSL private key
  *
  * Specify a SSL client certificate to be used for client
- * authentication with the SOAP server
+ * authentication with the HTTP server
  */
 void
-soup_set_ssl_cert_files (gchar *cert_file, gchar *key_file)
+soup_set_ssl_cert_files (const gchar *cert_file, const gchar *key_file)
 {
-       putenv (g_strdup_printf ("HTTPS_CERT_FILE=%s", cert_file));
-       putenv (g_strdup_printf ("HTTPS_KEY_FILE=%s", key_file));
+       g_free (ssl_cert_file);
+       g_free (ssl_key_file);
+
+       ssl_cert_file = g_strdup (cert_file);
+       ssl_key_file  = g_strdup (key_file);
+}
+
+/**
+ * soup_get_ca_file:
+ *
+ * Return value: A file containing CA certificates to be used to verify
+ * peers.
+ */
+const char *
+soup_get_ssl_ca_file (void)
+{
+       return ssl_ca_file;
+}
+
+/**
+ * soup_get_ca_dir
+ *
+ * Return value: A directory containing CA certificates to be used to verify
+ * peers.
+ */
+const char *
+soup_get_ssl_ca_dir (void)
+{
+       return ssl_ca_dir;
+}
+
+/**
+ * soup_get_ssl_cert_files
+ * @cert_file: the file containing the SSL client certificate
+ * @key_file: the file containing the SSL private key
+ *
+ * Specify a SSL client certificate to be used for client
+ * authentication with the HTTP server
+ */
+void
+soup_get_ssl_cert_files (const gchar **cert_file, const gchar **key_file)
+{
+       if (cert_file)
+               *cert_file = ssl_cert_file;
+
+       if (key_file)
+               *key_file = ssl_key_file;
 }
 
 SoupAuthorizeFn  soup_auth_fn = NULL;
index be80993..ba3aa8c 100644 (file)
@@ -42,12 +42,17 @@ SoupSecurityPolicy soup_get_security_policy  (void);
 
 /* SSL setup routines */
 
-void               soup_set_ssl_ca_file      (gchar       *ca_file);
+void               soup_set_ssl_ca_file      (const gchar *ca_file);
 
-void               soup_set_ssl_ca_dir       (gchar       *ca_dir);
+void               soup_set_ssl_ca_dir       (const gchar *ca_dir);
 
-void               soup_set_ssl_cert_files   (gchar       *cert_file, 
-                                             gchar       *key_file);
+void               soup_set_ssl_cert_files   (const gchar *cert_file, 
+                                             const gchar *key_file);
+
+const char        *soup_get_ssl_ca_file      (void);
+const char        *soup_get_ssl_ca_dir       (void);
+void               soup_get_ssl_cert_files   (const gchar **cert_file,
+                                             const gchar **key_file);
 
 /* Authentication callback */
 
index edadbd9..a951752 100644 (file)
@@ -1,6 +1,6 @@
 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
 /*
- * soup-nss.c: Asyncronous Callback-based SOAP Request Queue.
+ * soup-nss.c: Asyncronous Callback-based HTTP Request Queue.
  *
  * Authors:
  *      Alex Graveley (alex@ximian.com)
@@ -295,7 +295,7 @@ soup_nss_bad_cert (void *data, PRFileDesc *fd)
 }
 
 GIOChannel *
-soup_nss_get_iochannel (GIOChannel *sock)
+soup_nss_get_iochannel (GIOChannel *sock, SoupSSLType type)
 {
        SoupNSSChannel *chan;
        GIOChannel *gchan;
@@ -322,7 +322,10 @@ soup_nss_get_iochannel (GIOChannel *sock)
        }
 
        SSL_OptionSet (fdesc, SSL_SECURITY, PR_TRUE);
-       SSL_OptionSet (fdesc, SSL_HANDSHAKE_AS_CLIENT, PR_TRUE);
+       if (type == SOUP_SSL_TYPE_CLIENT)
+               SSL_OptionSet (fdesc, SSL_HANDSHAKE_AS_CLIENT, PR_TRUE);
+       else
+               SSL_OptionSet (fdesc, SSL_HANDSHAKE_AS_SERVER, PR_TRUE);
        SSL_BadCertHook (fdesc, soup_nss_bad_cert, NULL);
 
        if (SSL_ResetHandshake (fdesc, PR_FALSE) == PR_FAILURE) {
index 1aaa0a4..99ac3fe 100644 (file)
@@ -1,6 +1,6 @@
 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
 /*
- * soup-nss.h: Asyncronous Callback-based SOAP Request Queue.
+ * soup-nss.h: Asyncronous Callback-based HTTP Request Queue.
  *
  * Authors:
  *      Alex Graveley (alex@ximian.com)
@@ -13,8 +13,9 @@
 
 #include <glib.h>
 #include <libsoup/soup-misc.h>
+#include <libsoup/soup-ssl.h>
 
-GIOChannel *soup_nss_get_iochannel       (GIOChannel *sock);
+GIOChannel *soup_nss_get_iochannel       (GIOChannel *sock, SoupSSLType type);
 
 void        soup_nss_set_security_policy (SoupSecurityPolicy policy);
 
index 64f809f..734c7ee 100644 (file)
@@ -44,7 +44,7 @@ static void calc_response         (const guchar        *key,
                          "\x00\x00\x00\x00\x00"
 
 void
-soup_ntlm_lanmanager_hash (const char *password, char hash[21])
+soup_ntlm_lanmanager_hash (const char *password, guchar hash[21])
 {
        guchar lm_password [15];
        DES_KS ks;
@@ -66,7 +66,7 @@ soup_ntlm_lanmanager_hash (const char *password, char hash[21])
 }
 
 void
-soup_ntlm_nt_hash (const char *password, char hash[21])
+soup_ntlm_nt_hash (const char *password, guchar hash[21])
 {
        unsigned char *buf, *p;
 
@@ -90,13 +90,12 @@ typedef struct {
        guchar  zero_pad[2];
 } NTLMString;
 
-#define NTLM_CHALLENGE_NONCE_OFFSET      24
-#define NTLM_CHALLENGE_NONCE_LENGTH       8
-#define NTLM_CHALLENGE_DOMAIN_OFFSET     48
-#define NTLM_CHALLENGE_DOMAIN_LEN_OFFSET 44
+#define NTLM_CHALLENGE_NONCE_OFFSET         24
+#define NTLM_CHALLENGE_NONCE_LENGTH          8
+#define NTLM_CHALLENGE_DOMAIN_STRING_OFFSET 12
 
 #define NTLM_RESPONSE_HEADER "NTLMSSP\x00\x03\x00\x00\x00"
-#define NTLM_RESPONSE_FLAGS "\x82\x01"
+#define NTLM_RESPONSE_FLAGS 0x8202
 
 typedef struct {
         guchar     header[12];
@@ -106,25 +105,16 @@ typedef struct {
        NTLMString domain;
        NTLMString user;
        NTLMString host;
+       NTLMString session_key;
 
-        guint16    msg_len;
-        guchar     zero_pad[2];
-
-        guchar     flags[2];
-        guchar     zero_pad2[2];
+        guint32    flags;
 } NTLMResponse;
 
-#if G_BYTE_ORDER == G_BIG_ENDIAN
-#define LE16(x) (((x & 0xFF) << 8) | ((x >> 8) & 0xFF))
-#else
-#define LE16(x) x
-#endif
-
 static void
 ntlm_set_string (NTLMString *string, int *offset, int len)
 {
-       string->offset = LE16 (*offset);
-       string->length = string->length2 = LE16 (len);
+       string->offset = GUINT16_TO_LE (*offset);
+       string->length = string->length2 = GUINT16_TO_LE (len);
        *offset += len;
 }
 
@@ -134,53 +124,82 @@ soup_ntlm_request (void)
        return g_strdup ("NTLM TlRMTVNTUAABAAAABoIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAwAAAA");
 }
 
-char *
-soup_ntlm_response (const char *challenge, 
-                   const char *user,
-                   const char *lm_hash, 
-                   const char *nt_hash,
-                   const char *host, 
-                   const char *domain)
+gboolean
+soup_ntlm_parse_challenge (const char *challenge,
+                          char      **nonce,
+                          char      **default_domain)
 {
-       int hlen, dlen, ulen, offset, decodelen;
-       guchar lm_resp[24], nt_resp[24], *nonce;
-       NTLMResponse resp;
+       int clen, decodelen;
+       NTLMString domain;
        char *chall;
-       unsigned char *out, *p;
        int state, save;
 
        if (strncmp (challenge, "NTLM ", 5) != 0)
-               return NULL;
+               return FALSE;
 
        decodelen = strlen (challenge) - 5;
        chall = g_malloc (decodelen);
 
        state = save = 0;
-       soup_base64_decode_step ((guchar *) challenge + 5, 
-                                decodelen,
-                                chall, 
-                                &state, 
-                                &save);
+       clen = soup_base64_decode_step ((guchar *) challenge + 5, 
+                                       decodelen,
+                                       chall, 
+                                       &state, 
+                                       &save);
+
+       if (clen < NTLM_CHALLENGE_DOMAIN_STRING_OFFSET ||
+           clen < NTLM_CHALLENGE_NONCE_OFFSET + NTLM_CHALLENGE_NONCE_LENGTH) {
+               g_free (chall);
+               return FALSE;
+       }
+
+       if (default_domain) {
+               memcpy (&domain, chall + NTLM_CHALLENGE_DOMAIN_STRING_OFFSET, sizeof (domain));
+               domain.length = GUINT16_FROM_LE (domain.length);
+               domain.offset = GUINT16_FROM_LE (domain.offset);
+
+               if (clen < domain.length + domain.offset) {
+                       g_free (chall);
+                       return FALSE;
+               }
+
+               *default_domain = g_strndup (chall + domain.offset, domain.length);
+       }
+
+       if (nonce) {
+               *nonce = g_memdup (chall + NTLM_CHALLENGE_NONCE_OFFSET,
+                                  NTLM_CHALLENGE_NONCE_LENGTH);
+       }
 
-       nonce = chall + NTLM_CHALLENGE_NONCE_OFFSET;
-       nonce [NTLM_CHALLENGE_NONCE_LENGTH] = '\0';
+       g_free (chall);
+       return TRUE;
+}
 
-       calc_response (lm_hash, nonce, lm_resp);
-       calc_response (nt_hash, nonce, nt_resp);
+char *
+soup_ntlm_response (const char *nonce, 
+                   const char *user,
+                   const char *password, 
+                   const char *host, 
+                   const char *domain)
+{
+       int hlen, dlen, ulen, offset;
+       guchar hash[21], lm_resp[24], nt_resp[24];
+       NTLMResponse resp;
+       unsigned char *out, *p;
+       int state, save;
+
+       soup_ntlm_lanmanager_hash (password, hash);
+       calc_response (hash, nonce, lm_resp);
+       soup_ntlm_nt_hash (password, hash);
+       calc_response (hash, nonce, nt_resp);
 
        memset (&resp, 0, sizeof (resp));
        memcpy (resp.header, NTLM_RESPONSE_HEADER, sizeof (resp.header));
-       memcpy (resp.flags, NTLM_RESPONSE_FLAGS, sizeof (resp.flags));
+       resp.flags = GUINT32_TO_LE (NTLM_RESPONSE_FLAGS);
 
        offset = sizeof (resp);
 
-       if (domain)
-               dlen = strlen (domain);
-       else {
-               /* Grab the default domain from the challenge */
-               domain = chall + NTLM_CHALLENGE_DOMAIN_OFFSET;
-               dlen = atoi (chall + NTLM_CHALLENGE_DOMAIN_LEN_OFFSET);
-       }
+       dlen = strlen (domain);
        ntlm_set_string (&resp.domain, &offset, dlen);
        ulen = strlen (user);
        ntlm_set_string (&resp.user, &offset, ulen);
@@ -235,14 +254,10 @@ soup_ntlm_response (const char *challenge,
                                       &state, 
                                       &save);
        *p = '\0';
-       g_free (chall);
 
        return out;
 }
 
-#define KEYBITS(k,s) \
-        (((k[(s)/8] << ((s)%8)) & 0xFF) | (k[(s)/8+1] >> (8-(s)%8)))
-
 /* DES utils */
 /* Set up a key schedule based on a 56bit key */
 static void
@@ -251,15 +266,22 @@ setup_schedule (const guchar *key_56, DES_KS ks)
        guchar key[8];
        int i, c, bit;
 
-       for (i = 0; i < 8; i++) {
-               key [i] = KEYBITS (key_56, i * 7);
+       key[0] = (key_56[0])                                 ;
+       key[1] = (key_56[1] >> 1) | ((key_56[0] << 7) & 0xFF);
+       key[2] = (key_56[2] >> 2) | ((key_56[1] << 6) & 0xFF);
+       key[3] = (key_56[3] >> 3) | ((key_56[2] << 5) & 0xFF);
+       key[4] = (key_56[4] >> 4) | ((key_56[3] << 4) & 0xFF);
+       key[5] = (key_56[5] >> 5) | ((key_56[4] << 3) & 0xFF);
+       key[6] = (key_56[6] >> 6) | ((key_56[5] << 2) & 0xFF);
+       key[7] =                    ((key_56[6] << 1) & 0xFF);
 
-               /* Fix parity */
+       /* Fix parity */
+       for (i = 0; i < 8; i++) {
                for (c = bit = 0; bit < 8; bit++)
-                       if (key [i] & (1 << bit))
+                       if (key[i] & (1 << bit))
                                c++;
                if (!(c & 1))
-                       key [i] ^= 0x01;
+                       key[i] ^= 0x01;
        }
 
         deskey (ks, key, 0);
@@ -410,134 +432,134 @@ md4sum (const unsigned char *in, int nbytes, unsigned char digest[16])
 
 /* Public domain DES implementation from Phil Karn */
 static unsigned long Spbox[8][64] = {
-       0x01010400,0x00000000,0x00010000,0x01010404,
-       0x01010004,0x00010404,0x00000004,0x00010000,
-       0x00000400,0x01010400,0x01010404,0x00000400,
-       0x01000404,0x01010004,0x01000000,0x00000004,
-       0x00000404,0x01000400,0x01000400,0x00010400,
-       0x00010400,0x01010000,0x01010000,0x01000404,
-       0x00010004,0x01000004,0x01000004,0x00010004,
-       0x00000000,0x00000404,0x00010404,0x01000000,
-       0x00010000,0x01010404,0x00000004,0x01010000,
-       0x01010400,0x01000000,0x01000000,0x00000400,
-       0x01010004,0x00010000,0x00010400,0x01000004,
-       0x00000400,0x00000004,0x01000404,0x00010404,
-       0x01010404,0x00010004,0x01010000,0x01000404,
-       0x01000004,0x00000404,0x00010404,0x01010400,
-       0x00000404,0x01000400,0x01000400,0x00000000,
-       0x00010004,0x00010400,0x00000000,0x01010004,
-       0x80108020,0x80008000,0x00008000,0x00108020,
-       0x00100000,0x00000020,0x80100020,0x80008020,
-       0x80000020,0x80108020,0x80108000,0x80000000,
-       0x80008000,0x00100000,0x00000020,0x80100020,
-       0x00108000,0x00100020,0x80008020,0x00000000,
-       0x80000000,0x00008000,0x00108020,0x80100000,
-       0x00100020,0x80000020,0x00000000,0x00108000,
-       0x00008020,0x80108000,0x80100000,0x00008020,
-       0x00000000,0x00108020,0x80100020,0x00100000,
-       0x80008020,0x80100000,0x80108000,0x00008000,
-       0x80100000,0x80008000,0x00000020,0x80108020,
-       0x00108020,0x00000020,0x00008000,0x80000000,
-       0x00008020,0x80108000,0x00100000,0x80000020,
-       0x00100020,0x80008020,0x80000020,0x00100020,
-       0x00108000,0x00000000,0x80008000,0x00008020,
-       0x80000000,0x80100020,0x80108020,0x00108000,
-       0x00000208,0x08020200,0x00000000,0x08020008,
-       0x08000200,0x00000000,0x00020208,0x08000200,
-       0x00020008,0x08000008,0x08000008,0x00020000,
-       0x08020208,0x00020008,0x08020000,0x00000208,
-       0x08000000,0x00000008,0x08020200,0x00000200,
-       0x00020200,0x08020000,0x08020008,0x00020208,
-       0x08000208,0x00020200,0x00020000,0x08000208,
-       0x00000008,0x08020208,0x00000200,0x08000000,
-       0x08020200,0x08000000,0x00020008,0x00000208,
-       0x00020000,0x08020200,0x08000200,0x00000000,
-       0x00000200,0x00020008,0x08020208,0x08000200,
-       0x08000008,0x00000200,0x00000000,0x08020008,
-       0x08000208,0x00020000,0x08000000,0x08020208,
-       0x00000008,0x00020208,0x00020200,0x08000008,
-       0x08020000,0x08000208,0x00000208,0x08020000,
-       0x00020208,0x00000008,0x08020008,0x00020200,
-       0x00802001,0x00002081,0x00002081,0x00000080,
-       0x00802080,0x00800081,0x00800001,0x00002001,
-       0x00000000,0x00802000,0x00802000,0x00802081,
-       0x00000081,0x00000000,0x00800080,0x00800001,
-       0x00000001,0x00002000,0x00800000,0x00802001,
-       0x00000080,0x00800000,0x00002001,0x00002080,
-       0x00800081,0x00000001,0x00002080,0x00800080,
-       0x00002000,0x00802080,0x00802081,0x00000081,
-       0x00800080,0x00800001,0x00802000,0x00802081,
-       0x00000081,0x00000000,0x00000000,0x00802000,
-       0x00002080,0x00800080,0x00800081,0x00000001,
-       0x00802001,0x00002081,0x00002081,0x00000080,
-       0x00802081,0x00000081,0x00000001,0x00002000,
-       0x00800001,0x00002001,0x00802080,0x00800081,
-       0x00002001,0x00002080,0x00800000,0x00802001,
-       0x00000080,0x00800000,0x00002000,0x00802080,
-       0x00000100,0x02080100,0x02080000,0x42000100,
-       0x00080000,0x00000100,0x40000000,0x02080000,
-       0x40080100,0x00080000,0x02000100,0x40080100,
-       0x42000100,0x42080000,0x00080100,0x40000000,
-       0x02000000,0x40080000,0x40080000,0x00000000,
-       0x40000100,0x42080100,0x42080100,0x02000100,
-       0x42080000,0x40000100,0x00000000,0x42000000,
-       0x02080100,0x02000000,0x42000000,0x00080100,
-       0x00080000,0x42000100,0x00000100,0x02000000,
-       0x40000000,0x02080000,0x42000100,0x40080100,
-       0x02000100,0x40000000,0x42080000,0x02080100,
-       0x40080100,0x00000100,0x02000000,0x42080000,
-       0x42080100,0x00080100,0x42000000,0x42080100,
-       0x02080000,0x00000000,0x40080000,0x42000000,
-       0x00080100,0x02000100,0x40000100,0x00080000,
-       0x00000000,0x40080000,0x02080100,0x40000100,
-       0x20000010,0x20400000,0x00004000,0x20404010,
-       0x20400000,0x00000010,0x20404010,0x00400000,
-       0x20004000,0x00404010,0x00400000,0x20000010,
-       0x00400010,0x20004000,0x20000000,0x00004010,
-       0x00000000,0x00400010,0x20004010,0x00004000,
-       0x00404000,0x20004010,0x00000010,0x20400010,
-       0x20400010,0x00000000,0x00404010,0x20404000,
-       0x00004010,0x00404000,0x20404000,0x20000000,
-       0x20004000,0x00000010,0x20400010,0x00404000,
-       0x20404010,0x00400000,0x00004010,0x20000010,
-       0x00400000,0x20004000,0x20000000,0x00004010,
-       0x20000010,0x20404010,0x00404000,0x20400000,
-       0x00404010,0x20404000,0x00000000,0x20400010,
-       0x00000010,0x00004000,0x20400000,0x00404010,
-       0x00004000,0x00400010,0x20004010,0x00000000,
-       0x20404000,0x20000000,0x00400010,0x20004010,
-       0x00200000,0x04200002,0x04000802,0x00000000,
-       0x00000800,0x04000802,0x00200802,0x04200800,
-       0x04200802,0x00200000,0x00000000,0x04000002,
-       0x00000002,0x04000000,0x04200002,0x00000802,
-       0x04000800,0x00200802,0x00200002,0x04000800,
-       0x04000002,0x04200000,0x04200800,0x00200002,
-       0x04200000,0x00000800,0x00000802,0x04200802,
-       0x00200800,0x00000002,0x04000000,0x00200800,
-       0x04000000,0x00200800,0x00200000,0x04000802,
-       0x04000802,0x04200002,0x04200002,0x00000002,
-       0x00200002,0x04000000,0x04000800,0x00200000,
-       0x04200800,0x00000802,0x00200802,0x04200800,
-       0x00000802,0x04000002,0x04200802,0x04200000,
-       0x00200800,0x00000000,0x00000002,0x04200802,
-       0x00000000,0x00200802,0x04200000,0x00000800,
-       0x04000002,0x04000800,0x00000800,0x00200002,
-       0x10001040,0x00001000,0x00040000,0x10041040,
-       0x10000000,0x10001040,0x00000040,0x10000000,
-       0x00040040,0x10040000,0x10041040,0x00041000,
-       0x10041000,0x00041040,0x00001000,0x00000040,
-       0x10040000,0x10000040,0x10001000,0x00001040,
-       0x00041000,0x00040040,0x10040040,0x10041000,
-       0x00001040,0x00000000,0x00000000,0x10040040,
-       0x10000040,0x10001000,0x00041040,0x00040000,
-       0x00041040,0x00040000,0x10041000,0x00001000,
-       0x00000040,0x10040040,0x00001000,0x00041040,
-       0x10001000,0x00000040,0x10000040,0x10040000,
-       0x10040040,0x10000000,0x00040000,0x10001040,
-       0x00000000,0x10041040,0x00040040,0x10000040,
-       0x10040000,0x10001000,0x10001040,0x00000000,
-       0x10041040,0x00041000,0x00041000,0x00001040,
-       0x00001040,0x00040040,0x10000000,0x10041000,
+       0x01010400,0x00000000,0x00010000,0x01010404,
+         0x01010004,0x00010404,0x00000004,0x00010000,
+         0x00000400,0x01010400,0x01010404,0x00000400,
+         0x01000404,0x01010004,0x01000000,0x00000004,
+         0x00000404,0x01000400,0x01000400,0x00010400,
+         0x00010400,0x01010000,0x01010000,0x01000404,
+         0x00010004,0x01000004,0x01000004,0x00010004,
+         0x00000000,0x00000404,0x00010404,0x01000000,
+         0x00010000,0x01010404,0x00000004,0x01010000,
+         0x01010400,0x01000000,0x01000000,0x00000400,
+         0x01010004,0x00010000,0x00010400,0x01000004,
+         0x00000400,0x00000004,0x01000404,0x00010404,
+         0x01010404,0x00010004,0x01010000,0x01000404,
+         0x01000004,0x00000404,0x00010404,0x01010400,
+         0x00000404,0x01000400,0x01000400,0x00000000,
+         0x00010004,0x00010400,0x00000000,0x01010004 },
+       0x80108020,0x80008000,0x00008000,0x00108020,
+         0x00100000,0x00000020,0x80100020,0x80008020,
+         0x80000020,0x80108020,0x80108000,0x80000000,
+         0x80008000,0x00100000,0x00000020,0x80100020,
+         0x00108000,0x00100020,0x80008020,0x00000000,
+         0x80000000,0x00008000,0x00108020,0x80100000,
+         0x00100020,0x80000020,0x00000000,0x00108000,
+         0x00008020,0x80108000,0x80100000,0x00008020,
+         0x00000000,0x00108020,0x80100020,0x00100000,
+         0x80008020,0x80100000,0x80108000,0x00008000,
+         0x80100000,0x80008000,0x00000020,0x80108020,
+         0x00108020,0x00000020,0x00008000,0x80000000,
+         0x00008020,0x80108000,0x00100000,0x80000020,
+         0x00100020,0x80008020,0x80000020,0x00100020,
+         0x00108000,0x00000000,0x80008000,0x00008020,
+         0x80000000,0x80100020,0x80108020,0x00108000 },
+       0x00000208,0x08020200,0x00000000,0x08020008,
+         0x08000200,0x00000000,0x00020208,0x08000200,
+         0x00020008,0x08000008,0x08000008,0x00020000,
+         0x08020208,0x00020008,0x08020000,0x00000208,
+         0x08000000,0x00000008,0x08020200,0x00000200,
+         0x00020200,0x08020000,0x08020008,0x00020208,
+         0x08000208,0x00020200,0x00020000,0x08000208,
+         0x00000008,0x08020208,0x00000200,0x08000000,
+         0x08020200,0x08000000,0x00020008,0x00000208,
+         0x00020000,0x08020200,0x08000200,0x00000000,
+         0x00000200,0x00020008,0x08020208,0x08000200,
+         0x08000008,0x00000200,0x00000000,0x08020008,
+         0x08000208,0x00020000,0x08000000,0x08020208,
+         0x00000008,0x00020208,0x00020200,0x08000008,
+         0x08020000,0x08000208,0x00000208,0x08020000,
+         0x00020208,0x00000008,0x08020008,0x00020200 },
+       0x00802001,0x00002081,0x00002081,0x00000080,
+         0x00802080,0x00800081,0x00800001,0x00002001,
+         0x00000000,0x00802000,0x00802000,0x00802081,
+         0x00000081,0x00000000,0x00800080,0x00800001,
+         0x00000001,0x00002000,0x00800000,0x00802001,
+         0x00000080,0x00800000,0x00002001,0x00002080,
+         0x00800081,0x00000001,0x00002080,0x00800080,
+         0x00002000,0x00802080,0x00802081,0x00000081,
+         0x00800080,0x00800001,0x00802000,0x00802081,
+         0x00000081,0x00000000,0x00000000,0x00802000,
+         0x00002080,0x00800080,0x00800081,0x00000001,
+         0x00802001,0x00002081,0x00002081,0x00000080,
+         0x00802081,0x00000081,0x00000001,0x00002000,
+         0x00800001,0x00002001,0x00802080,0x00800081,
+         0x00002001,0x00002080,0x00800000,0x00802001,
+         0x00000080,0x00800000,0x00002000,0x00802080 },
+       0x00000100,0x02080100,0x02080000,0x42000100,
+         0x00080000,0x00000100,0x40000000,0x02080000,
+         0x40080100,0x00080000,0x02000100,0x40080100,
+         0x42000100,0x42080000,0x00080100,0x40000000,
+         0x02000000,0x40080000,0x40080000,0x00000000,
+         0x40000100,0x42080100,0x42080100,0x02000100,
+         0x42080000,0x40000100,0x00000000,0x42000000,
+         0x02080100,0x02000000,0x42000000,0x00080100,
+         0x00080000,0x42000100,0x00000100,0x02000000,
+         0x40000000,0x02080000,0x42000100,0x40080100,
+         0x02000100,0x40000000,0x42080000,0x02080100,
+         0x40080100,0x00000100,0x02000000,0x42080000,
+         0x42080100,0x00080100,0x42000000,0x42080100,
+         0x02080000,0x00000000,0x40080000,0x42000000,
+         0x00080100,0x02000100,0x40000100,0x00080000,
+         0x00000000,0x40080000,0x02080100,0x40000100 },
+       0x20000010,0x20400000,0x00004000,0x20404010,
+         0x20400000,0x00000010,0x20404010,0x00400000,
+         0x20004000,0x00404010,0x00400000,0x20000010,
+         0x00400010,0x20004000,0x20000000,0x00004010,
+         0x00000000,0x00400010,0x20004010,0x00004000,
+         0x00404000,0x20004010,0x00000010,0x20400010,
+         0x20400010,0x00000000,0x00404010,0x20404000,
+         0x00004010,0x00404000,0x20404000,0x20000000,
+         0x20004000,0x00000010,0x20400010,0x00404000,
+         0x20404010,0x00400000,0x00004010,0x20000010,
+         0x00400000,0x20004000,0x20000000,0x00004010,
+         0x20000010,0x20404010,0x00404000,0x20400000,
+         0x00404010,0x20404000,0x00000000,0x20400010,
+         0x00000010,0x00004000,0x20400000,0x00404010,
+         0x00004000,0x00400010,0x20004010,0x00000000,
+         0x20404000,0x20000000,0x00400010,0x20004010 },
+       0x00200000,0x04200002,0x04000802,0x00000000,
+         0x00000800,0x04000802,0x00200802,0x04200800,
+         0x04200802,0x00200000,0x00000000,0x04000002,
+         0x00000002,0x04000000,0x04200002,0x00000802,
+         0x04000800,0x00200802,0x00200002,0x04000800,
+         0x04000002,0x04200000,0x04200800,0x00200002,
+         0x04200000,0x00000800,0x00000802,0x04200802,
+         0x00200800,0x00000002,0x04000000,0x00200800,
+         0x04000000,0x00200800,0x00200000,0x04000802,
+         0x04000802,0x04200002,0x04200002,0x00000002,
+         0x00200002,0x04000000,0x04000800,0x00200000,
+         0x04200800,0x00000802,0x00200802,0x04200800,
+         0x00000802,0x04000002,0x04200802,0x04200000,
+         0x00200800,0x00000000,0x00000002,0x04200802,
+         0x00000000,0x00200802,0x04200000,0x00000800,
+         0x04000002,0x04000800,0x00000800,0x00200002 },
+       0x10001040,0x00001000,0x00040000,0x10041040,
+         0x10000000,0x10001040,0x00000040,0x10000000,
+         0x00040040,0x10040000,0x10041040,0x00041000,
+         0x10041000,0x00041040,0x00001000,0x00000040,
+         0x10040000,0x10000040,0x10001000,0x00001040,
+         0x00041000,0x00040040,0x10040040,0x10041000,
+         0x00001040,0x00000000,0x00000000,0x10040040,
+         0x10000040,0x10001000,0x00041040,0x00040000,
+         0x00041040,0x00040000,0x10041000,0x00001000,
+         0x00000040,0x10040040,0x00001000,0x00041040,
+         0x10001000,0x00000040,0x10000040,0x10040000,
+         0x10040040,0x10000000,0x00040000,0x10001040,
+         0x00000000,0x10041040,0x00040040,0x10000040,
+         0x10040000,0x10001000,0x10001040,0x00000000,
+         0x10041040,0x00041000,0x00041000,0x00001040,
+         0x00001040,0x00040040,0x10000000,0x10041000 }
 };
 
 #undef F
index 3149805..5b35f42 100644 (file)
 
 #include <glib.h>
 
-void  soup_ntlm_lanmanager_hash (const char *password, 
-                                char        hash[21]);
+void     soup_ntlm_lanmanager_hash (const char *password,
+                                   guchar hash[21]);
 
-void  soup_ntlm_nt_hash         (const char *password, 
-                                char        hash[21]);
+void     soup_ntlm_nt_hash         (const char *password,
+                                   guchar hash[21]);
 
-char *soup_ntlm_request         (void);
+char    *soup_ntlm_request         (void);
 
-char *soup_ntlm_response        (const char *challenge, 
-                                const char *user,
-                                const char *lm_hash, 
-                                const char *nt_hash,
-                                const char *host, 
-                                const char *domain);
+gboolean soup_ntlm_parse_challenge (const char *challenge,
+                                   char      **nonce,
+                                   char      **default_domain);
+
+char    *soup_ntlm_response        (const char *nonce, 
+                                   const char *user,
+                                   const char *password,
+                                   const char *host, 
+                                   const char *domain);
 
 #endif /* NTLM_H */
index d8c8eac..015cbf5 100644 (file)
 
 #ifdef HAVE_OPENSSL_SSL_H
 
-#ifdef HAVE_UNISTD_H
 #include <unistd.h>
-#endif
-
 #include <glib.h>
 #include <sys/time.h>
 
@@ -27,6 +24,8 @@
 
 #include "soup-openssl.h"
 
+static gboolean server_mode = FALSE;
+
 typedef struct {
        GIOChannel   channel;
        gint         fd;
@@ -34,11 +33,21 @@ typedef struct {
        SSL         *ssl;
 } SoupOpenSSLChannel;
 
-static GIOError
+static void
+soup_openssl_free (GIOChannel *channel)
+{
+       SoupOpenSSLChannel *chan = (SoupOpenSSLChannel *) channel;
+       g_io_channel_unref (chan->real_sock);
+       SSL_free (chan->ssl);
+       g_free (chan);
+}
+
+static GIOStatus
 soup_openssl_read (GIOChannel   *channel,
                   gchar        *buf,
                   guint         count,
-                  guint        *bytes_read)
+                  guint        *bytes_read,
+                  GError      **err)
 {
        SoupOpenSSLChannel *chan = (SoupOpenSSLChannel *) channel;
        gint result;
@@ -49,27 +58,32 @@ soup_openssl_read (GIOChannel   *channel,
                /* This occurs when a re-handshake is required */
                *bytes_read = 0;
                if (SSL_get_error (chan->ssl, result) == SSL_ERROR_WANT_READ)
-                       return G_IO_ERROR_AGAIN;
+                       return G_IO_STATUS_AGAIN;
                switch (errno) {
                case EINVAL:
+#if 0
                        return G_IO_ERROR_INVAL;
+#else
+                       return G_IO_STATUS_ERROR;
+#endif
                case EAGAIN:
                case EINTR:
-                       return G_IO_ERROR_AGAIN;
+                       return G_IO_STATUS_AGAIN;
                default:
-                       return G_IO_ERROR_UNKNOWN;
+                       return G_IO_STATUS_ERROR;
                }
        } else {
                *bytes_read = result;
-               return G_IO_ERROR_NONE;
+               return G_IO_STATUS_NORMAL;
        }
 }
 
-static GIOError
+static GIOStatus
 soup_openssl_write (GIOChannel   *channel,
-                   gchar        *buf,
-                   guint         count,
-                   guint        *bytes_written)
+                   const gchar  *buf,
+                   gsize         count,
+                   gsize        *bytes_written,
+                   GError      **err)
 {
        SoupOpenSSLChannel *chan = (SoupOpenSSLChannel *) channel;
        gint result;
@@ -78,119 +92,183 @@ soup_openssl_write (GIOChannel   *channel,
 
        if (result < 0) {
                *bytes_written = 0;
-               if (SSL_get_error (chan->ssl, result) == SSL_ERROR_WANT_READ)
-                       return G_IO_ERROR_AGAIN;
+               if (SSL_get_error (chan->ssl, result) == SSL_ERROR_WANT_WRITE)
+                       return G_IO_STATUS_AGAIN;
                switch (errno) {
                case EINVAL:
+#if 0
                        return G_IO_ERROR_INVAL;
+#else
+                       return G_IO_STATUS_ERROR;
+#endif
                case EAGAIN:
                case EINTR:
-                       return G_IO_ERROR_AGAIN;
+                       return G_IO_STATUS_AGAIN;
                default:
-                       return G_IO_ERROR_UNKNOWN;
+                       return G_IO_STATUS_ERROR;
                }
        } else {
                *bytes_written = result;
-               return G_IO_ERROR_NONE;
+
+               return (result > 0) ? G_IO_STATUS_NORMAL : G_IO_STATUS_EOF;
        }
 }
 
-static GIOError
-soup_openssl_seek (GIOChannel *channel, gint offset, GSeekType type)
+static GIOStatus
+soup_openssl_seek (GIOChannel  *channel,
+                  gint64       offset,
+                  GSeekType    type,
+                  GError     **err)
 {
        SoupOpenSSLChannel *chan = (SoupOpenSSLChannel *) channel;
-       return g_io_channel_seek (chan->real_sock, offset, type);
+       GIOError e;
+
+       e = g_io_channel_seek (chan->real_sock, offset, type);
+
+       if (e != G_IO_ERROR_NONE)
+               return G_IO_STATUS_ERROR;
+       else
+               return G_IO_STATUS_NORMAL;
 }
 
-static void
-soup_openssl_close (GIOChannel   *channel)
+static GIOStatus
+soup_openssl_close (GIOChannel  *channel,
+                   GError     **err)
 {
        SoupOpenSSLChannel *chan = (SoupOpenSSLChannel *) channel;
        g_io_channel_close (chan->real_sock);
+
+       return G_IO_STATUS_NORMAL;
 }
 
-static void
-soup_openssl_free (GIOChannel   *channel)
+typedef struct {
+       GSource       source;
+       GPollFD       pollfd;
+       GIOChannel   *channel;
+       GIOCondition  condition;
+} SoupOpenSSLWatch;
+
+static gboolean
+soup_openssl_prepare (GSource *source,
+                     gint    *timeout)
 {
-       SoupOpenSSLChannel *chan = (SoupOpenSSLChannel *) channel;
-       g_io_channel_unref (chan->real_sock);
-       SSL_free (chan->ssl);
-       g_free (chan);
+       SoupOpenSSLWatch *watch = (SoupOpenSSLWatch *) source;
+       GIOCondition buffer_condition = g_io_channel_get_buffer_condition (
+               watch->channel);
+
+       *timeout = -1;
+
+       /* Only return TRUE here if _all_ bits in watch->condition will be set
+        */
+       return ((watch->condition & buffer_condition) == watch->condition);
 }
 
-#if 0
+static gboolean
+soup_openssl_check (GSource *source)
+{
+       SoupOpenSSLWatch *watch = (SoupOpenSSLWatch *) source;
+       GIOCondition buffer_condition = g_io_channel_get_buffer_condition (
+               watch->channel);
+       GIOCondition poll_condition = watch->pollfd.revents;
 
-/* Commented out until we can figure out why SSL_pending always fails */
+       return ((poll_condition | buffer_condition) & watch->condition);
+}
 
-typedef struct {
-       GIOFunc         func;
-       gpointer        user_data;
-} SoupOpenSSLReadData;
-
-static gboolean 
-soup_openssl_read_cb (GIOChannel   *channel, 
-                     GIOCondition  condition, 
-                     gpointer      user_data)
+static gboolean
+soup_openssl_dispatch (GSource     *source,
+                      GSourceFunc  callback,
+                      gpointer     user_data)
 {
-       SoupOpenSSLChannel *chan = (SoupOpenSSLChannel *) channel;
-       SoupOpenSSLReadData *data = user_data;
+       GIOFunc func = (GIOFunc) callback;
+       SoupOpenSSLWatch *watch = (SoupOpenSSLWatch *) source;
+       SoupOpenSSLChannel *chan = (SoupOpenSSLChannel *) watch->channel;
+       GIOCondition buffer_condition = g_io_channel_get_buffer_condition (
+               watch->channel);
+       GIOCondition cond;
+
+       if (!func) {
+               g_warning ("IO watch dispatched without callback\n"
+                          "You must call g_source_connect().");
+               return FALSE;
+       }
+       
+       cond = (watch->pollfd.revents | buffer_condition) & watch->condition;
 
-       if (condition & G_IO_IN) {
-               if (SSL_pending (chan->ssl) && 
-                   !(*data->func) (channel, condition, data->user_data)) {
-                       g_free (data);
+       if (cond & G_IO_IN) {
+               do {
+                       if (!(*func) (watch->channel, cond, user_data))
                        return FALSE;
-               }
+               } while (SSL_pending (chan->ssl));
+
                return TRUE;
-       } else return (*data->func) (channel, condition, data->user_data);
+       } else
+               return (*func) (watch->channel, cond, user_data);
+}
+
+static void
+soup_openssl_finalize (GSource *source)
+{
+       SoupOpenSSLWatch *watch = (SoupOpenSSLWatch *) source;
+
+       g_io_channel_unref (watch->channel);
 }
 
-static guint
-soup_openssl_add_watch (GIOChannel     *channel,
-                       gint            priority,
-                       GIOCondition    condition,
-                       GIOFunc         func,
-                       gpointer        user_data,
-                       GDestroyNotify  notify)
+/* All of these functions were basically cut-and-pasted from glib */
+GSourceFuncs soup_openssl_watch_funcs = {
+       soup_openssl_prepare,
+       soup_openssl_check,
+       soup_openssl_dispatch,
+       soup_openssl_finalize
+};
+
+static GSource *
+soup_openssl_create_watch (GIOChannel   *channel,
+                          GIOCondition  condition)
 {
        SoupOpenSSLChannel *chan = (SoupOpenSSLChannel *) channel;
 
        if (condition & G_IO_IN) {
-               SoupOpenSSLReadData *data = g_new0 (SoupOpenSSLReadData, 1);
-               data->func = func;
-               data->user_data = user_data;
-
-               return chan->real_sock->funcs->io_add_watch (channel, 
-                                                            priority, 
-                                                            condition,
-                                                            soup_openssl_read_cb,
-                                                            data,
-                                                            notify);
-       } else return chan->real_sock->funcs->io_add_watch (channel, 
-                                                           priority, 
-                                                           condition,
-                                                           func,
-                                                           user_data,
-                                                           notify);
+               GSource *source;
+               SoupOpenSSLWatch *watch;
+
+               source = g_source_new (&soup_openssl_watch_funcs,
+                                      sizeof (SoupOpenSSLWatch));
+               watch = (SoupOpenSSLWatch *) source;
+
+               watch->channel = channel;
+               g_io_channel_ref (channel);
+
+               watch->condition = condition;
+               
+               watch->pollfd.fd = chan->fd;
+               watch->pollfd.events = condition;
+
+               g_source_add_poll (source, &watch->pollfd);
+
+               return source;
+       }
+       else {
+               return chan->real_sock->funcs->io_create_watch (channel,
+                                                               condition);
+       }
 }
 
-#endif /* 0 */
+static GIOStatus
+soup_openssl_set_flags (GIOChannel  *channel,
+                       GIOFlags     flags,
+                       GError     **err)
+{
+       SoupOpenSSLChannel *chan = (SoupOpenSSLChannel *) channel;
 
-static guint
-soup_openssl_add_watch (GIOChannel     *channel,
-                       gint            priority,
-                       GIOCondition    condition,
-                       GIOFunc         func,
-                       gpointer        user_data,
-                       GDestroyNotify  notify)
+       return chan->real_sock->funcs->io_set_flags (channel, flags, err);
+}      
+
+static GIOFlags
+soup_openssl_get_flags (GIOChannel *channel)
 {
        SoupOpenSSLChannel *chan = (SoupOpenSSLChannel *) channel;
-       return chan->real_sock->funcs->io_add_watch (channel, 
-                                                    priority, 
-                                                    condition,
-                                                    func,
-                                                    user_data,
-                                                    notify);
+
+       return chan->real_sock->funcs->io_get_flags (channel);
 }
 
 GIOFuncs soup_openssl_channel_funcs = {
@@ -198,8 +276,10 @@ GIOFuncs soup_openssl_channel_funcs = {
        soup_openssl_write,
        soup_openssl_seek,
        soup_openssl_close,
-       soup_openssl_add_watch,
+       soup_openssl_create_watch,
        soup_openssl_free,
+       soup_openssl_set_flags,
+       soup_openssl_get_flags
 };
 
 static SSL_CTX *ssl_context = NULL;
@@ -258,7 +338,7 @@ soup_openssl_get_iochannel (GIOChannel *sock)
 
         g_return_val_if_fail (sock != NULL, NULL);
 
-       if (!ssl_context && !soup_openssl_init ()) 
+       if (!ssl_context && !soup_openssl_init (server_mode)) 
                goto THROW_CREATE_ERROR;
 
        if (!soup_openssl_seed ())
@@ -283,12 +363,13 @@ soup_openssl_get_iochannel (GIOChannel *sock)
                        goto THROW_CREATE_ERROR;
                }
 
-               if (!SSL_use_RSAPrivateKey_file (ssl, ckey_file, 1)) {
+               if (!SSL_use_RSAPrivateKey_file (ssl, ckey_file, SSL_FILETYPE_PEM)) {
                        g_warning ("Unable to use private key file.");
+                       ERR_print_errors_fp(stderr);
                        goto THROW_CREATE_ERROR;
                }
 
-               if (!SSL_use_certificate_file (ssl, ccert_file, 1)) {
+               if (!SSL_use_certificate_file (ssl, ccert_file, SSL_FILETYPE_PEM)) {
                        g_warning ("Unable to use certificate file.");
                        goto THROW_CREATE_ERROR;
                }
@@ -307,25 +388,31 @@ soup_openssl_get_iochannel (GIOChannel *sock)
                goto THROW_CREATE_ERROR;
        }
 
-       while (1) {
-               err = SSL_connect (ssl);
-               switch (SSL_get_error (ssl, err)) {
-               case SSL_ERROR_NONE:
-                       break;
-               case SSL_ERROR_WANT_READ:
-               case SSL_ERROR_WANT_WRITE: 
-               {
-                       fd_set readfds;
-                       FD_ZERO (&readfds);
-                       FD_SET (sockfd, &readfds);
-                       select (1, &readfds, NULL, NULL, NULL);
-                       continue;
+       do {
+               fd_set ssl_fdset;
+
+               if (server_mode)
+                       err = SSL_accept (ssl);
+               else
+                       err = SSL_connect (ssl);
+
+               err = SSL_get_error (ssl, err);
+
+               if (err == SSL_ERROR_WANT_READ) {
+                       FD_ZERO (&ssl_fdset);
+                       FD_SET (sockfd, &ssl_fdset);
+                       select (sockfd + 1, &ssl_fdset, NULL, NULL, NULL);
                }
-               default:
+               else if (err == SSL_ERROR_WANT_WRITE) {
+                       FD_ZERO (&ssl_fdset);
+                       FD_SET (sockfd, &ssl_fdset);
+                       select (sockfd + 1, NULL, &ssl_fdset, NULL, NULL);
+               }
+               else if (err != SSL_ERROR_NONE) {
                        g_warning ("Could not establish secure connection.");
                        goto THROW_CREATE_ERROR;
                }
-       }
+       } while (err != SSL_ERROR_NONE);
 
        bits = SSL_get_cipher_bits (ssl, &alg_bits);
        if (bits == 0) {
@@ -333,12 +420,15 @@ soup_openssl_get_iochannel (GIOChannel *sock)
                goto THROW_CREATE_ERROR;
        }
 
-       cert = SSL_get_peer_certificate (ssl);
-       if (!cert) {
-               g_warning ("Server certificate unavailable");
-               goto THROW_CREATE_ERROR;
+       if (!server_mode) {
+               cert = SSL_get_peer_certificate (ssl);
+               if (!cert) {
+                       g_warning ("Server certificate unavailable");
+                       goto THROW_CREATE_ERROR;
+               }
+               else
+                       X509_free (cert);
        }
-       X509_free (cert);
 
        chan = g_new0 (SoupOpenSSLChannel, 1);
        chan->fd = sockfd;
@@ -356,8 +446,17 @@ soup_openssl_get_iochannel (GIOChannel *sock)
        return NULL;
 }
 
+static int
+verify_cb (int verified, X509_STORE_CTX *x509_ctx)
+{
+       if (!verified)
+               g_warning ("Unable to verify server's CA");
+
+       return verified;
+}
+
 gboolean
-soup_openssl_init (void)
+soup_openssl_init (gboolean server)
 {
        static gchar *ssl_ca_file = NULL;
        static gchar *ssl_ca_dir  = NULL;
@@ -365,7 +464,13 @@ soup_openssl_init (void)
        SSL_library_init ();
        SSL_load_error_strings ();
 
-       ssl_context = SSL_CTX_new (SSLv23_client_method ());
+       server_mode = server;
+
+       if (server_mode)
+               ssl_context = SSL_CTX_new (SSLv23_server_method ());
+       else
+               ssl_context = SSL_CTX_new (SSLv23_client_method ());
+
        if (!ssl_context) {
                g_warning ("Unable to initialize OpenSSL library");
                return FALSE;
@@ -380,7 +485,7 @@ soup_openssl_init (void)
                SSL_CTX_load_verify_locations (ssl_context, 
                                               ssl_ca_file, 
                                               ssl_ca_dir);
-               SSL_CTX_set_verify (ssl_context, SSL_VERIFY_PEER, NULL);
+               SSL_CTX_set_verify (ssl_context, SSL_VERIFY_PEER, verify_cb);
        }
 
        return TRUE;
index 2a00983..dbcd25a 100644 (file)
@@ -18,6 +18,6 @@ GIOChannel *soup_openssl_get_iochannel       (GIOChannel *sock);
 
 void        soup_openssl_set_security_policy (SoupSecurityPolicy policy);
 
-gboolean    soup_openssl_init                (void);
+gboolean    soup_openssl_init                (gboolean server_mode);
 
 #endif /* SOUP_OPENSSL_H */
index 5500508..f31e979 100644 (file)
@@ -1,6 +1,6 @@
 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
 /*
- * soup-private.h: Asyncronous Callback-based SOAP Request Queue.
+ * soup-private.h: Asyncronous Callback-based HTTP Request Queue.
  *
  * Authors:
  *      Alex Graveley (alex@helixcode.com)
  * extraneous circumstances.
  */
 
-#ifndef SOAP_PRIVATE_H
-#define SOAP_PRIVATE_H 1
+#ifndef SOUP_PRIVATE_H
+#define SOUP_PRIVATE_H 1
 
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
 
-#ifdef SOUP_WIN32
-#  include <malloc.h>
-#  define alloca _alloca
-#else
-#  ifdef HAVE_ALLOCA_H
-#    include <alloca.h>
-#  else
-#    ifdef _AIX
-#      pragma alloca
-#    else
-#      ifndef alloca /* predefined by HP cc +Olibcalls */
-         char *alloca ();
-#      endif
-#    endif
-#  endif
-#endif
-
 #include <sys/types.h>
-
-#ifdef HAVE_NETINET_IN_H
 #include <netinet/in.h>
-#endif
-
-#ifdef HAVE_SYS_SOCKET_H
 #include <sys/socket.h>
-#endif
-
-#ifdef SOUP_WIN32
-#define VERSION "Win/0.7.99"
-#include <windows.h>
-#include <winbase.h>
-#include <winuser.h>
-#endif
 
 #include <libsoup/soup-auth.h>
 #include <libsoup/soup-context.h>
@@ -137,6 +107,8 @@ struct _SoupMessagePrivate {
        guint              write_tag;
        guint              timeout_tag;
 
+       guint              retries;
+
        SoupCallbackFn     callback;
        gpointer           user_data;
 
@@ -156,7 +128,7 @@ struct _SoupMessagePrivate {
 void     soup_message_issue_callback (SoupMessage      *req);
 
 gboolean soup_message_run_handlers   (SoupMessage      *msg,
-                                     SoupHandlerEvent  invoke_type);
+                                     SoupHandlerType   invoke_type);
 
 void     soup_message_cleanup        (SoupMessage      *req);
 
index 365a582..e015365 100644 (file)
@@ -1,6 +1,6 @@
 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
 /*
- * soup-queue.c: Asyncronous Callback-based SOAP Request Queue.
+ * soup-queue.c: Asyncronous Callback-based HTTP Request Queue.
  *
  * Authors:
  *      Alex Graveley (alex@helixcode.com)
@@ -79,9 +79,19 @@ soup_queue_error_cb (gboolean body_started, gpointer user_data)
        case SOUP_STATUS_SENDING_REQUEST:
                if (!body_started) {
                        /*
-                        * FIXME: Use exponential backoff here
+                        * This can easily happen if we are using the OpenSSL
+                        * out-of-process proxy and we couldn't establish an
+                        * SSL connection.
                         */
-                       soup_message_requeue (req);
+                       if (req->priv->retries >= 3) {
+                               soup_message_set_error (
+                                       req,
+                                       SOUP_ERROR_CANT_CONNECT);
+                               soup_message_issue_callback (req);
+                       } else {
+                               req->priv->retries++;
+                               soup_message_requeue (req);
+                       }
                } else {
                        soup_message_set_error (req, SOUP_ERROR_IO);
                        soup_message_issue_callback (req);
@@ -198,7 +208,7 @@ soup_queue_read_headers_cb (const GString        *headers,
        }
 
  SUCCESS_CONTINUE:
-       soup_message_run_handlers (req, SOUP_HANDLER_HEADERS);
+       soup_message_run_handlers (req, SOUP_HANDLER_PRE_BODY);
        return SOUP_TRANSFER_CONTINUE;
 
  THROW_MALFORMED_HEADER:
@@ -217,7 +227,7 @@ soup_queue_read_chunk_cb (const SoupDataBuffer *data,
        req->response.length = data->length;
        req->response.body = data->body;
 
-       soup_message_run_handlers (req, SOUP_HANDLER_DATA);
+       soup_message_run_handlers (req, SOUP_HANDLER_BODY_CHUNK);
 
        return SOUP_TRANSFER_CONTINUE;
 }
@@ -255,7 +265,7 @@ soup_queue_read_done_cb (const SoupDataBuffer *data,
                req->priv->read_tag = 0;
        }
 
-       soup_message_run_handlers (req, SOUP_HANDLER_FINISHED);
+       soup_message_run_handlers (req, SOUP_HANDLER_POST_BODY);
 }
 
 static void
@@ -497,7 +507,7 @@ start_request (SoupContext *ctx, SoupMessage *req)
        req->status = SOUP_STATUS_SENDING_REQUEST;
 }
 
-static SoupHandlerResult
+static void
 proxy_https_connect_cb (SoupMessage *msg, gpointer user_data)
 {
        gboolean *ret = user_data;
@@ -516,8 +526,6 @@ proxy_https_connect_cb (SoupMessage *msg, gpointer user_data)
                
                *ret = TRUE;
        }
-
-       return SOUP_HANDLER_CONTINUE;
 }
 
 static gboolean
@@ -538,8 +546,7 @@ proxy_https_connect (SoupContext    *proxy,
        connect_msg = soup_message_new (dest_ctx, SOUP_METHOD_CONNECT);
        connect_msg->connection = conn;
        soup_message_add_handler (connect_msg, 
-                                 SOUP_HANDLER_FINISHED,
-                                 NULL,
+                                 SOUP_HANDLER_POST_BODY,
                                  proxy_https_connect_cb,
                                  &ret);
        soup_message_send (connect_msg);
index 30ba5d3..0def1f4 100644 (file)
@@ -1,6 +1,6 @@
 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
 /*
- * soup-queue.h: Asyncronous Callback-based SOAP Request Queue.
+ * soup-queue.h: Asyncronous Callback-based HTTP Request Queue.
  *
  * Authors:
  *      Alex Graveley (alex@ximian.com)
index 82c4179..fe689ad 100644 (file)
@@ -1,6 +1,6 @@
 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
 /*
- * soup-server.c: Asyncronous Callback-based SOAP Request Queue.
+ * soup-server.c: Asyncronous Callback-based HTTP Request Queue.
  *
  * Authors:
  *      Alex Graveley (alex@ximian.com)
@@ -16,9 +16,7 @@
 #include <config.h>
 #endif
 
-#ifdef HAVE_UNISTD_H
 #include <unistd.h>
-#endif
 
 #ifdef HAVE_SYS_FILIO_H
 #include <sys/filio.h>
 #include <sys/ioctl.h>
 #endif
 
-#ifdef SOUP_WIN32
-#define ioctl ioctlsocket\r
-#define STDIN_FILENO 0\r
-#define STDOUT_FILENO 1
-#endif
-
 extern char **environ;
 
 #include <string.h>
@@ -200,6 +192,33 @@ static gboolean start_another_request (GIOChannel    *serv_chan,
                                       GIOCondition   condition, 
                                       gpointer       user_data);
 
+static gboolean
+check_close_connection (SoupMessage *msg)
+{
+       const char *connection_hdr;
+       gboolean close_connection;
+
+       connection_hdr = soup_message_get_header (msg->request_headers,
+                                                 "Connection");
+
+       if (msg->priv->http_version == SOUP_HTTP_1_0) {
+               if (connection_hdr && g_strcasecmp (connection_hdr,
+                                                   "keep-alive") == 0)
+                       close_connection = FALSE;
+               else
+                       close_connection = TRUE;
+       }
+       else {
+               if (connection_hdr && g_strcasecmp (connection_hdr,
+                                                   "close") == 0)
+                       close_connection = TRUE;
+               else
+                       close_connection = FALSE;
+       }
+
+       return close_connection;
+} /* check_close_connection */
+
 static void
 destroy_message (SoupMessage *msg)
 {
@@ -208,18 +227,24 @@ destroy_message (SoupMessage *msg)
        SoupServerMessage *server_msg = msg->priv->server_msg;
 
        if (server_sock) {
-               if (server_msg && msg->priv->http_version == SOUP_HTTP_1_0)
-                       /*
-                        * Close the socket if we are using HTTP/1.0 and 
-                        * did not specify a Content-Length response header.
-                        */
+               GIOChannel *chan;
+
+               chan = soup_socket_get_iochannel (server_sock);
+
+               /*
+                * Close the socket if we're using HTTP/1.0 and
+                * "Connection: keep-alive" isn't specified, or if we're
+                * using HTTP/1.1 and "Connection: close" was specified.
+                */
+               if (check_close_connection (msg)) {
+                       g_io_channel_close (chan);
                        soup_socket_unref (server_sock);
+               }
                else {
                        /*
                         * Listen for another request on this connection
                         */
                        ServerConnectData *data;
-                       GIOChannel *chan;
 
                        data = g_new0 (ServerConnectData, 1);
                        data->server = msg->priv->server;
@@ -413,6 +438,85 @@ get_server_sockname (gint fd)
        return host;
 }
 
+static void
+write_header (gchar *key, gchar *value, GString *ret)
+{
+       g_string_sprintfa (ret, "%s: %s\r\n", key, value);
+}
+
+static GString *
+get_response_header (SoupMessage          *req, 
+                    gboolean              status_line, 
+                    SoupTransferEncoding  encoding)
+{
+       GString *ret = g_string_new (NULL);
+
+       if (status_line)
+               g_string_sprintfa (ret, 
+                                  "HTTP/1.1 %d %s\r\n", 
+                                  req->errorcode, 
+                                  req->errorphrase);
+       else
+               g_string_sprintfa (ret, 
+                                  "Status: %d %s\r\n", 
+                                  req->errorcode, 
+                                  req->errorphrase);
+
+       if (encoding == SOUP_TRANSFER_CONTENT_LENGTH)
+               g_string_sprintfa (ret, 
+                                  "Content-Length: %d\r\n",  
+                                  req->response.length);
+       else if (encoding == SOUP_TRANSFER_CHUNKED)
+               g_string_append (ret, "Transfer-Encoding: chunked\r\n");
+
+       soup_message_foreach_header (req->response_headers,
+                                    (GHFunc) write_header,
+                                    ret);
+
+       g_string_append (ret, "\r\n");
+
+       return ret;
+}
+
+static inline void
+set_response_error (SoupMessage    *req,
+                   guint           code,
+                   gchar          *phrase,
+                   gchar          *body)
+{
+       if (phrase)
+               soup_message_set_error_full (req, code, phrase);
+       else 
+               soup_message_set_error (req, code);
+
+       req->response.owner = SOUP_BUFFER_STATIC;
+       req->response.body = body;
+       req->response.length = body ? strlen (req->response.body) : 0;
+}
+
+static void
+issue_bad_request (SoupMessage *msg)
+{
+       GString *header;
+       GIOChannel *channel;
+
+       set_response_error (msg, SOUP_ERROR_BAD_REQUEST, NULL, NULL);
+
+       header = get_response_header (msg, 
+                                     FALSE,
+                                     SOUP_TRANSFER_CONTENT_LENGTH);
+
+       channel = soup_socket_get_iochannel (msg->priv->server_sock);
+
+       msg->priv->write_tag =
+               soup_transfer_write_simple (channel,
+                                           header,
+                                           &msg->response,
+                                           write_done_cb,
+                                           error_cb,
+                                           msg);
+} /* issue_bad_request */
+
 static SoupTransferDone
 read_headers_cb (const GString        *headers,
                 SoupTransferEncoding *encoding,
@@ -473,17 +577,7 @@ read_headers_cb (const GString        *headers,
                req_host = soup_message_get_header (msg->request_headers, 
                                                    "Host");
 
-               if (req_host) {
-                       url = 
-                               g_strdup_printf (
-                                       "%s%s:%d%s",
-                                       server->proto == SOUP_PROTOCOL_HTTPS ?
-                                               "https://" :
-                                               "http://",
-                                       req_host, 
-                                       server->port,
-                                       req_path);
-               } else if (*req_path != '/') {
+               if (*req_path != '/') {
                        /*
                         * Check for absolute URI
                         */
@@ -495,6 +589,16 @@ read_headers_cb (const GString        *headers,
                                soup_uri_free (absolute);
                        } else 
                                goto THROW_MALFORMED_HEADER;
+               } else if (req_host) {
+                       url = 
+                               g_strdup_printf (
+                                       "%s%s:%d%s",
+                                       server->proto == SOUP_PROTOCOL_HTTPS ?
+                                               "https://" :
+                                               "http://",
+                                       req_host, 
+                                       server->port,
+                                       req_path);
                } else {
                        /* 
                         * No Host header, no AbsoluteUri
@@ -531,65 +635,9 @@ read_headers_cb (const GString        *headers,
  THROW_MALFORMED_HEADER:
        g_free (req_path);
 
-       destroy_message (msg);
-
-       return SOUP_TRANSFER_END;
-}
-
-static void
-write_header (gchar *key, gchar *value, GString *ret)
-{
-       g_string_sprintfa (ret, "%s: %s\r\n", key, value);
-}
-
-static GString *
-get_response_header (SoupMessage          *req, 
-                    gboolean              status_line, 
-                    SoupTransferEncoding  encoding)
-{
-       GString *ret = g_string_new (NULL);
-
-       if (status_line) 
-               g_string_sprintfa (ret, 
-                                  "HTTP/1.1 %d %s\r\n", 
-                                  req->errorcode, 
-                                  req->errorphrase);
-       else
-               g_string_sprintfa (ret, 
-                                  "Status: %d %s\r\n", 
-                                  req->errorcode, 
-                                  req->errorphrase);
+       issue_bad_request(msg);
 
-       if (encoding == SOUP_TRANSFER_CONTENT_LENGTH)
-               g_string_sprintfa (ret, 
-                                  "Content-Length: %d\r\n",  
-                                  req->response.length);
-       else if (encoding == SOUP_TRANSFER_CHUNKED)
-               g_string_append (ret, "Transfer-Encoding: chunked\r\n");
-
-       soup_message_foreach_header (req->response_headers,
-                                    (GHFunc) write_header,
-                                    ret);
-
-       g_string_append (ret, "\r\n");
-
-       return ret;
-}
-
-static inline void
-set_response_error (SoupMessage    *req,
-                   guint           code,
-                   gchar          *phrase,
-                   gchar          *body)
-{
-       if (phrase)
-               soup_message_set_error_full (req, code, phrase);
-       else 
-               soup_message_set_error (req, code);
-
-       req->response.owner = SOUP_BUFFER_STATIC;
-       req->response.body = body;
-       req->response.length = body ? strlen (req->response.body) : 0;
+       return SOUP_TRANSFER_CONTINUE;
 }
 
 static void
@@ -792,19 +840,6 @@ read_done_cb (const SoupDataBuffer *data,
 
        req->priv->read_tag = 0;
 
-       /* FIXME: Do this in soap handler 
-       action = soup_message_get_header (req->request_headers, "SOAPAction");
-       if (!action) {
-               g_print ("No SOAPAction found in request.\n");
-               set_response_error (
-                       req, 
-                       403, 
-                       "Missing SOAPAction", 
-                       "The required SOAPAction header was not supplied.");
-               goto START_WRITE;
-       }
-       */
-
        call_handler (req, data, soup_context_get_uri (req->context)->path);
 
        channel = soup_socket_get_iochannel (server_sock);
@@ -860,6 +895,7 @@ message_new (SoupServer *server)
         */
        msg = soup_message_new (NULL, NULL);
        if (msg) {
+               msg->method = NULL;
                msg->priv->server = server;
                soup_server_ref (server);
        }
@@ -926,7 +962,7 @@ conn_accept (GIOChannel    *serv_chan,
        chan = soup_socket_get_iochannel (sock);
 
        if (server->proto == SOUP_PROTOCOL_HTTPS) {
-               chan = soup_ssl_get_iochannel (chan);
+               chan = soup_ssl_get_server_iochannel (chan);
                g_io_channel_unref (sock->iochannel);
                g_io_channel_ref (chan);
                sock->iochannel = chan;
@@ -1156,6 +1192,33 @@ soup_server_get_handler (SoupServer *server, const gchar *path)
        return server->default_handler;
 }
 
+SoupAddress *
+soup_server_context_get_client_address (SoupServerContext *context)
+{
+       SoupSocket *socket;
+       SoupAddress *address;
+
+       g_return_val_if_fail (context != NULL, NULL);
+
+       socket = context->msg->priv->server_sock;
+       address = soup_socket_get_address (socket);
+
+       return address;
+}
+
+gchar *
+soup_server_context_get_client_host (SoupServerContext *context)
+{
+       gchar *host;
+       SoupAddress *address;
+
+       address = soup_server_context_get_client_address (context);
+       host = g_strdup (soup_address_get_canonical_name (address));
+       soup_address_unref (address);
+       
+       return host;
+}
+
 static SoupServerAuthContext *
 auth_context_copy (SoupServerAuthContext *auth_ctx)
 {
index 9245381..c4bb628 100644 (file)
@@ -1,6 +1,6 @@
 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
 /*
- * soup-server.h: Asyncronous Callback-based SOAP Request Queue.
+ * soup-server.h: Asyncronous Callback-based HTTP Request Queue.
  *
  * Authors:
  *      Alex Graveley (alex@helixcode.com)
@@ -15,6 +15,7 @@
 #include <libsoup/soup-message.h>
 #include <libsoup/soup-method.h>
 #include <libsoup/soup-misc.h>
+#include <libsoup/soup-socket.h>
 #include <libsoup/soup-uri.h>
 #include <libsoup/soup-server-auth.h>
 
@@ -82,6 +83,12 @@ SoupServerHandler *soup_server_get_handler   (SoupServer            *serv,
 
 GSList            *soup_server_list_handlers (SoupServer            *serv);
 
+/* Functions for accessing information about the specific connection */
+
+SoupAddress       *soup_server_context_get_client_address (SoupServerContext *context);
+
+gchar             *soup_server_context_get_client_host    (SoupServerContext *context);
+
 /* 
  * Apache/soup-httpd module initializtion
  * Implement soup_server_init() in your shared library. 
index a46fecc..c5dd86b 100644 (file)
@@ -36,7 +36,6 @@
 #include "soup-socket.h"
 
 #include <netdb.h>
-#include <resolv.h>
 #include <unistd.h>
 #include <arpa/inet.h>
 #include <arpa/nameser.h>
 #  endif
 #endif
 
+/* this generally causes problems, so remove from build atm */
+#ifdef SOUP_PTRACE_ATTACH
+#undef SOUP_PTRACE_ATTACH
+#endif
+
 #ifndef socklen_t
 #define socklen_t size_t
 #endif
@@ -192,7 +196,7 @@ soup_gethostbyname(const char*         hostname,
                g_free(buf);
        }
 #else
-#ifdef HAVE_GET_HOSTBYNAME_R_SOLARIS
+#ifdef HAVE_GETHOSTBYNAME_R_SOLARIS
        {
                struct hostent result;
                size_t len;
@@ -348,7 +352,7 @@ soup_gethostbyaddr (const char* addr, size_t length, int type)
                g_free(buf);
        }
 #else
-#ifdef HAVE_GET_HOSTBYNAME_R_SOLARIS
+#ifdef HAVE_GETHOSTBYNAME_R_SOLARIS
        {
                struct hostent result;
                size_t len;
index 4b73320..0b51ce3 100644 (file)
 #include "soup-private.h"
 #include "soup-socket.h"
 
-#ifdef SOUP_WIN32
-#  define socklen_t gint32
-#  define SOUP_CLOSE_SOCKET(fd) closesocket(fd)
-#  define SOUP_SOCKET_IOCHANNEL_NEW(fd) g_io_channel_win32_new_socket(fd)
-#else
-#  include <unistd.h>
-#  ifndef socklen_t
-#    define socklen_t size_t
-#  endif
-#  define SOUP_CLOSE_SOCKET(fd) close(fd)
-#  define SOUP_SOCKET_IOCHANNEL_NEW(fd) g_io_channel_unix_new(fd)
+#include <unistd.h>
+#ifndef socklen_t
+#  define socklen_t size_t
 #endif
 
 #ifndef INET_ADDRSTRLEN
@@ -315,8 +307,6 @@ soup_socket_connect_tcp_cb (SoupSocket* socket,
        SoupSocketConnectFn func = state->func;
        gpointer user_data = state->data;
 
-       g_free (state);
-
        if (status == SOUP_SOCKET_NEW_STATUS_OK)
                (*func) (socket,
                         SOUP_SOCKET_CONNECT_ERROR_NONE,
@@ -325,6 +315,9 @@ soup_socket_connect_tcp_cb (SoupSocket* socket,
                (*func) (NULL,
                         SOUP_SOCKET_CONNECT_ERROR_NETWORK,
                         user_data);
+
+       if (state->tcp_id)
+               g_free (state);
 }
 
 static void
@@ -335,31 +328,23 @@ soup_socket_connect_inetaddr_cb (SoupAddress* inetaddr,
        SoupSocketConnectState* state = (SoupSocketConnectState*) data;
 
        if (status == SOUP_ADDRESS_STATUS_OK) {
-               gpointer tcp_id;
-
-               state->inetaddr_id = NULL;
-
-               tcp_id = soup_socket_new (inetaddr,
-                                         soup_socket_connect_tcp_cb,
-                                         state);
-               /* 
-                * NOTE: soup_socket_new can fail immediately and call our
-                * callback which will delete the state.  
-                */
-               if (tcp_id)
-                       state->tcp_id = tcp_id;
-
+               state->tcp_id = soup_socket_new (inetaddr,
+                                                soup_socket_connect_tcp_cb,
+                                                state);
                soup_address_unref (inetaddr);
        } else {
                SoupSocketConnectFn func = state->func;
                gpointer user_data = state->data;
 
-               g_free (state);
-
                (*func) (NULL, 
                         SOUP_SOCKET_CONNECT_ERROR_ADDR_RESOLVE, 
                         user_data);
        }
+
+       if (state->inetaddr_id && !state->tcp_id)
+               g_free (state);
+       else
+               state->inetaddr_id = NULL;
 }
 
 /**
@@ -377,8 +362,8 @@ soup_socket_connect_inetaddr_cb (SoupAddress* inetaddr,
  * returns.  It will call the callback if there is a failure.
  *
  * Returns: ID of the connection which can be used with
- * soup_socket_connect_cancel() to cancel it; NULL on
- * failure.
+ * soup_socket_connect_cancel() to cancel it; NULL if it succeeds
+ * or fails immediately.
  **/
 SoupSocketConnectId
 soup_socket_connect (const gchar*        hostname,
@@ -388,7 +373,6 @@ soup_socket_connect (const gchar*        hostname,
 {
        SoupSocketConnectState* state;
        SoupAddress *cached_addr;
-       gpointer addr_id, tcp_id;
 
        g_return_val_if_fail (hostname != NULL, NULL);
        g_return_val_if_fail (func != NULL, NULL);
@@ -400,35 +384,26 @@ soup_socket_connect (const gchar*        hostname,
        /* Check if a cached version of the address already exists */
        cached_addr = soup_address_lookup_in_cache (hostname, port);
        if (cached_addr) {
-               tcp_id = soup_socket_new (cached_addr,
-                                         soup_socket_connect_tcp_cb,
-                                         state);
+               state->tcp_id = soup_socket_new (cached_addr,
+                                                soup_socket_connect_tcp_cb,
+                                                state);
                soup_address_unref (cached_addr);
-
-               /* 
-                * NOTE: soup_socket_new can fail immediately and call our
-                * callback which will delete the state.  
-                */
-               if (tcp_id) {
-                       state->tcp_id = tcp_id;
-                       return state;
-               } else
-                       return NULL;
        } else {
-               addr_id = soup_address_new (hostname,
-                                           port,
-                                           soup_socket_connect_inetaddr_cb,
-                                           state);
-
-               /* 
-                * NOTE: soup_address_new can fail immediately and call our
-                * callback which will delete the state.  
+               state->inetaddr_id = soup_address_new (hostname,
+                                                      port,
+                                                      soup_socket_connect_inetaddr_cb,
+                                                      state);
+               /* NOTE: soup_address_new could succeed immediately
+                * and call our callback, in which case state->inetaddr_id
+                * will be NULL but state->tcp_id may be set.
                 */
-               if (addr_id) {
-                       state->inetaddr_id = addr_id;
-                       return state;
-               } else
-                       return NULL;
+       }
+
+       if (state->tcp_id || state->inetaddr_id)
+               return state;
+       else {
+               g_free (state);
+               return NULL;
        }
 }
 
@@ -532,7 +507,7 @@ soup_socket_unref (SoupSocket* s)
        --s->ref_count;
 
        if (s->ref_count == 0) {
-               SOUP_CLOSE_SOCKET (s->sockfd);
+               close (s->sockfd);
                if (s->addr) soup_address_unref (s->addr);
                if (s->iochannel) g_io_channel_unref (s->iochannel);
 
@@ -567,7 +542,7 @@ soup_socket_get_iochannel (SoupSocket* socket)
        g_return_val_if_fail (socket != NULL, NULL);
 
        if (socket->iochannel == NULL)
-               socket->iochannel = SOUP_SOCKET_IOCHANNEL_NEW (socket->sockfd);
+               socket->iochannel = g_io_channel_unix_new (socket->sockfd);
 
        g_io_channel_ref (socket->iochannel);
 
@@ -631,6 +606,8 @@ soup_socket_server_new (const gint port)
        SoupSocket* s;
        struct sockaddr_in* sa_in;
        socklen_t socklen;
+       const int on = 1;
+       gint flags;
 
        /* Create socket */
        s = g_new0 (SoupSocket, 1);
@@ -650,32 +627,21 @@ soup_socket_server_new (const gint port)
        sa_in->sin_addr.s_addr = g_htonl (INADDR_ANY);
        sa_in->sin_port = g_htons (port);
 
-       /* 
-        * For Unix, set REUSEADDR and NONBLOCK.
-        * For Windows, set NONBLOCK during accept.
-        */
-#ifndef SOUP_WIN32
-       {
-               const int on = 1;
-               gint flags;
-
-               /* Set REUSEADDR so we can reuse the port */
-               if (setsockopt (s->sockfd,
-                               SOL_SOCKET,
-                               SO_REUSEADDR,
-                               &on,
-                               sizeof (on)) != 0)
-                       g_warning("Can't set reuse on tcp socket\n");
-
-               /* Get the flags (should all be 0?) */
-               flags = fcntl (s->sockfd, F_GETFL, 0);
-               if (flags == -1) goto SETUP_ERROR;
-
-               /* Make the socket non-blocking */
-               if (fcntl (s->sockfd, F_SETFL, flags | O_NONBLOCK) == -1)
-                       goto SETUP_ERROR;
-       }
-#endif
+       /* Set REUSEADDR so we can reuse the port */
+       if (setsockopt (s->sockfd,
+                       SOL_SOCKET,
+                       SO_REUSEADDR,
+                       &on,
+                       sizeof (on)) != 0)
+               g_warning("Can't set reuse on tcp socket\n");
+
+       /* Get the flags (should all be 0?) */
+       flags = fcntl (s->sockfd, F_GETFL, 0);
+       if (flags == -1) goto SETUP_ERROR;
+
+       /* Make the socket non-blocking */
+       if (fcntl (s->sockfd, F_SETFL, flags | O_NONBLOCK) == -1)
+               goto SETUP_ERROR;
 
        /* Bind */
        if (bind (s->sockfd, &s->addr->sa, sizeof (s->addr->sa)) != 0)
@@ -691,7 +657,7 @@ soup_socket_server_new (const gint port)
        return s;
 
  SETUP_ERROR:
-       SOUP_CLOSE_SOCKET (s->sockfd);
+       close (s->sockfd);
        g_free (s->addr);
        g_free (s);
        return NULL;
index a190ecf..e9d942c 100644 (file)
@@ -1,6 +1,6 @@
 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
 /*
- * soup-socket.c: ronous Callback-based SOAP Request Queue.
+ * soup-socket.c: ronous Callback-based HTTP Request Queue.
  *
  * Authors:
  *      David Helder  (dhelder@umich.edu)
index 623be18..2294859 100644 (file)
@@ -1,6 +1,6 @@
 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
 /*
- * soup-queue.c: Asyncronous Callback-based SOAP Request Queue.
+ * soup-queue.c: Asyncronous Callback-based HTTP Request Queue.
  *
  * Authors:
  *      Alex Graveley (alex@helixcode.com)
index a1d8461..e602cfa 100644 (file)
@@ -1,6 +1,6 @@
 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
 /*
- * soup-socks.h: Asyncronous Callback-based SOAP Request Queue.
+ * soup-socks.h: Asyncronous Callback-based HTTP Request Queue.
  *
  * Authors:
  *      Alex Graveley (alex@helixcode.com)
index 5d94066..e161acc 100644 (file)
 #include <config.h>
 #endif
 
-#ifdef HAVE_UNISTD_H
 #include <unistd.h>
-#endif
-
 #include <fcntl.h>
 #include <stdlib.h>
 #include <errno.h>
@@ -33,6 +30,8 @@ static gint ssl_library = 0; /* -1 = fail,
                                 1 = openssl */
 static SoupSecurityPolicy ssl_security_level = SOUP_SECURITY_DOMESTIC;
 
+static gboolean server_mode = FALSE;
+
 static GMainLoop *loop;
 
 static void 
@@ -58,7 +57,8 @@ soup_ssl_proxy_init (void)
        ssl_library = -1;
 
 #ifdef HAVE_OPENSSL_SSL_H
-       if (ssl_library == -1) ssl_library = soup_openssl_init () ? 1 : -1;
+       if (ssl_library == -1)
+               ssl_library = soup_openssl_init (server_mode) ? 1 : -1;
 #endif
 
        if (ssl_library == -1) return;
@@ -115,7 +115,8 @@ soup_ssl_proxy_readwrite (GIOChannel   *iochannel,
                write_total += bytes_written;
        }
 
-       if (condition & (G_IO_HUP | G_IO_ERR)) goto FINISH;
+       if (condition & G_IO_ERR)
+               goto FINISH;
 
        return TRUE;
 
@@ -131,6 +132,11 @@ main (int argc, char** argv)
        GIOChannel *read_chan, *write_chan, *sock_chan;
        int sockfd, secpol, flags;
 
+       if (getenv ("SOUP_PROXY_DELAY")) {
+               g_warning ("Proxy delay set: sleeping for 20 seconds");
+               sleep (20);
+       }
+
        loop = g_main_new (FALSE);
 
        env = getenv ("SOCKFD");
@@ -148,6 +154,10 @@ main (int argc, char** argv)
        secpol = atoi (env);
        soup_ssl_proxy_set_security_policy (secpol);
 
+       env = getenv ("IS_SERVER");
+       if (env)
+               server_mode = TRUE;
+
        read_chan = g_io_channel_unix_new (STDIN_FILENO);
        if (!read_chan) 
                g_error ("Unable to open STDIN");
@@ -156,13 +166,13 @@ main (int argc, char** argv)
        if (!write_chan) 
                g_error ("Unable to open STDOUT");
 
-       /* Block on socket write */
+       /* We use select. All fds should block. */
        flags = fcntl(sockfd, F_GETFL, 0);
        fcntl (sockfd, F_SETFL, flags & ~O_NONBLOCK);
-
-       /* Don't block on STDIN read */
        flags = fcntl(STDIN_FILENO, F_GETFL, 0);
-       fcntl (STDIN_FILENO, F_SETFL, flags | O_NONBLOCK);
+       fcntl (STDIN_FILENO, F_SETFL, flags & ~O_NONBLOCK);
+       flags = fcntl(STDOUT_FILENO, F_GETFL, 0);
+       fcntl (STDOUT_FILENO, F_SETFL, flags & ~O_NONBLOCK);
 
        sock_chan = g_io_channel_unix_new (sockfd);
        sock_chan = soup_ssl_proxy_get_iochannel (sock_chan);
@@ -170,12 +180,12 @@ main (int argc, char** argv)
                g_error ("Unable to establish SSL connection");
 
        g_io_add_watch (read_chan, 
-                       G_IO_IN | G_IO_HUP | G_IO_ERR, 
+                       G_IO_IN | G_IO_PRI | G_IO_ERR, 
                        (GIOFunc) soup_ssl_proxy_readwrite,
                        sock_chan);
 
        g_io_add_watch (sock_chan, 
-                       G_IO_IN | G_IO_HUP | G_IO_ERR, 
+                       G_IO_IN | G_IO_PRI | G_IO_ERR, 
                        (GIOFunc) soup_ssl_proxy_readwrite,
                        write_chan);
 
index 05302ca..63adb33 100644 (file)
@@ -1,6 +1,6 @@
 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
 /*
- * soup-queue.c: Asyncronous Callback-based SOAP Request Queue.
+ * soup-queue.c: Asyncronous Callback-based HTTP Request Queue.
  *
  * Authors:
  *      Alex Graveley (alex@ximian.com)
 #include <config.h>
 #endif
 
-#ifdef HAVE_UNISTD_H
 #include <unistd.h>
-#endif
-
-#ifdef HAVE_SYS_WAIT_H
+#include <sys/types.h>
 #include <sys/wait.h>
-#endif
-
-#ifdef HAVE_SYS_SOCKET_H
 #include <sys/socket.h>
-#endif
-
 #include <stdlib.h>
 #include <stdio.h>
-#include <sys/types.h>
 #include <errno.h>
 #include <fcntl.h>
 
 #include "soup-nss.h"
 #include "soup-misc.h"
 
-#ifdef SOUP_WIN32
-
-GIOChannel *
-soup_ssl_get_iochannel (GIOChannel *sock)
-{
-       return NULL;
-}
-
-#else /* SOUP_WIN32 */
 #ifdef HAVE_NSS
 
 GIOChannel *
-soup_ssl_get_iochannel (GIOChannel *sock)
+soup_ssl_get_iochannel_real (GIOChannel *sock, SoupSSLType type)
 {
        g_return_val_if_fail (sock != NULL, NULL);
 
-       return soup_nss_get_iochannel (sock);
+       return soup_nss_get_iochannel (sock, type);
 }
 
 #else /* HAVE_NSS */
@@ -63,13 +45,14 @@ soup_ssl_hup_waitpid (GIOChannel *source, GIOCondition condition, gpointer ppid)
        return FALSE;
 }
 
-GIOChannel *
-soup_ssl_get_iochannel (GIOChannel *sock)
+static GIOChannel *
+soup_ssl_get_iochannel_real (GIOChannel *sock, SoupSSLType type)
 {
        GIOChannel *new_chan;
        int sock_fd;
        int pid;
        int pair[2], flags;
+       const char *cert_file, *key_file;
 
        g_return_val_if_fail (sock != NULL, NULL);
 
@@ -101,6 +84,31 @@ soup_ssl_get_iochannel (GIOChannel *sock)
                putenv (g_strdup_printf ("SECURITY_POLICY=%d",
                                         soup_get_security_policy ()));
 
+               if (type == SOUP_SSL_TYPE_SERVER)
+                       putenv ("IS_SERVER=1");
+
+               if (soup_get_ssl_ca_file ()) {
+                       putenv (g_strdup_printf ("HTTPS_CA_FILE=%s",
+                                                soup_get_ssl_ca_file ()));
+               }
+
+               if (soup_get_ssl_ca_dir ()) {
+                       putenv (g_strdup_printf ("HTTPS_CA_DIR=%s",
+                                                soup_get_ssl_ca_dir ()));
+               }
+
+               soup_get_ssl_cert_files (&cert_file, &key_file);
+
+               if (cert_file) {
+                       putenv (g_strdup_printf ("HTTPS_CERT_FILE=%s",
+                                                cert_file));
+               }
+               
+               if (key_file) {
+                       putenv (g_strdup_printf ("HTTPS_KEY_FILE=%s",
+                                                key_file));
+               }
+
                execl (BINDIR G_DIR_SEPARATOR_S SSL_PROXY_NAME,
                       BINDIR G_DIR_SEPARATOR_S SSL_PROXY_NAME,
                       NULL);
@@ -116,11 +124,9 @@ soup_ssl_get_iochannel (GIOChannel *sock)
        fcntl (pair [1], F_SETFL, flags | O_NONBLOCK);
 
        new_chan = g_io_channel_unix_new (pair [1]);
-       g_io_add_watch (new_chan, G_IO_HUP,
+       g_io_add_watch (new_chan, G_IO_HUP | G_IO_ERR | G_IO_NVAL,
                        soup_ssl_hup_waitpid, GINT_TO_POINTER (pid));
 
-       /* FIXME: Why is this needed?? */
-       g_io_channel_ref (new_chan);
        return new_chan;
 
  ERROR:
@@ -132,4 +138,15 @@ soup_ssl_get_iochannel (GIOChannel *sock)
 }
 
 #endif /* HAVE_NSS */
-#endif /* SOUP_WIN32 */
+
+GIOChannel *
+soup_ssl_get_iochannel (GIOChannel *sock)
+{
+       return soup_ssl_get_iochannel_real (sock, SOUP_SSL_TYPE_CLIENT);
+}
+
+GIOChannel *
+soup_ssl_get_server_iochannel (GIOChannel *sock)
+{
+       return soup_ssl_get_iochannel_real (sock, SOUP_SSL_TYPE_SERVER);
+}
index 0cfd438..9e398e4 100644 (file)
@@ -1,6 +1,6 @@
 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
 /*
- * soup-queue.c: Asyncronous Callback-based SOAP Request Queue.
+ * soup-queue.c: Asyncronous Callback-based HTTP Request Queue.
  *
  * Authors:
  *      Alex Graveley (alex@helixcode.com)
 
 #include <glib.h>
 
+typedef enum {
+       SOUP_SSL_TYPE_CLIENT = 0,
+       SOUP_SSL_TYPE_SERVER
+} SoupSSLType;
+
 GIOChannel *soup_ssl_get_iochannel (GIOChannel *sock);
+GIOChannel *soup_ssl_get_server_iochannel (GIOChannel *sock);
 
 #endif /* SOUP_SSL_H */
index 332cd7c..fdbc456 100644 (file)
@@ -1,6 +1,6 @@
 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
 /*
- * soup-queue.c: Asyncronous Callback-based SOAP Request Queue.
+ * soup-queue.c: Asyncronous Callback-based HTTP Request Queue.
  *
  * Authors:
  *      Alex Graveley (alex@helixcode.com)
@@ -50,7 +50,7 @@ DUMP_WRITE (guchar *data, gint bytes_written)
 
 typedef struct {
        /* 
-        * Length remaining to be downloaded of the current chunk data. 
+        * Length of the current chunk data. 
         */
        guint  len;
 
@@ -219,34 +219,6 @@ remove_block_at_index (GByteArray *arr, gint offset, gint length)
        g_byte_array_set_size (arr, arr->len - length);
 }
 
-/* 
- * Count number of hex digits, and convert to decimal. Store number of hex
- * digits read in @width.
- */
-static gint
-decode_hex (const gchar *src, gint *width)
-{
-       gint new_len = 0, j;
-
-       *width = 0;
-
-       while (isxdigit (*src)) {
-               (*width)++;
-               src++;
-       }
-       src -= *width;
-
-       for (j = *width - 1; j + 1; j--) {
-               if (isdigit (*src))
-                       new_len += (*src - 0x30) << (4*j);
-               else
-                       new_len += (tolower (*src) - 0x57) << (4*j);
-               src++;
-       }
-
-       return new_len;
-}
-
 static gboolean
 decode_chunk (SoupTransferChunkState *s,
              GByteArray             *arr,
@@ -259,73 +231,68 @@ decode_chunk (SoupTransferChunkState *s,
        while (TRUE) {
                gint new_len = 0;
                gint len = 0;
-               gchar *i = &arr->data [s->idx + s->len];
-
-               /*
-                * Not enough data to finish the chunk (and the smallest
-                * possible next chunk header), break 
-                */
-               if (s->idx + s->len + 5 > arr->len)
-                       break;
 
-               /* 
-                * Check for end of chunk header, otherwise break. Avoid
-                * trailing \r\n from previous chunk body if this is not the
-                * opening chunk.  
-                */
                if (s->len) {
-                       if (soup_substring_index (
-                                       i + 2,
-                                       arr->len - s->idx - s->len - 2,
-                                       "\r\n") <= 0)
-                               break;
-               } else if (soup_substring_index (arr->data,
-                                                arr->len, 
-                                                "\r\n") <= 0)
+                       /* We're in the middle of a chunk. If we don't
+                        * have the entire chunk and the trailing CRLF
+                        * yet, read more.
+                        */
+                       if (s->idx + s->len + 2 > arr->len)
                                break;
 
-               /* 
-                * Remove trailing \r\n after previous chunk body 
+                       /*
+                        * Increment datalen and s->idx, and remove
+                        * the trailing CRLF.
+                        */
+                       s->idx += s->len;
+                       *datalen += s->len;
+                       remove_block_at_index (arr, s->idx, 2);
+
+                       /*
+                        * Ready for the next chunk.
+                        */
+                       s->len = 0;
+               }
+
+               /*
+                * We're at the start of a new chunk. If we don't have
+                * the complete chunk header, wait for more.
                 */
-               if (s->len)
-                       remove_block_at_index (arr, s->idx + s->len, 2);
+               len = soup_substring_index (&arr->data [s->idx],
+                                           arr->len - s->idx, 
+                                           "\r\n");
+               if (len < 0)
+                       break;
+               len += 2;
 
-               new_len = decode_hex (i, &len);
+               new_len = strtol (&arr->data [s->idx], NULL, 16);
                g_assert (new_len >= 0);
 
-               /* 
-                * Previous chunk is now processed, add its length to index and
-                * datalen.
+               /*
+                * If this is the final (zero-length) chunk, we need
+                * to have all of the trailing entity headers as well.
                 */
-               s->idx += s->len;
-               *datalen += s->len;
+               if (new_len == 0) {
+                       len = soup_substring_index (&arr->data [s->idx],
+                                                   arr->len - s->idx, 
+                                                   "\r\n\r\n");
+                       if (len < 0)
+                               break;
 
-               /* 
-                * Update length for next chunk's size 
-                */
-               s->len = new_len;
-               
-               /* 
-                * FIXME: Add entity headers we find here to
-                *        req->response_headers. 
-                */
-               len += soup_substring_index (&arr->data [s->idx + len],
-                                            arr->len - s->idx - len,
-                                            "\r\n");
+                       /* 
+                        * FIXME: Add entity headers we find here to
+                        *        req->response_headers. 
+                        */
 
-               /* 
-                * Zero-length chunk closes transfer. Include final \r\n after
-                 * empty chunk.
-                */
-               if (s->len == 0) {
-                       len += 2;
+                       len += 4;
                        ret = TRUE;
                }
 
                /* 
-                * Remove hexified length, entity headers, and trailing \r\n 
+                * Remove chunk header and get ready for chunk data.
                 */
-               remove_block_at_index (arr, s->idx, len + 2);
+               remove_block_at_index (arr, s->idx, len);
+               s->len = new_len;
        }
 
        return ret;
@@ -378,7 +345,8 @@ read_chunk (SoupReader *r, gboolean *cancelled)
        if (*cancelled) goto CANCELLED;
 
        /* 
-        * If overwrite, remove datalen worth of data from start of buffer 
+        * If overwrite, remove already-processed data from start
+        * of buffer 
         */
        if (r->overwrite_chunks) {
                remove_block_at_index (arr, 0, s->idx);
index ba0d6af..ab556b1 100644 (file)
@@ -1,6 +1,6 @@
 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
 /*
- * soup-queue.c: Asyncronous Callback-based SOAP Request Queue.
+ * soup-queue.c: Asyncronous Callback-based HTTP Request Queue.
  *
  * Authors:
  *      Alex Graveley (alex@helixcode.com)
index 970e2b4..8d11f46 100644 (file)
@@ -58,6 +58,7 @@ SoupKnownProtocols known_protocols [] = {
        { SOUP_PROTOCOL_SMTP,   "mailto:",   25 },
        { SOUP_PROTOCOL_SOCKS4, "socks4://", -1 },
        { SOUP_PROTOCOL_SOCKS5, "socks5://", -1 },
+       { SOUP_PROTOCOL_FILE,   "file://",   -1 },
        { 0 }
 };
 
@@ -325,7 +326,10 @@ soup_uri_new (const gchar* uri_string)
        }
 
        /* Must have a protocol */
-       if (!g_uri->protocol) return NULL;
+       if (!g_uri->protocol) {
+               g_free (g_uri);
+               return NULL;
+       }
 
        /* If there is an @ sign, look for user, authmech, and
         * password before it.
index f7d297a..c83952b 100644 (file)
@@ -34,7 +34,8 @@ typedef enum {
        SOUP_PROTOCOL_HTTPS,
        SOUP_PROTOCOL_SMTP,
        SOUP_PROTOCOL_SOCKS4,
-       SOUP_PROTOCOL_SOCKS5
+       SOUP_PROTOCOL_SOCKS5,
+       SOUP_PROTOCOL_FILE
 } SoupProtocol;
 
 typedef struct {
index bda95f1..f5fc25e 100644 (file)
@@ -1,6 +1,6 @@
 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
 /*
- * soup.h: Asyncronous Callback-based SOAP Request Queue.
+ * soup.h: Asyncronous Callback-based HTTP Request Queue.
  *
  * Authors:
  *      Alex Graveley (alex@helixcode.com)
@@ -16,14 +16,8 @@ extern "C" {
 #endif
 
 #include <libsoup/soup-context.h>
-#include <libsoup/soup-dav.h>
-#include <libsoup/soup-dav-server.h>
 #include <libsoup/soup-message.h>
 #include <libsoup/soup-misc.h>
-#include <libsoup/soup-fault.h>
-#include <libsoup/soup-env.h>
-#include <libsoup/soup-parser.h>
-#include <libsoup/soup-serializer.h>
 #include <libsoup/soup-socket.h>
 #include <libsoup/soup-uri.h>
 
index 3324fbf..562e499 100644 (file)
@@ -3,9 +3,9 @@ exec_prefix=@exec_prefix@
 libdir=@libdir@
 includedir=@includedir@
 
-Name: Soup
-Description: a SOAP client library in C.
+Name: libsoup
+Description: a glib-based HTTP library
 Version: @VERSION@
-Requires: glib
-Libs: -L${libdir} -lsoup @XML_LIBS@
-Cflags: -I${includedir}/soup @XML_CFLAGS@
\ No newline at end of file
+Requires: glib-2.0
+Libs: -L${libdir} -lsoup-2.0
+Cflags: -I${includedir}/soup-2.0