ssl.c
上传用户:seven77cht
上传日期:2007-01-04
资源大小:486k
文件大小:4k
源码类别:

浏览器

开发平台:

Unix_Linux

  1. /***************************************
  2.   $Header: /home/amb/wwwoffle/RCS/ssl.c 1.6 1999/12/07 18:42:13 amb Exp $
  3.   WWWOFFLE - World Wide Web Offline Explorer - Version 2.5c.
  4.   SSL (Secure Socket Layer) Tunneling functions.
  5.   ******************/ /******************
  6.   Written by Andrew M. Bishop
  7.   This file Copyright 1998,99 Andrew M. Bishop
  8.   It may be distributed under the GNU Public License, version 2, or
  9.   any higher version.  See section COPYING of the GNU Public license
  10.   for conditions under which this file may be redistributed.
  11.   ***************************************/
  12. #include <stdlib.h>
  13. #include <string.h>
  14. #include <sys/time.h>
  15. #include <sys/types.h>
  16. #include <fcntl.h>
  17. #include <unistd.h>
  18. #include "wwwoffle.h"
  19. #include "errors.h"
  20. #include "misc.h"
  21. #include "config.h"
  22. #include "sockets.h"
  23. #include "proto.h"
  24. /*+ Set to the name of the proxy if there is one. +*/
  25. static char *proxy=NULL;
  26. /*+ The file descriptor of the server. +*/
  27. static int server=-1;
  28. /*++++++++++++++++++++++++++++++++++++++
  29.   Open a connection to get a URL using SSL tunneling.
  30.   char *SSL_Open Returns NULL on success, a useful message on error.
  31.   URL *Url The URL to open (used for host only).
  32.   ++++++++++++++++++++++++++++++++++++++*/
  33. char *SSL_Open(URL *Url)
  34. {
  35.  char *msg=NULL;
  36.  char *colon;
  37.  char *server_host=NULL;
  38.  int server_port=0;
  39.  proxy=SSLProxy;
  40.  if(IsLocalNetHost(Url->host))
  41.     proxy=NULL;
  42.  if(proxy)
  43.    {
  44.     server_host=(char*)malloc(strlen(proxy)+1);
  45.     strcpy(server_host,proxy);
  46.    }
  47.  else
  48.    {
  49.     server_host=(char*)malloc(strlen(Url->host)+1);
  50.     strcpy(server_host,Url->host);
  51.    }
  52.  if((colon=strchr(server_host,':')))
  53.    {
  54.     *colon++=0;
  55.     if(*colon)
  56.        server_port=atoi(colon);
  57.    }
  58.  /* Open the connection. */
  59.  server=-1;
  60.  if(server_port)
  61.    {
  62.     server=OpenClientSocket(server_host,server_port,ConnectTimeout);
  63.     init_buffer(server);
  64.     if(server==-1)
  65.        msg=PrintMessage(Warning,"Cannot open the SSL connection to %s port %d; [%!s].",server_host,server_port);
  66.    }
  67.  else
  68.     msg=PrintMessage(Warning,"No port given for the SSL connection to %s.",server_host);
  69.  free(server_host);
  70.  return(msg);
  71. }
  72. /*++++++++++++++++++++++++++++++++++++++
  73.   Write to the server to request the URL and reply to the client.
  74.   char *SSL_Request Returns NULL on success, a useful message on error.
  75.   int client The client socket.
  76.   URL *Url The URL to get (used for host only).
  77.   Header *request_head The head of the HTTP request for the URL.
  78.   ++++++++++++++++++++++++++++++++++++++*/
  79. char *SSL_Request(int client,URL *Url,Header *request_head)
  80. {
  81.  char *msg=NULL;
  82.  if(proxy)
  83.    {
  84.     char *head;
  85.     MakeRequestAuthorised(proxy,request_head);
  86.     request_head->size-=strlen(request_head->url)-strlen(Url->host);
  87.     strcpy(request_head->url,Url->host);
  88.     head=HeaderString(request_head);
  89.     PrintMessage(ExtraDebug,"Outgoing Request Head (to proxy)n%s",head);
  90.     if(write_string(server,head)==-1)
  91.        msg=PrintMessage(Warning,"Failed to write to remote SSL proxy [%!s].");
  92.     free(head);
  93.    }
  94.  return(msg);
  95. }
  96. /*++++++++++++++++++++++++++++++++++++++
  97.   Perform the transfer between client and proxy/server.
  98.   int client The client socket.
  99.   ++++++++++++++++++++++++++++++++++++++*/
  100. void SSL_Transfer(int client)
  101. {
  102.  int nfd=client>server?client+1:server+1;
  103.  fd_set readfd;
  104.  struct timeval tv;
  105.  int nc,ns;
  106.  char buffer[READ_BUFFER_SIZE];
  107.  while(1)
  108.    {
  109.     nc=ns=0;
  110.     FD_ZERO(&readfd);
  111.     FD_SET(server,&readfd);
  112.     FD_SET(client,&readfd);
  113.     tv.tv_sec=SocketTimeout;
  114.     tv.tv_usec=0;
  115.     if(select(nfd,&readfd,NULL,NULL,&tv)<=0)
  116.        return;
  117.     if(FD_ISSET(client,&readfd))
  118.       {
  119.        nc=read_data(client,buffer,READ_BUFFER_SIZE);
  120.        if(nc>0)
  121.           write_data(server,buffer,nc);
  122.       }
  123.     if(FD_ISSET(server,&readfd))
  124.       {
  125.        ns=read_data(server,buffer,READ_BUFFER_SIZE);
  126.        if(ns>0)
  127.           write_data(client,buffer,ns);
  128.       }
  129.     if(nc==0 && ns==0)
  130.        return;
  131.    }
  132. }
  133. /*++++++++++++++++++++++++++++++++++++++
  134.   Close a connection opened using SSL.
  135.   int SSL_Close Return 0 on success, -1 on error.
  136.   ++++++++++++++++++++++++++++++++++++++*/
  137. int SSL_Close(void)
  138. {
  139.  return(CloseSocket(server));
  140. }