/* $Id: minisoap.c,v 1.12 2007/12/13 17:09:03 nanard Exp $ */ /* Project : miniupnp * Author : Thomas Bernard * Copyright (c) 2005 Thomas Bernard * This software is subject to the conditions detailed in the * LICENCE file provided in this distribution. * * Minimal SOAP implementation for UPnP protocol. */ #include #include #ifdef WIN32 #include #include #define snprintf _snprintf #else #include #include #include #endif #include "minisoap.h" /* only for malloc */ #include /* httpWrite sends the headers and the body to the socket * and returns the number of bytes sent */ static int httpWrite(int fd, const char * body, int bodysize, const char * headers, int headerssize) { int n = 0; /*n = write(fd, headers, headerssize);*/ /*if(bodysize>0) n += write(fd, body, bodysize);*/ /* Note : my old linksys router only took into account * soap request that are sent into only one packet */ char * p; p = malloc(headerssize+bodysize); memcpy(p, headers, headerssize); memcpy(p+headerssize, body, bodysize); /*n = write(fd, p, headerssize+bodysize);*/ n = send(fd, p, headerssize+bodysize, 0); #ifdef WIN32 shutdown(fd, SD_SEND); #else shutdown(fd, SHUT_WR); /*SD_SEND*/ #endif free(p); return n; } /* self explanatory */ int soapPostSubmit(int fd, const char * url, const char * host, unsigned short port, const char * action, const char * body) { int bodysize; char headerbuf[1024]; int headerssize; bodysize = (int)strlen(body); /* We are not using keep-alive HTTP connections. * HTTP/1.1 needs the header Connection: close to do that. * This is the default with HTTP/1.0 */ headerssize = snprintf(headerbuf, sizeof(headerbuf), /* "POST %s HTTP/1.1\r\n"*/ "POST %s HTTP/1.0\r\n" "Host: %s:%d\r\n" "User-Agent: POSIX, UPnP/1.0, miniUPnPc/1.0\r\n" "Content-Length: %d\r\n" "Content-Type: text/xml\r\n" "SOAPAction: \"%s\"\r\n" /* "Connection: Close\r\n" */ "\r\n", url, host, port, bodysize, action); return httpWrite(fd, body, bodysize, headerbuf, headerssize); }