Annotation of embedaddon/miniupnpc/minisoap.c, revision 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>