From d4629510fb547f3ed2cce829ea1ec0c73bc5647c Mon Sep 17 00:00:00 2001 From: Dan Winship Date: Tue, 5 Nov 2002 19:45:46 +0000 Subject: Split libsoup out of soup. ChangeLog.old contains the original soup * 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. --- .cvsignore | 7 +- ChangeLog | 3923 +------------------------------------------- HACKING | 13 +- MAINTAINERS | 3 + Makefile.am | 60 +- README | 38 +- autogen.sh | 151 +- configure.in | 317 +--- docs/reference/Makefile.am | 2 +- libsoup/.cvsignore | 1 + libsoup/Makefile.am | 50 +- libsoup/soup-auth.c | 155 +- libsoup/soup-auth.h | 24 +- libsoup/soup-context.c | 72 +- libsoup/soup-context.h | 2 +- libsoup/soup-headers.c | 4 +- libsoup/soup-headers.h | 2 +- libsoup/soup-message.c | 727 ++++---- libsoup/soup-message.h | 134 +- libsoup/soup-misc.c | 70 +- libsoup/soup-misc.h | 13 +- libsoup/soup-nss.c | 9 +- libsoup/soup-nss.h | 5 +- libsoup/soup-ntlm.c | 394 ++--- libsoup/soup-ntlm.h | 25 +- libsoup/soup-openssl.c | 329 ++-- libsoup/soup-openssl.h | 2 +- libsoup/soup-private.h | 40 +- libsoup/soup-queue.c | 29 +- libsoup/soup-queue.h | 2 +- libsoup/soup-server.c | 259 +-- libsoup/soup-server.h | 9 +- libsoup/soup-socket-unix.c | 10 +- libsoup/soup-socket.c | 140 +- libsoup/soup-socket.h | 2 +- libsoup/soup-socks.c | 2 +- libsoup/soup-socks.h | 2 +- libsoup/soup-ssl-proxy.c | 32 +- libsoup/soup-ssl.c | 73 +- libsoup/soup-ssl.h | 8 +- libsoup/soup-transfer.c | 132 +- libsoup/soup-transfer.h | 2 +- libsoup/soup-uri.c | 6 +- libsoup/soup-uri.h | 3 +- libsoup/soup.h | 8 +- soup-2.0.pc.in | 10 +- 46 files changed, 1620 insertions(+), 5681 deletions(-) create mode 100644 MAINTAINERS diff --git a/.cvsignore b/.cvsignore index a9df98d8..c49d391e 100644 --- a/.cvsignore +++ b/.cvsignore @@ -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 diff --git a/ChangeLog b/ChangeLog index ca2cf47f..713c6eed 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3914 +1,23 @@ -2002-05-31 Jacob Berkman +2002-11-05 Dan Winship - * 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 + * 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 + * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * src/libsoup/soup-context.c (soup_context_connect_cb): Remove - debugging g_print. - -2002-03-07 Alex Graveley - - * 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 - - * 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 - - * src/libsoup/soup-socket-unix.c: apparently some platforms don't - define INADDR_NONE either - -2002-02-25 JP Rosevear - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * src/libsoup/soup-message.c: Add soup_message_get_http_version() - function. - -2002-01-08 Alex Graveley - - * 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 - - * 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 - - * 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 - - * src/libsoup-apache/soup-apache.c (soup_apache_handler): updated - for the new field names in SoupServerAuthBasic - -2001-12-21 Alex Graveley - - * 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 - - * 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 - - * src/soup-ssl-proxy/soup-openssl.c (soup_openssl_seed): Use - RAND_status less often. - -2001-12-17 Alex Graveley - - * src/soup-ssl-proxy/soup-openssl.c (soup_openssl_init): Implement - a simple PRNG seed if needed. - -2001-12-15 Alex Graveley - - * 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 - - * 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 - - * src/libsoup/soup-queue.c (start_request): Use - soup_transfer_write_simple. - -2001-12-13 Alex Graveley - - * 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 - - * src/libsoup/soup-uri.c (normalize_path): Add path normalization - code from libxml. - -2001-12-06 Alex Graveley - - * 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 - - * 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 - - * src/libsoup/soup-server.c (soup_server_run): Allow recursive - calls and/or blocking on a running async server. - -2001-12-05 Alex Graveley - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * configure.in: Version 0.6.0. - * src/libsoup/soup-private.h (VERSION): Ditto. - -2001-11-08 Alex Graveley - - * 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 - - * 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 - - * 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 - - * 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 - - * src/soup-ssl-proxy/soup-ssl-proxy.c: Remove NSS-related code, as - this is now moved to libsoup. - -2001-11-02 Alex Graveley - - * 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 - - * 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 - - * src/libsoup/soup-transfer.c (issue_final_callback): Null - terminate recv_buf before copying the data pointer. - -2001-10-31 Alex Graveley - - * 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 - - * configure.in: Fix the popt check so you can pass CPPFLAGS and - LDFLAGS in in the environment. - -2001-10-30 Alex Graveley - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - 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 - - * 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 - - * src/libsoup/soup-transfer.c (remove_block_at_index): the array - length assertion should be >= rather than less than. - -2001-10-17 Alex Graveley - - * src/libsoup/soup-transfer.c (read_content_length): Don't call - chunk callback if there is no new data. - -2001-10-17 Alex Graveley - - * 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 - - * 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 - - * 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 - - * 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 - - * src/libsoup/soup-socks.c (soup_connect_socks_proxy): Assign - source connection correctly. - -2001-10-09 Alex Graveley - - * src/libsoup/soup-dav-server.c (parent_exists): don't call - __uri_exists as __is_collection should check this. - -2001-10-06 Alex Graveley - - * 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 - - * 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 - - * 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 - - * 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 - - * src/libsoup/soup-server.c (read_headers_cb): Fix const warnings. - -2001-10-04 Alex Graveley - - * 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 - - * 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 - - * 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 - - * configure.in: Fix HAVE_OPENSSL and HAVE_NSS checks as these were - always being defined. - -2001-10-01 Alex Graveley - - * 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 - - * src/libsoup/soup-ntlm.c: Remove redundant alloca define. - - * src/libsoup/soup-socket.c (soup_socket_server_new): Use - SOUP_SOCKET_CLOSE. - - * src/libsoup/soup-socket.h: Include winsock.h if windows. - -2001-09-28 Alex Graveley - - * 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 - - * 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 - - * src/libsoup/soup-socket.c: Remove Glib workarounds for Windows - socket io. - -2001-09-27 Alex Graveley - - * 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 - - * build/libsoup.def: Update for new exports. - -2001-09-27 Alex Graveley - - * src/libsoup/soup-dav-server.h: Fix constness for get_dav_prop - and get_custom_prop. - -2001-09-19 Dan Winship - - * 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 - - * 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 - - * 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 - - * src/libsoup/soup-serializer.c - (soup_serializer_get_namespace_prefix): Impl. - -2001-09-12 Alex Graveley - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * src/soup-core/soup-auth.c (soup_auth_new_digest): Set the - compare func on the returned object. - -2001-08-27 Joe Shaw - - * 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 - - * src/soup-wsdl/*: Format fixes. - * src/soup-wsdl-runtime/*: Format fixes. - -2001-08-26 Alex Graveley - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * build/libsoup.def: Update for DAV methods. - -2001-08-17 Alex Graveley - - * 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 - - * 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 - - * 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 - - * src/soup-core/soup-private.h: Include sys/socket.h for sa in - SoupAddress. - -2001-08-08 Alex Graveley - - * configure.in: Bump version to 0.4.3. - -2001-08-08 Alex Graveley - - * 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 - - * src/soup-core/soup-private.h: Define VERSION to "Win/0.4.2" for - Windows clients. - -2001-08-06 Alex Graveley - - * 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 - - * 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 - - * 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 - - * configure.in: Bump version to 0.4.2. - -2001-07-30 Alex Graveley - - * src/soup-core/soup-queue.c (soup_queue_read_headers_cb): - Content-length should be avoided for HEAD requests. - -2001-07-30 Alex Graveley - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * configure.in: Bump version to 0.4.0. - -2001-07-19 Alex Graveley - - * 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 - - * 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 - - * 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 - - * 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 - - * src/soup-wsdl-runtime/wsdl-typecodes.c: Add windows x86 type - alignment defines. - -2001-07-10 Alex Graveley - - * 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 - - * src/soup-core/soup-socket.c (soup_socket_server_new): Typo to go - to SETUP_ERROR on error. - -2001-07-09 Alex Graveley - - * 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 for - getpid(). - - * configure.in: Add checks for sys/sockio.h and sys/wait.h - -2001-07-09 Alex Graveley - - * build/Soup_core.dsp - build/Soup_wsdl_runtime.dsp - build/Soup_wsdl.dsp: Use unique Debug output directory. - -2001-07-09 Alex Graveley - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 from - . - - * src/soup-core/soup-serializer.h: Change the #include to from - . - -2001-06-04 Alex Graveley - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * Documentation - -2001-05-25 Alex Graveley - - * 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 - - * README: Update Licensing section for soup-ssl-proxy. - -2001-05-24 Larry Ewing - - * 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 - - * 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 - - * RELEASE (ANNOUNCE): Added. All release announcements should be - prepended here. - -2001-05-22 JP Rosevear - - * src/soup-core/soup-apache.c (soup_apache_read_request): null - terminate the buffer - -2001-05-22 Rodrigo Moya - - * 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 - - * 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 - - * 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 - - * README: "Subscribe" not "Subject" in - soup-list-request@ximian.com message body. :) - -2001-05-18 Alex Graveley - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * tests/simple-test.c (main): change this to something sensible - -2001-05-16 Rodrigo Moya - - * src/soup-wsdl/wsdl-soap-stubs.c: fully adapted to the new - SoupEnv stuff - -2001-05-16 Dick Porter - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * src/soup-core/soup-fault.[ch]: Format cleanups. - - * src/soup-core/soup-parser.[ch]: Ditto. - -2001-05-12 Rodrigo Moya - - * 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 - - * 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 - - * src/soup-core/soup-nss.c (soup_nss_init): Use NSS_InitReadWrite(). - (soup_nss_get_iochannel): set SSL_BadCertHook(). - -2001-05-10 Alex Graveley - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * src/soup-wsdl-runtime/wsdl-schema.c: Decide which schema parser to - call for a WSDL 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * src/soup-wsdl/wsdl-soap-stubs.c (wsdl_emit_soap_stubs): - #include and not soup-* - * src/soup-wsdl/wsdl-soap-headers.c (wsdl_emit_soap_headers): - #include and not soup-message.h, to match - with the output given by `gnome-config --cflags soup` - -2001-03-30 Dick Porter - - * 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 - - * configure.in: add CFLAGS to apxs parameters, to output the - correct compilation flags - -2001-03-21 Alex Graveley - - * 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 - - * 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 - - * 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 - - * 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 - - * src/soup-core/soup-apache.c (soup_apache_read_request): oops, - deleted too much - -2001-03-14 Dick Porter - - * 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 - - * 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 - - * 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 - - * 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 - - * src/soup-wsdl/wsdl-parse.c (wsdl_parse): set definitions = NULL - to pass -Werror. - -2001-03-09 Alex Graveley - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * src/soup-core/soup-server.h: soup_server_init should be an - extern function - -2001-03-07 Alex Graveley - - * 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 - - * 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 - - * 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 - - * configure.in: properly version the project and give an option to - disable more warnings - -2001-03-02 Alex Graveley - - * 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 - - * src/soup-core/gionspr.c: remove, as this is not used. - -2001-03-02 Alex Graveley - - * 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 - - * src/soup-core/soup-ssl-proxy.c: oops. should have been added - yesterday. - -2001-03-02 Alex Graveley - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * src/soup-core/soup-ssl.c (soup_get_ssl_iochannel): renamed to - soup_ssl_get_iochannel. - -2001-02-13 Alex Graveley - - * 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 - - * src/soup-core/soup-server.[ch]: Initial revision of server side - request handling dispatcher. - -2001-02-11 alex - - * 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 - - * 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 - -2001-01-31 Jeffrey Stedfast - - * src/soup-core/gionspr.c: Implemented (probably somewhat broken). - -2001-01-25 Rodrigo Moya - - * 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 - - * 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 - - * 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 - - * /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 - - * /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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * /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 - - * /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 - - * /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 - - * /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 - - * /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 - - * /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 - - * /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 - - * /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 - - * /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 568ab773..51dd2658 100644 --- 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 index 00000000..2a6f53a3 --- /dev/null +++ b/MAINTAINERS @@ -0,0 +1,3 @@ +Alex Graveley +Joe Shaw +Dan Winship diff --git a/Makefile.am b/Makefile.am index 8559c7cb..5b2c4dff 100644 --- a/Makefile.am +++ b/Makefile.am @@ -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 53bfd898..ee4d22e5 100644 --- 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. diff --git a/autogen.sh b/autogen.sh index 293b7972..9dd6c026 100755 --- a/autogen.sh +++ b/autogen.sh @@ -2,147 +2,20 @@ # 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 diff --git a/configure.in b/configure.in index 74aa9446..4629d660 100644 --- a/configure.in +++ b/configure.in @@ -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(<>, translit(alignof_$1, [a-z *], [A-Z_P]))dnl -dnl The cache variable name. -define(<>, 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 -#include -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} - " diff --git a/docs/reference/Makefile.am b/docs/reference/Makefile.am index 6763e827..5e0c5a72 100644 --- a/docs/reference/Makefile.am +++ b/docs/reference/Makefile.am @@ -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" diff --git a/libsoup/.cvsignore b/libsoup/.cvsignore index 69fb0bd8..0be24a01 100644 --- a/libsoup/.cvsignore +++ b/libsoup/.cvsignore @@ -4,3 +4,4 @@ .libs Makefile Makefile.in +libsoup-ssl-proxy diff --git a/libsoup/Makefile.am b/libsoup/Makefile.am index e47c5752..8e6f1697 100644 --- a/libsoup/Makefile.am +++ b/libsoup/Makefile.am @@ -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) diff --git a/libsoup/soup-auth.c b/libsoup/soup-auth.c index dd282925..2b3b22d4 100644 --- a/libsoup/soup-auth.c +++ b/libsoup/soup-auth.c @@ -14,14 +14,7 @@ #include #endif -#ifdef HAVE_UNISTD_H #include -#endif - -#ifdef SOUP_WIN32 -#include -#endif - #include #include #include @@ -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; @@ -625,6 +590,33 @@ soup_auth_lookup (SoupContext *ctx) return ret; } +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) { @@ -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); -} diff --git a/libsoup/soup-auth.h b/libsoup/soup-auth.h index 75a49459..f1634539 100644 --- a/libsoup/soup-auth.h +++ b/libsoup/soup-auth.h @@ -15,13 +15,22 @@ #include #include -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 */ diff --git a/libsoup/soup-context.c b/libsoup/soup-context.c index 28d2c5f3..bd21d69d 100644 --- a/libsoup/soup-context.c +++ b/libsoup/soup-context.c @@ -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) @@ -12,10 +12,7 @@ #include #endif -#ifdef HAVE_UNISTD_H #include -#endif - #include #include #include @@ -23,16 +20,9 @@ #include #include -#ifdef HAVE_SYS_SOCKET_H #include -#endif - -#ifdef HAVE_NETINET_TCP_H #include -#endif -#ifdef HAVE_NETINET_IN_H #include -#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 diff --git a/libsoup/soup-context.h b/libsoup/soup-context.h index c10fe217..e0b008aa 100644 --- a/libsoup/soup-context.h +++ b/libsoup/soup-context.h @@ -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) diff --git a/libsoup/soup-headers.c b/libsoup/soup-headers.c index 99cf232f..6924f392 100644 --- a/libsoup/soup-headers.c +++ b/libsoup/soup-headers.c @@ -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, diff --git a/libsoup/soup-headers.h b/libsoup/soup-headers.h index 5f33480c..70aaa7ba 100644 --- a/libsoup/soup-headers.h +++ b/libsoup/soup-headers.h @@ -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) diff --git a/libsoup/soup-message.c b/libsoup/soup-message.c index 654ee19c..16e87fce 100644 --- a/libsoup/soup-message.c +++ b/libsoup/soup-message.c @@ -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) @@ -17,18 +17,6 @@ #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) { @@ -218,22 +211,6 @@ soup_message_cleanup (SoupMessage *req) soup_queue_remove_request (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) { @@ -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); } @@ -512,6 +492,122 @@ soup_message_foreach_remove_header (GHashTable *hash, &data); } +/** + * 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. @@ -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; } } diff --git a/libsoup/soup-message.h b/libsoup/soup-message.h index 631da19d..c46c6e94 100644 --- a/libsoup/soup-message.h +++ b/libsoup/soup-message.h @@ -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*/ diff --git a/libsoup/soup-misc.c b/libsoup/soup-misc.c index 1310fe5c..aa7765c4 100644 --- a/libsoup/soup-misc.c +++ b/libsoup/soup-misc.c @@ -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; diff --git a/libsoup/soup-misc.h b/libsoup/soup-misc.h index be80993b..ba3aa8c5 100644 --- a/libsoup/soup-misc.h +++ b/libsoup/soup-misc.h @@ -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 */ diff --git a/libsoup/soup-nss.c b/libsoup/soup-nss.c index edadbd93..a9517528 100644 --- a/libsoup/soup-nss.c +++ b/libsoup/soup-nss.c @@ -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) { diff --git a/libsoup/soup-nss.h b/libsoup/soup-nss.h index 1aaa0a45..99ac3fe6 100644 --- a/libsoup/soup-nss.h +++ b/libsoup/soup-nss.h @@ -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 #include +#include -GIOChannel *soup_nss_get_iochannel (GIOChannel *sock); +GIOChannel *soup_nss_get_iochannel (GIOChannel *sock, SoupSSLType type); void soup_nss_set_security_policy (SoupSecurityPolicy policy); diff --git a/libsoup/soup-ntlm.c b/libsoup/soup-ntlm.c index 64f809fe..734c7eec 100644 --- a/libsoup/soup-ntlm.c +++ b/libsoup/soup-ntlm.c @@ -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 diff --git a/libsoup/soup-ntlm.h b/libsoup/soup-ntlm.h index 3149805a..5b35f429 100644 --- a/libsoup/soup-ntlm.h +++ b/libsoup/soup-ntlm.h @@ -13,19 +13,22 @@ #include -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 */ diff --git a/libsoup/soup-openssl.c b/libsoup/soup-openssl.c index d8c8eac9..015cbf50 100644 --- a/libsoup/soup-openssl.c +++ b/libsoup/soup-openssl.c @@ -14,10 +14,7 @@ #ifdef HAVE_OPENSSL_SSL_H -#ifdef HAVE_UNISTD_H #include -#endif - #include #include @@ -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; diff --git a/libsoup/soup-openssl.h b/libsoup/soup-openssl.h index 2a00983b..dbcd25a7 100644 --- a/libsoup/soup-openssl.h +++ b/libsoup/soup-openssl.h @@ -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 */ diff --git a/libsoup/soup-private.h b/libsoup/soup-private.h index 55005081..f31e979c 100644 --- a/libsoup/soup-private.h +++ b/libsoup/soup-private.h @@ -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) @@ -13,46 +13,16 @@ * 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 #endif -#ifdef SOUP_WIN32 -# include -# define alloca _alloca -#else -# ifdef HAVE_ALLOCA_H -# include -# else -# ifdef _AIX -# pragma alloca -# else -# ifndef alloca /* predefined by HP cc +Olibcalls */ - char *alloca (); -# endif -# endif -# endif -#endif - #include - -#ifdef HAVE_NETINET_IN_H #include -#endif - -#ifdef HAVE_SYS_SOCKET_H #include -#endif - -#ifdef SOUP_WIN32 -#define VERSION "Win/0.7.99" -#include -#include -#include -#endif #include #include @@ -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); diff --git a/libsoup/soup-queue.c b/libsoup/soup-queue.c index 365a582a..e0153657 100644 --- a/libsoup/soup-queue.c +++ b/libsoup/soup-queue.c @@ -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); diff --git a/libsoup/soup-queue.h b/libsoup/soup-queue.h index 30ba5d3f..0def1f44 100644 --- a/libsoup/soup-queue.h +++ b/libsoup/soup-queue.h @@ -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) diff --git a/libsoup/soup-server.c b/libsoup/soup-server.c index 82c4179a..fe689ad0 100644 --- a/libsoup/soup-server.c +++ b/libsoup/soup-server.c @@ -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 #endif -#ifdef HAVE_UNISTD_H #include -#endif #ifdef HAVE_SYS_FILIO_H #include @@ -28,12 +26,6 @@ #include #endif -#ifdef SOUP_WIN32 -#define ioctl ioctlsocket -#define STDIN_FILENO 0 -#define STDOUT_FILENO 1 -#endif - extern char **environ; #include @@ -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) { diff --git a/libsoup/soup-server.h b/libsoup/soup-server.h index 9245381a..c4bb6285 100644 --- a/libsoup/soup-server.h +++ b/libsoup/soup-server.h @@ -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 #include #include +#include #include #include @@ -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. diff --git a/libsoup/soup-socket-unix.c b/libsoup/soup-socket-unix.c index a46fecc8..c5dd86ba 100644 --- a/libsoup/soup-socket-unix.c +++ b/libsoup/soup-socket-unix.c @@ -36,7 +36,6 @@ #include "soup-socket.h" #include -#include #include #include #include @@ -69,6 +68,11 @@ # 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; diff --git a/libsoup/soup-socket.c b/libsoup/soup-socket.c index 4b733205..0b51ce30 100644 --- a/libsoup/soup-socket.c +++ b/libsoup/soup-socket.c @@ -22,17 +22,9 @@ #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 -# 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 +#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; diff --git a/libsoup/soup-socket.h b/libsoup/soup-socket.h index a190ecfb..e9d942c5 100644 --- a/libsoup/soup-socket.h +++ b/libsoup/soup-socket.h @@ -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) diff --git a/libsoup/soup-socks.c b/libsoup/soup-socks.c index 623be186..22948590 100644 --- a/libsoup/soup-socks.c +++ b/libsoup/soup-socks.c @@ -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) diff --git a/libsoup/soup-socks.h b/libsoup/soup-socks.h index a1d84616..e602cfa0 100644 --- a/libsoup/soup-socks.h +++ b/libsoup/soup-socks.h @@ -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) diff --git a/libsoup/soup-ssl-proxy.c b/libsoup/soup-ssl-proxy.c index 5d94066a..e161acce 100644 --- a/libsoup/soup-ssl-proxy.c +++ b/libsoup/soup-ssl-proxy.c @@ -12,10 +12,7 @@ #include #endif -#ifdef HAVE_UNISTD_H #include -#endif - #include #include #include @@ -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); diff --git a/libsoup/soup-ssl.c b/libsoup/soup-ssl.c index 05302cad..63adb338 100644 --- a/libsoup/soup-ssl.c +++ b/libsoup/soup-ssl.c @@ -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) @@ -12,21 +12,12 @@ #include #endif -#ifdef HAVE_UNISTD_H #include -#endif - -#ifdef HAVE_SYS_WAIT_H +#include #include -#endif - -#ifdef HAVE_SYS_SOCKET_H #include -#endif - #include #include -#include #include #include @@ -34,23 +25,14 @@ #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); +} diff --git a/libsoup/soup-ssl.h b/libsoup/soup-ssl.h index 0cfd438b..9e398e48 100644 --- a/libsoup/soup-ssl.h +++ b/libsoup/soup-ssl.h @@ -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) @@ -13,6 +13,12 @@ #include +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 */ diff --git a/libsoup/soup-transfer.c b/libsoup/soup-transfer.c index 332cd7c0..fdbc4562 100644 --- a/libsoup/soup-transfer.c +++ b/libsoup/soup-transfer.c @@ -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); diff --git a/libsoup/soup-transfer.h b/libsoup/soup-transfer.h index ba0d6af1..ab556b1d 100644 --- a/libsoup/soup-transfer.h +++ b/libsoup/soup-transfer.h @@ -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) diff --git a/libsoup/soup-uri.c b/libsoup/soup-uri.c index 970e2b4f..8d11f467 100644 --- a/libsoup/soup-uri.c +++ b/libsoup/soup-uri.c @@ -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. diff --git a/libsoup/soup-uri.h b/libsoup/soup-uri.h index f7d297a4..c83952bf 100644 --- a/libsoup/soup-uri.h +++ b/libsoup/soup-uri.h @@ -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 { diff --git a/libsoup/soup.h b/libsoup/soup.h index bda95f1f..f5fc25e0 100644 --- a/libsoup/soup.h +++ b/libsoup/soup.h @@ -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 -#include -#include #include #include -#include -#include -#include -#include #include #include diff --git a/soup-2.0.pc.in b/soup-2.0.pc.in index 3324fbf3..562e4996 100644 --- a/soup-2.0.pc.in +++ b/soup-2.0.pc.in @@ -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 -- cgit v1.2.3