Annotation of embedaddon/miniupnpc/minisoap.c, revision 1.1.1.1

1.1       misho       1: /* $Id: minisoap.c,v 1.21 2011/03/22 19:15:35 nanard Exp $ */
                      2: /* Project : miniupnp
                      3:  * Author : Thomas Bernard
                      4:  * Copyright (c) 2005-2009 Thomas Bernard
                      5:  * This software is subject to the conditions detailed in the
                      6:  * LICENCE file provided in this distribution.
                      7:  *
                      8:  * Minimal SOAP implementation for UPnP protocol.
                      9:  */
                     10: #include <stdio.h>
                     11: #include <string.h>
                     12: #ifdef WIN32
                     13: #include <io.h>
                     14: #include <winsock2.h>
                     15: #define snprintf _snprintf
                     16: #else
                     17: #include <unistd.h>
                     18: #include <sys/types.h>
                     19: #include <sys/socket.h>
                     20: #endif
                     21: #include "minisoap.h"
                     22: #include "miniupnpcstrings.h"
                     23: 
                     24: /* only for malloc */
                     25: #include <stdlib.h>
                     26: 
                     27: #ifdef WIN32
                     28: #define PRINT_SOCKET_ERROR(x)    printf("Socket error: %s, %d\n", x, WSAGetLastError());
                     29: #else
                     30: #define PRINT_SOCKET_ERROR(x) perror(x)
                     31: #endif
                     32: 
                     33: /* httpWrite sends the headers and the body to the socket
                     34:  * and returns the number of bytes sent */
                     35: static int
                     36: httpWrite(int fd, const char * body, int bodysize,
                     37:           const char * headers, int headerssize)
                     38: {
                     39:        int n = 0;
                     40:        /*n = write(fd, headers, headerssize);*/
                     41:        /*if(bodysize>0)
                     42:                n += write(fd, body, bodysize);*/
                     43:        /* Note : my old linksys router only took into account
                     44:         * soap request that are sent into only one packet */
                     45:        char * p;
                     46:        /* TODO: AVOID MALLOC */
                     47:        p = malloc(headerssize+bodysize);
                     48:        if(!p)
                     49:          return 0;
                     50:        memcpy(p, headers, headerssize);
                     51:        memcpy(p+headerssize, body, bodysize);
                     52:        /*n = write(fd, p, headerssize+bodysize);*/
                     53:        n = send(fd, p, headerssize+bodysize, 0);
                     54:        if(n<0) {
                     55:          PRINT_SOCKET_ERROR("send");
                     56:        }
                     57:        /* disable send on the socket */
                     58:        /* draytek routers dont seems to like that... */
                     59: #if 0
                     60: #ifdef WIN32
                     61:        if(shutdown(fd, SD_SEND)<0) {
                     62: #else
                     63:        if(shutdown(fd, SHUT_WR)<0)     { /*SD_SEND*/
                     64: #endif
                     65:                PRINT_SOCKET_ERROR("shutdown");
                     66:        }
                     67: #endif
                     68:        free(p);
                     69:        return n;
                     70: }
                     71: 
                     72: /* self explanatory  */
                     73: int soapPostSubmit(int fd,
                     74:                    const char * url,
                     75:                                   const char * host,
                     76:                                   unsigned short port,
                     77:                                   const char * action,
                     78:                                   const char * body,
                     79:                                   const char * httpversion)
                     80: {
                     81:        int bodysize;
                     82:        char headerbuf[512];
                     83:        int headerssize;
                     84:        char portstr[8];
                     85:        bodysize = (int)strlen(body);
                     86:        /* We are not using keep-alive HTTP connections.
                     87:         * HTTP/1.1 needs the header Connection: close to do that.
                     88:         * This is the default with HTTP/1.0
                     89:         * Using HTTP/1.1 means we need to support chunked transfer-encoding :
                     90:         * When using HTTP/1.1, the router "BiPAC 7404VNOX" always use chunked
                     91:         * transfer encoding. */
                     92:     /* Connection: Close is normally there only in HTTP/1.1 but who knows */
                     93:        portstr[0] = '\0';
                     94:        if(port != 80)
                     95:                snprintf(portstr, sizeof(portstr), ":%hu", port);
                     96:        headerssize = snprintf(headerbuf, sizeof(headerbuf),
                     97:                        "POST %s HTTP/%s\r\n"
                     98:                           "Host: %s%s\r\n"
                     99:                                           "User-Agent: " OS_STRING ", UPnP/1.0, MiniUPnPc/" MINIUPNPC_VERSION_STRING "\r\n"
                    100:                           "Content-Length: %d\r\n"
                    101:                                           "Content-Type: text/xml\r\n"
                    102:                                           "SOAPAction: \"%s\"\r\n"
                    103:                                           "Connection: Close\r\n"
                    104:                                           "Cache-Control: no-cache\r\n"        /* ??? */
                    105:                                           "Pragma: no-cache\r\n"
                    106:                                           "\r\n",
                    107:                                           url, httpversion, host, portstr, bodysize, action);
                    108: #ifdef DEBUG
                    109:        /*printf("SOAP request : headersize=%d bodysize=%d\n",
                    110:               headerssize, bodysize);
                    111:        */
                    112:        printf("SOAP request : POST %s HTTP/%s - Host: %s%s\n",
                    113:                url, httpversion, host, portstr);
                    114:        printf("SOAPAction: \"%s\" - Content-Length: %d\n", action, bodysize);
                    115:        printf("Headers :\n%s", headerbuf);
                    116:        printf("Body :\n%s\n", body);
                    117: #endif
                    118:        return httpWrite(fd, body, bodysize, headerbuf, headerssize);
                    119: }
                    120: 
                    121: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>