summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar snowdrop2005-07-27 07:45:40 +0000
committerGravatar snowdrop2005-07-27 07:45:40 +0000
commitd7c4593ff2b4c55fdc33676e20ecafff1c87e62c (patch)
tree6dd78a36c5d1b60fd21803b8ece6e1cf6eb967c0
parent8761f387a1a6079081d4db85d7716609efb2e242 (diff)
downloadcsoap-d7c4593ff2b4c55fdc33676e20ecafff1c87e62c.tar.gz
csoap-d7c4593ff2b4c55fdc33676e20ecafff1c87e62c.tar.bz2
Changes of Menzo
nanohttp/nanohttp-client.c and nanohttp/nanohttp-client.h added httpc_close_free, a variant of httpc_free which explicitly asks to close the socket. Otherwise after a number of client/server interactions we get socket error 24 (Too many open files). libcsoap/soap-client.c call httpc_close_free instead of httpc_free nanohttp/nanohttp-socket.c in hsocket_close call shutdown with SHUT_RDWR instead of 1 (SHUT_WR). Otherwise after a number of client/server interactions the shutdown call doesn't return anymore.
-rw-r--r--libcsoap/soap-client.c22
-rw-r--r--nanohttp/nanohttp-client.c15
-rw-r--r--nanohttp/nanohttp-client.h7
-rw-r--r--nanohttp/nanohttp-socket.c4
4 files changed, 33 insertions, 15 deletions
diff --git a/libcsoap/soap-client.c b/libcsoap/soap-client.c
index e12317c..b015a9c 100644
--- a/libcsoap/soap-client.c
+++ b/libcsoap/soap-client.c
@@ -1,5 +1,5 @@
/******************************************************************
-* $Id: soap-client.c,v 1.16 2005/05/27 19:28:14 snowdrop Exp $
+* $Id: soap-client.c,v 1.17 2005/07/27 07:45:40 snowdrop Exp $
*
* CSOAP Project: A SOAP client/server library in C
* Copyright (C) 2003 Ferhat Ayaz
@@ -121,21 +121,21 @@ soap_client_invoke(SoapCtx *call, SoapCtx** response, const char *url, const cha
status = httpc_post_begin(conn, url);
if (status != H_OK) {
- httpc_free(conn);
+ httpc_close_free(conn);
xmlBufferFree(buffer);
return status;
}
status = http_output_stream_write_string(conn->out, content);
if (status != H_OK) {
- httpc_free(conn);
+ httpc_close_free(conn);
xmlBufferFree(buffer);
return status;
}
status = httpc_post_end(conn, &res);
if (status != H_OK) {
- httpc_free(conn);
+ httpc_close_free(conn);
xmlBufferFree(buffer);
return status;
}
@@ -149,21 +149,21 @@ soap_client_invoke(SoapCtx *call, SoapCtx** response, const char *url, const cha
sprintf(start_id, "289247829121218%d", counter++);
status = httpc_mime_begin(conn, url, start_id, "", "text/xml");
if (status != H_OK) {
- httpc_free(conn);
+ httpc_close_free(conn);
xmlBufferFree(buffer);
return status;
}
status = httpc_mime_next(conn, start_id, "text/xml", "binary");
if (status != H_OK) {
- httpc_free(conn);
+ httpc_close_free(conn);
xmlBufferFree(buffer);
return status;
}
status = http_output_stream_write(conn->out, content, strlen(content));
if (status != H_OK) {
- httpc_free(conn);
+ httpc_close_free(conn);
xmlBufferFree(buffer);
return status;
}
@@ -175,7 +175,7 @@ soap_client_invoke(SoapCtx *call, SoapCtx** response, const char *url, const cha
part->content_type, part->transfer_encoding, part->filename);
if (status != H_OK) {
log_error2("Send file failed. Status:%d", status);
- httpc_free(conn);
+ httpc_close_free(conn);
xmlBufferFree(buffer);
return status;
}
@@ -184,7 +184,7 @@ soap_client_invoke(SoapCtx *call, SoapCtx** response, const char *url, const cha
status = httpc_mime_end(conn, &res);
if (status != H_OK)
{
- httpc_free(conn);
+ httpc_close_free(conn);
xmlBufferFree(buffer);
return status;
}
@@ -197,7 +197,7 @@ soap_client_invoke(SoapCtx *call, SoapCtx** response, const char *url, const cha
status = _soap_client_build_result(res, &res_env);
if (status != H_OK) {
hresponse_free(res);
- httpc_free(conn);
+ httpc_close_free(conn);
return status;
}
@@ -221,7 +221,7 @@ soap_client_invoke(SoapCtx *call, SoapCtx** response, const char *url, const cha
hresponse_free(res);
- httpc_free(conn);
+ httpc_close_free(conn);
return H_OK;
}
diff --git a/nanohttp/nanohttp-client.c b/nanohttp/nanohttp-client.c
index b1d101f..fc1d8f5 100644
--- a/nanohttp/nanohttp-client.c
+++ b/nanohttp/nanohttp-client.c
@@ -1,5 +1,5 @@
/******************************************************************
-* $Id: nanohttp-client.c,v 1.27 2005/05/27 19:28:15 snowdrop Exp $
+* $Id: nanohttp-client.c,v 1.28 2005/07/27 07:45:56 snowdrop Exp $
*
* CSOAP Project: A http client/server library in C
* Copyright (C) 2003 Ferhat Ayaz
@@ -92,6 +92,19 @@ httpc_new()
return res;
}
+/*--------------------------------------------------
+FUNCTION: httpc_close_free
+DESC: Close and free the given http client object.
+----------------------------------------------------*/
+void
+httpc_close_free(httpc_conn_t * conn)
+{
+ if (conn == NULL)
+ return;
+
+ hsocket_close(conn->sock);
+ httpc_free(conn);
+}
/*--------------------------------------------------
FUNCTION: httpc_free
diff --git a/nanohttp/nanohttp-client.h b/nanohttp/nanohttp-client.h
index 06c0fcd..020f7e3 100644
--- a/nanohttp/nanohttp-client.h
+++ b/nanohttp/nanohttp-client.h
@@ -1,5 +1,5 @@
/******************************************************************
- * $Id: nanohttp-client.h,v 1.14 2004/11/02 23:09:26 snowdrop Exp $
+ * $Id: nanohttp-client.h,v 1.15 2005/07/27 07:45:57 snowdrop Exp $
*
* CSOAP Project: A http client/server library in C
* Copyright (C) 2003 Ferhat Ayaz
@@ -71,6 +71,11 @@ void httpc_destroy();
httpc_conn_t* httpc_new();
/**
+ Close and release a connection
+*/
+void httpc_close_free(httpc_conn_t* conn);
+
+/**
Release a connections
*/
void httpc_free(httpc_conn_t* conn);
diff --git a/nanohttp/nanohttp-socket.c b/nanohttp/nanohttp-socket.c
index 468f3b9..69b17f3 100644
--- a/nanohttp/nanohttp-socket.c
+++ b/nanohttp/nanohttp-socket.c
@@ -1,5 +1,5 @@
/******************************************************************
-* $Id: nanohttp-socket.c,v 1.33 2005/05/27 19:28:16 snowdrop Exp $
+* $Id: nanohttp-socket.c,v 1.34 2005/07/27 07:45:57 snowdrop Exp $
*
* CSOAP Project: A http client/server library in C
* Copyright (C) 2003 Ferhat Ayaz
@@ -322,7 +322,7 @@ hsocket_close (hsocket_t sock)
closesocket(sock);
#else
- shutdown(sock, 1);
+ shutdown(sock, SHUT_RDWR);
while (recv(sock, junk, sizeof(junk), 0)>0) { };
close (sock);
#endif