Implements the <http:> IOR format. More...
#include <HTTP_Parser.h>
Public Member Functions | |
virtual | ~TAO_HTTP_Parser (void) |
The destructor. | |
virtual bool | match_prefix (const char *ior_string) const |
virtual CORBA::Object_ptr | parse_string (const char *ior, CORBA::ORB_ptr orb) |
Implements the <http:> IOR format.
This class implements the <http:> IOR format. It is dynamically loaded by the ORB and used to get an IOR from a http server and then interprete the data as an IOR (that can be in any valid format).
Definition at line 41 of file HTTP_Parser.h.
TAO_HTTP_Parser::~TAO_HTTP_Parser | ( | void | ) | [virtual] |
bool TAO_HTTP_Parser::match_prefix | ( | const char * | ior_string | ) | const [virtual] |
Return true if ior_string starts with a prefix known to this IOR parser
Implements TAO_IOR_Parser.
Definition at line 33 of file HTTP_Parser.cpp.
{ ACE_TString ior_string = ACE_TEXT_CHAR_TO_TCHAR (nior_string); return (ACE_OS::strncmp (ior_string.c_str (), ::file_prefix, sizeof (::file_prefix) - 1) == 0); }
CORBA::Object_ptr TAO_HTTP_Parser::parse_string | ( | const char * | ior, | |
CORBA::ORB_ptr | orb | |||
) | [virtual] |
Parse the ior argument and return an object reference. The call may raise the standard system exceptions (NO_MEMORY, INV_OBJREF, etc.)
Implements TAO_IOR_Parser.
Definition at line 42 of file HTTP_Parser.cpp.
{ // Skip the prefix, we know it is there because this method in only // called if <match_prefix> returns 1. ACE_TString ior = ACE_TEXT_CHAR_TO_TCHAR (nior); const ACE_TCHAR *http_url = ior.c_str () + sizeof (::file_prefix) + 1; ACE_TCHAR *hostname = 0; ACE_TCHAR *filename = 0; const ACE_TCHAR *ptr = 0; u_short port = 80; if (http_url[0] == '/') { filename = ACE_OS::strdup (http_url); } else { ptr = ACE_OS::strstr (http_url, ACE_TEXT (":")); if (ptr) port = ACE_OS::atoi (ptr + 1); else ptr = ACE_OS::strstr (http_url, ACE_TEXT ("/")); if(!ptr) return 0; else { size_t const host_len = ptr - http_url; ACE_NEW_RETURN (hostname, ACE_TCHAR [host_len + 1], 0 ); ACE_OS::strncpy (hostname, http_url, host_len); hostname [host_len] = '\0'; ptr = ACE_OS::strstr (ptr, ACE_TEXT ("/")); if (ptr) { filename = ACE_OS::strdup(ptr); } else return 0; } } ACE_Message_Block* mb = 0; ACE_NEW_THROW_EX (mb, ACE_Message_Block (), CORBA::INTERNAL ()); // Create a client TAO_HTTP_Client client; if (TAO_debug_level > 4) { ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("TAO (%P|%t) - HTTP_Parser::parse_string, getting IOR from <%s> <%s> <%d>\n"), hostname, filename, port)); } // Open the client if (client.open (filename, hostname, port) == -1) { client.close (); return 0; } delete [] hostname; ACE_OS::free (filename); // Read from it if (client.read (mb) <= 0) { client.close (); return 0; } // We get multiple message blocks back, concatenate them to // one large string ACE_CString string; for (ACE_Message_Block * curr = mb; curr != 0; curr = curr->cont ()) string += curr->rd_ptr(); return orb->string_to_object (string.c_str()); }