tng         2003/02/25 13:22:36

  Modified:    c/src/xercesc/util/NetAccessors/Socket
                        UnixHTTPURLInputStream.cpp
  Log:
  Modify UnixHTTPURLInputStream for it to work on ebcdic platform.  Patch from Steve 
Dulin
  
  Revision  Changes    Path
  1.10      +131 -37   
xml-xerces/c/src/xercesc/util/NetAccessors/Socket/UnixHTTPURLInputStream.cpp
  
  Index: UnixHTTPURLInputStream.cpp
  ===================================================================
  RCS file: 
/home/cvs/xml-xerces/c/src/xercesc/util/NetAccessors/Socket/UnixHTTPURLInputStream.cpp,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- UnixHTTPURLInputStream.cpp        9 Dec 2002 13:12:12 -0000       1.9
  +++ UnixHTTPURLInputStream.cpp        25 Feb 2003 21:22:36 -0000      1.10
  @@ -56,6 +56,9 @@
   
   /*
    * $Log$
  + * Revision 1.10  2003/02/25 21:22:36  tng
  + * Modify UnixHTTPURLInputStream for it to work on ebcdic platform.  Patch from 
Steve Dulin
  + *
    * Revision 1.9  2002/12/09 13:12:12  tng
    * Fix compilation error.
    *
  @@ -137,6 +140,9 @@
   #include <xercesc/util/XMLExceptMsgs.hpp>
   #include <xercesc/util/Janitor.hpp>
   #include <xercesc/util/XMLUniDefs.hpp>
  +#include <xercesc/util/TransService.hpp>
  +#include <xercesc/util/TranscodingException.hpp>
  +#include <xercesc/util/PlatformUtils.hpp>
   
   XERCES_CPP_NAMESPACE_BEGIN
   
  @@ -145,39 +151,130 @@
         : fSocket(0)
         , fBytesProcessed(0)
   {
  +
  +    //
  +    //  Constants in ASCII to send/check in the HTTP request/response
  +    //
  +
  +    const char GET[] =
  +    {
  +        chLatin_G, chLatin_E, chLatin_T, chSpace, chNull
  +    };
  +
  +    const char HTTP[] =
  +    {
  +        chLatin_H, chLatin_T, chLatin_T, chLatin_P, chNull
  +    };
  +
  +    const char HTTP10[] =
  +    {
  +        chSpace, chLatin_H, chLatin_T, chLatin_T, chLatin_P, chForwardSlash, 
chDigit_1, chPeriod, chDigit_0, chCR, chLF, chNull
  +    };
  +
  +    const char CRLF2X[] =
  +    {
  +        chCR, chLF, chCR, chLF, chNull
  +    };
  +
  +    const char LF2X[] =
  +    {
  +        chLF, chLF, chNull
  +    };
  +
  +    const char HOST[] =
  +    {
  +        chLatin_H, chLatin_o, chLatin_s, chLatin_t, chColon, chSpace, chNull
  +    };
  +
  +    const char COLON[] =
  +    {
  +        chColon, chNull
  +    };
  +
  +    const char resp200 [] =
  +    {
  +        chSpace, chDigit_2, chDigit_0, chDigit_0, chSpace, chNull
  +    };
  +
  +    unsigned int charsEaten;
  +    unsigned int transSize;
  +    XMLTransService::Codes failReason;
  +    const unsigned int blockSize = 2048;
  +    const unsigned int bufSize = 5;
  +    static XMLCh portBuffer[bufSize+1];
  +
       //
  -    // Pull all of the parts of the URL out of th urlSource object, and transcode 
them
  -    //   and transcode them back to ASCII.
  +    // Pull all of the parts of the URL out of the urlSource object
       //
  +
       const XMLCh*        hostName = urlSource.getHost();
  +    const XMLCh*        path = urlSource.getPath();
  +    const XMLCh*        fragment = urlSource.getFragment();
  +    const XMLCh*        query = urlSource.getQuery();
  +
  +    //
  +    //  Convert the hostName to the platform's code page for gethostbyname and
  +    //  inet_addr functions.
  +    //
  +
       char*               hostNameAsCharStar = XMLString::transcode(hostName);
       ArrayJanitor<char>  janBuf1(hostNameAsCharStar);
   
  -    const XMLCh*        path = urlSource.getPath();
  -    char*               pathAsCharStar = XMLString::transcode(path);
  -    ArrayJanitor<char>  janBuf2(pathAsCharStar);
  +    //
  +    //  Convert all the parts of the urlSource object to ASCII so they can be
  +    //  sent to the remote host in that format
  +    //
   
  -    const XMLCh*        fragment = urlSource.getFragment();
  -    char*               fragmentAsCharStar = 0;
  +    transSize = XMLString::stringLen(hostName)+1;
  +    char*               hostNameAsASCII = new char[transSize+1];
  +    ArrayJanitor<char>  janBuf2(hostNameAsASCII);
  +
  +    XMLTranscoder* trans = 
XMLPlatformUtils::fgTransService->makeNewTranscoderFor("ISO8859-1", failReason, 
blockSize);
  +    trans->transcodeTo(hostName, transSize, (unsigned char *) hostNameAsASCII, 
transSize, charsEaten, XMLTranscoder::UnRep_Throw);
  +
  +    transSize = XMLString::stringLen(path)+1;
  +    char*               pathAsASCII = new char[transSize+1];
  +    ArrayJanitor<char>     janBuf3(pathAsASCII);
  +    trans->transcodeTo(path, transSize, (unsigned char *) pathAsASCII, transSize, 
charsEaten, XMLTranscoder::UnRep_Throw);
  +
  +    char*               fragmentAsASCII = 0;
       if (fragment)
  -        fragmentAsCharStar = XMLString::transcode(fragment);
  -    ArrayJanitor<char>  janBuf3(fragmentAsCharStar);
  +    {
  +        transSize = XMLString::stringLen(fragment)+1;
  +        fragmentAsASCII = new char[transSize+1];
  +        ArrayJanitor<char>  janBuf4(fragmentAsASCII);
  +        trans->transcodeTo(fragment, transSize, (unsigned char *) fragmentAsASCII, 
transSize, charsEaten, XMLTranscoder::UnRep_Throw);
  +    }
   
  -    const XMLCh*        query = urlSource.getQuery();
  -    char*               queryAsCharStar = 0;
  +    char*               queryAsASCII = 0;
  +    ArrayJanitor<char>  janBuf5(queryAsASCII);
       if (query)
  -        queryAsCharStar = XMLString::transcode(query);
  -    ArrayJanitor<char>  janBuf4(queryAsCharStar);            
  +    {
  +        transSize = XMLString::stringLen(query)+1;
  +        queryAsASCII = new char[transSize+1];
  +        trans->transcodeTo(query, transSize, (unsigned char *) queryAsASCII, 
transSize, charsEaten, XMLTranscoder::UnRep_Throw);
  +    }
   
       unsigned short      portNumber = (unsigned short) urlSource.getPortNum();
   
       //
  +    //  Convert port number integer to unicode so we can transcode it to ASCII
  +    //
  +
  +    XMLString::binToText((unsigned int) portNumber, portBuffer, bufSize, 10);
  +    transSize = XMLString::stringLen(portBuffer)+1;
  +    char*               portAsASCII = new char[transSize+1];
  +    trans->transcodeTo(portBuffer, transSize, (unsigned char *) portAsASCII, 
transSize, charsEaten, XMLTranscoder::UnRep_Throw);
  +
  +    delete trans;
  +
  +    //
       // Set up a socket.
       //
       struct hostent*     hostEntPtr = 0;
       struct sockaddr_in  sa;
   
  -
  +    // Use the hostName in the local code page ....
       if ((hostEntPtr = gethostbyname(hostNameAsCharStar)) == NULL)
       {
           unsigned long  numAddress = inet_addr(hostNameAsCharStar);
  @@ -195,6 +292,7 @@
           }
       }
   
  +    memset(&sa, '\0', sizeof(sockaddr_in));  // iSeries fix ??
       memcpy((void *) &sa.sin_addr,
              (const void *) hostEntPtr->h_addr, hostEntPtr->h_length);
       sa.sin_family = hostEntPtr->h_addrtype;
  @@ -217,37 +315,36 @@
       // Build up the http GET command to send to the server.
       // To do:  We should really support http 1.1.  This implementation
       //         is weak.
  -    strcpy(fBuffer, "GET ");
  -    strcat(fBuffer, pathAsCharStar);
  +    strcpy(fBuffer, GET);
  +    strcat(fBuffer, pathAsASCII);
   
  -    if (queryAsCharStar != 0)
  +    if (queryAsASCII != 0)
       {                
           size_t n = strlen(fBuffer);
           fBuffer[n] = chQuestion;
           fBuffer[n+1] = chNull;
  -        strcat(fBuffer, queryAsCharStar);
  +        strcat(fBuffer, queryAsASCII);
       }
   
  -    if (fragmentAsCharStar != 0)
  +    if (fragmentAsASCII != 0)
       {
  -        strcat(fBuffer, fragmentAsCharStar);
  +        strcat(fBuffer, fragmentAsASCII);
       }
  -    strcat(fBuffer, " HTTP/1.0\r\n");
  -
  +    strcat(fBuffer, HTTP10);
   
  -    strcat(fBuffer, "Host: ");
  -    strcat(fBuffer, hostNameAsCharStar);
  +    strcat(fBuffer, HOST);
  +    strcat(fBuffer, hostNameAsASCII);
       if (portNumber != 80)
       {
  -        int i = strlen(fBuffer);
  -             sprintf(fBuffer+i, ":%d", portNumber);
  -        // _itoa(portNumber, fBuffer+i, 10);
  +        strcat(fBuffer,COLON);
  +        strcat(fBuffer,portAsASCII);
       }
  -    strcat(fBuffer, "\r\n\r\n");
  +    strcat(fBuffer, CRLF2X);
   
       // Send the http request
       int lent = strlen(fBuffer);
       int  aLent = 0;
  +
       if ((aLent = write(s, (void *) fBuffer, lent)) != lent)
       {
           ThrowXML1(NetAccessorException,
  @@ -270,7 +367,7 @@
       //  (Delimited by a blank line)
       // Hang on to any data for use by the first read from this 
BinHTTPURLInputStream.
       //
  -    fBufferPos = strstr(fBuffer, "\r\n\r\n");
  +    fBufferPos = strstr(fBuffer, CRLF2X);
       if (fBufferPos != 0)
       {
           fBufferPos += 4;
  @@ -278,7 +375,7 @@
       }
       else
       {
  -        fBufferPos = strstr(fBuffer, "\n\n");
  +        fBufferPos = strstr(fBuffer, LF2X);
           if (fBufferPos != 0)
           {
               fBufferPos += 2;
  @@ -290,20 +387,19 @@
   
       // Make sure the header includes an HTTP 200 OK response.
       //
  -    char *p = strstr(fBuffer, "HTTP");
  +    char *p = strstr(fBuffer, HTTP);
       if (p == 0)
       {
           ThrowXML1(NetAccessorException, XMLExcepts::NetAcc_ReadSocket, 
urlSource.getURLText());
       }
   
  -    p = strchr(p, ' ');
  +    p = strchr(p, chSpace);
       if (p == 0)
       {
           ThrowXML1(NetAccessorException, XMLExcepts::NetAcc_ReadSocket, 
urlSource.getURLText());
       }
  -
  -    int httpResponse = atoi(p);
  -    if (httpResponse != 200)
  +  
  +    if (memcmp(p, resp200, strlen(resp200)))
       {
           // Most likely a 404 Not Found error.
           //   Should recognize and handle the forwarding responses.
  @@ -311,11 +407,9 @@
           ThrowXML1(NetAccessorException, XMLExcepts::File_CouldNotOpenFile, 
urlSource.getURLText());
       }
   
  -
       fSocket = s;
   
   }
  -
   
   
   UnixHTTPURLInputStream::~UnixHTTPURLInputStream()
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to