rem: HttpOpen(char *url, Ns_Set *hdrs)
add: HttpOpen(char *method, char *url, Ns_Set *hdrs, char *body)
context: HttpOpen(char *url, Ns_Set *hdrs){    Http *httpPtr = NULL;    SOCKET sock;    char *host, *file, *port;    int i;    if (strncmp(url, "http://", 7) != 0 || url[7] == '\0') {	return NULL;    }    host = url + 7;    file = strchr(host, '/');    if (file != NULL) {    	*file = '\0';    }    port = strchr(host, ':');    if (port == NULL) {	i = 80;    } else {	*port = '\0';	i = atoi(port+1);    }    sock = Ns_SockAsyncConnect(host, i);    if (port != NULL) {	*port = ':';    }    if (sock != INVALID_SOCKET) {    	httpPtr = ns_malloc(sizeof(Http));	httpPtr->state = REQ_SEND;	httpPtr->sock = sock;    	Tcl_DStringInit(&httpPtr->ds);	if (file != NULL) {	    *file = '/';	}	Ns_DStringVarAppend(&httpPtr->ds, "GET ", file ? file : "/", " HTTP/1.0\r\n", NULL);	if (file != NULL) {	    *file = '\0';	}	Ns_DStringVarAppend(&httpPtr->ds,	    "User-Agent: ", Ns_InfoServerName(), "/", Ns_InfoServerVersion(), "\r\n"	    "Connection: close\r\n"	    "Host: ", host, "\r\n", NULL);	if (file != NULL) {	    *file = '/';	}	if (hdrs != NULL) {	    for (i = 0; i < Ns_SetSize(hdrs); i++) {		Ns_DStringVarAppend(&httpPtr->ds,		    Ns_SetKey(hdrs, i), ": ", Ns_SetValue(hdrs, i), "\r\n", NULL);	    }	}	Tcl_DStringAppend(&httpPtr->ds, "\r\n", 2);	httpPtr->next = httpPtr->ds.string;    	httpPtr->len = httpPtr->ds.length;    }    if (file != NULL) {	*file = '/';    }    return httpPtr;}