[BACK] Return to HTTP.c CVS log [TXT] [DIR] Up to [Public] / libwww / Library / src

Annotation of libwww/Library/src/HTTP.c, revision 1.1

1.1 ! timbl 1: /*   HyperText Tranfer Protocol   - Client implementation     HTTP.c
 ! 2: **   ==========================
 ! 3: */
 ! 4: 
 ! 5: /*   Module parameters:
 ! 6: **   -----------------
 ! 7: **
 ! 8: ** These may be undefined and redefined by syspec.h
 ! 9: */
 ! 10: #include "HTParse.h"
 ! 11: #include "HTUtils.h"
 ! 12: #include "tcp.h"
 ! 13: #include "HTTCP.h"
 ! 14: #include "HTFormat.h"
 ! 15: 
 ! 16: 
 ! 17: /*       Load Document from HTTP Server         HTLoadHTTP()
 ! 18: **       ==============================
 ! 19: **
 ! 20: **   Given a hypertext address, this routine loads a document.
 ! 21: **
 ! 22: **
 ! 23: ** On entry,
 ! 24: **   arg   is the hypertext reference of the article to be loaded.
 ! 25: **   gate  is nill if no gateway, else the gateway address.
 ! 26: **
 ! 27: ** On exit,
 ! 28: **   returns >=0   If no error, a good socket number
 ! 29: **       <0   Error.
 ! 30: **
 ! 31: **   The socket must be closed by the caller after the document has been
 ! 32: **   read.
 ! 33: **
 ! 34: */
 ! 35: PUBLIC int HTLoadHTTP ARGS3 (CONST char *, arg,
 ! 36: /*   CONST char *,  gate, */
 ! 37:    HTAnchor *,   anAnchor,
 ! 38:    int,      diag)
 ! 39: {
 ! 40:   int s;               /* Socket number for returned data */
 ! 41:   char *command;           /* The whole command */
 ! 42:   int status;                /* tcp return */
 ! 43:   int gateway = 0;          /* disable this feature */
 ! 44:   
 ! 45:   SockA soc_address;         /* Binary network address */
 ! 46:   SockA * sin = &soc_address;
 ! 47: 
 ! 48:   if (!arg) return -3;        /* Bad if no name sepcified   */
 ! 49:   if (!*arg) return -2;       /* Bad if name had zero length */
 ! 50: 
 ! 51: /* Set up defaults:
 ! 52: */
 ! 53: #ifdef DECNET
 ! 54:    sin->sdn_family = AF_DECnet;    /* Family = DECnet, host order */
 ! 55:    sin->sdn_objnum = DNP_OBJ;     /* Default: http object number */
 ! 56: #else /* Internet */
 ! 57:    sin->sin_family = AF_INET;     /* Family = internet, host order */
 ! 58:    sin->sin_port = htons(TCP_PORT);  /* Default: http port  */
 ! 59: #endif
 ! 60: 
 ! 61:   if (TRACE) {
 ! 62:     if (gate) fprintf(stderr,
 ! 63:        "HTTPAccess: Using gateway %s for %s\n", gate, arg);
 ! 64:     else fprintf(stderr, "HTTPAccess: Direct access for %s\n", arg);
 ! 65:   }
 ! 66:   
 ! 67: /* Get node name and optional port number:
 ! 68: */
 ! 69:   {
 ! 70:    char *p1 = HTParse(gate ? gate : arg, "", PARSE_HOST);
 ! 71:    int status = HTParseInet(sin, p1); /* TBL 920622 */
 ! 72:     free(p1);
 ! 73:    if (status) return status;  /* No such host for example */
 ! 74:   }
 ! 75:   
 ! 76:  
 ! 77: /*   Now, let's get a socket set up from the server for the sgml data:
 ! 78: */   
 ! 79: #ifdef DECNET
 ! 80:   s = socket(AF_DECnet, SOCK_STREAM, 0);
 ! 81: #else
 ! 82:   s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
 ! 83: #endif
 ! 84:   status = connect(s, (struct sockaddr*)&soc_address, sizeof(soc_address));
 ! 85:   if (status < 0) {
 ! 86: #ifndef DECNET
 ! 87:    /* This code is temporary backward-compatibility. It should
 ! 88:      go away when no server runs on port 2784 alone */
 ! 89:    if (sin->sin_port == htons(TCP_PORT)) { /* Try the old one */
 ! 90:     if (TRACE) printf (
 ! 91:      "HTTP: Port %d doesn't answer (errno = %d). Trying good old port %d...\n",
 ! 92:      TCP_PORT, errno, OLD_TCP_PORT);
 ! 93:     sin->sin_port = htons(OLD_TCP_PORT);
 ! 94:     /* First close current socket and open a clean one */
 ! 95:     status = NETCLOSE (s);
 ! 96:     s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
 ! 97:     status = connect(s, (struct sockaddr*)&soc_address,
 ! 98:              sizeof(soc_address));
 ! 99:    }
 ! 100:    if (status < 0)
 ! 101: #endif
 ! 102:     {
 ! 103:      if (TRACE) fprintf(stderr, 
 ! 104:       "HTTP: Unable to connect to remote host for `%s' (errno = %d).\n", arg, errno);
 ! 105:      /* free(command);  BUG OUT TBL 921121 */
 ! 106:      return HTInetStatus("connect");
 ! 107:     }
 ! 108:    }
 ! 109:   
 ! 110:   if (TRACE) fprintf(stderr, "HTTP connected, socket %d\n", s);
 ! 111: 
 ! 112: /*   Ask that node for the document,
 ! 113: **   omitting the host name & anchor if not gatewayed.
 ! 114: */    
 ! 115:   if (gate) {
 ! 116:     command = malloc(4 + strlen(arg)+ 2 + 1);
 ! 117:     if (command == NULL) outofmem(__FILE__, "HTLoadHTTP");
 ! 118:     strcpy(command, "GET ");
 ! 119:    strcat(command, arg);
 ! 120:   } else { /* not gatewayed */
 ! 121:    char * p1 = HTParse(arg, "", PARSE_PATH|PARSE_PUNCTUATION);
 ! 122:     command = malloc(4 + strlen(p1)+ 2 + 1);
 ! 123:     if (command == NULL) outofmem(__FILE__, "HTLoadHTTP");
 ! 124:     strcpy(command, "GET ");
 ! 125:    strcat(command, p1);
 ! 126:    free(p1);
 ! 127:   }
 ! 128:   strcat(command, "\r\n");      /* Include CR for telnet compat. */
 ! 129:      
 ! 130: 
 ! 131:   if (TRACE) fprintf(stderr, "HTTP writing command `%s' to socket %d\n", command, s);
 ! 132:   
 ! 133: #ifdef NOT_ASCII
 ! 134:   {
 ! 135:    char * p;
 ! 136:    for(p = command; *p; p++) {
 ! 137:      *p = TOASCII(*p);
 ! 138:    }
 ! 139:   }
 ! 140: #endif
 ! 141: 
 ! 142:   status = NETWRITE(s, command, (int)strlen(command));
 ! 143:   free(command);
 ! 144:   if (status<0) {
 ! 145:    if (TRACE) fprintf(stderr, "HTTPAccess: Unable to send command.\n");
 ! 146:      return HTInetStatus("send");
 ! 147:   }
 ! 148: 
 ! 149: /*   Now load the data
 ! 150: */
 ! 151:   HTParseFormat(diag ? WWW_PLAINTEXT : WWW_HTML,
 ! 152:         (HTParentAnchor *) anAnchor, s);
 ! 153:   
 ! 154:   if (TRACE) fprintf(stderr, "HTTP: close socket %d.\n", s);
 ! 155:   status = NETCLOSE(s);
 ! 156: 
 ! 157:   return HT_LOADED;         /* Good return */
 ! 158: }
 ! 159: 
 ! 160: /*   Protocol descriptor
 ! 161: */
 ! 162: 
 ! 163: PUBLIC HTProtocol = { "http", HTLoadHTTP, 0 };

Webmaster

AltStyle によって変換されたページ (->オリジナル) /