From 0837bd25607acd90944a4bfded58d582371ba112 Mon Sep 17 00:00:00 2001 From: Arch Librarian Date: Mon, 20 Sep 2004 16:53:53 +0000 Subject: Multiprotocol connect Author: jgg Date: 1999-05-29 03:25:03 GMT Multiprotocol connect --- methods/http.cc | 72 +++++---------------------------------------------------- 1 file changed, 6 insertions(+), 66 deletions(-) (limited to 'methods/http.cc') diff --git a/methods/http.cc b/methods/http.cc index 4e659ccd6..f014193a0 100644 --- a/methods/http.cc +++ b/methods/http.cc @@ -1,6 +1,6 @@ // -*- mode: cpp; mode: fold -*- // Description /*{{{*/ -// $Id: http.cc,v 1.33 1999/05/28 07:04:45 jgg Exp $ +// $Id: http.cc,v 1.34 1999/05/29 03:25:03 jgg Exp $ /* ###################################################################### HTTP Aquire Method - This is the HTTP aquire method for APT. @@ -41,11 +41,9 @@ #include // Internet stuff -/*#include -#include -#include -#include */ +#include +#include "connect.h" #include "rfc2553emu.h" #include "http.h" @@ -306,67 +304,9 @@ bool ServerState::Open() Host = Proxy.Host; } - /* We used a cached address record.. Yes this is against the spec but - the way we have setup our rotating dns suggests that this is more - sensible */ - if (LastHost != Host || LastPort != Port) - { - Owner->Status("Connecting to %s",Host.c_str()); - - // Lookup the host - char S[30] = "http"; - if (Port != 0) - snprintf(S,sizeof(S),"%u",Port); - - // Free the old address structure - if (LastHostAddr != 0) - { - freeaddrinfo(LastHostAddr); - LastHostAddr = 0; - } - - // We only understand SOCK_STREAM sockets. - struct addrinfo Hints; - memset(&Hints,0,sizeof(Hints)); - Hints.ai_socktype = SOCK_STREAM; - - // Resolve both the host and service simultaneously - if (getaddrinfo(Host.c_str(),S,&Hints,&LastHostAddr) != 0 || - LastHostAddr == 0) - return _error->Error("Could not resolve '%s'",Host.c_str()); - - LastHost = Host; - LastPort = Port; - } - - // Get the printable IP address - char Name[NI_MAXHOST]; - Name[0] = 0; - getnameinfo(LastHostAddr->ai_addr,LastHostAddr->ai_addrlen, - Name,sizeof(Name),0,0,NI_NUMERICHOST); - Owner->Status("Connecting to %s (%s)",Host.c_str(),Name); - - // Get a socket - if ((ServerFd = socket(LastHostAddr->ai_family,LastHostAddr->ai_socktype, - LastHostAddr->ai_protocol)) < 0) - return _error->Errno("socket","Could not create a socket"); - SetNonBlock(ServerFd,true); - if (connect(ServerFd,LastHostAddr->ai_addr,LastHostAddr->ai_addrlen) < 0 && - errno != EINPROGRESS) - return _error->Errno("connect","Cannot initiate the connection " - "to %s (%s).",Host.c_str(),Name); - - /* This implements a timeout for connect by opening the connection - nonblocking */ - if (WaitFd(ServerFd,true,TimeOut) == false) - return _error->Error("Could not connect to %s (%s), " - "connection timed out",Host.c_str(),Name); - unsigned int Err; - unsigned int Len = sizeof(Err); - if (getsockopt(ServerFd,SOL_SOCKET,SO_ERROR,&Err,&Len) != 0) - return _error->Errno("getsockopt","Failed"); - if (Err != 0) - return _error->Error("Could not connect to %s (%s).",Host.c_str(),Name); + // Connect to the remote server + if (Connect(Host,Port,"http",ServerFd,TimeOut,Owner) == false) + return false; return true; } -- cgit v1.2.3