/*
 * And now, the actual GSXMLRPC class.
 */
@implementation	GSXMLRPC

- (NSData*) buildMethod: (NSString*)method
	         params: (NSArray*)params
{
  return [[self buildMethodCall: method params: params] dataUsingEncoding:
    NSUTF8StringEncoding];
}

- (NSString*) buildMethodCall: (NSString*)method
                       params: (NSArray*)params
{
  NSMutableString	*str = [NSMutableString stringWithCapacity: 1024];
  unsigned		c = [params count];
  unsigned		i;

  if ([method length] == 0)
    {
      return nil;
    }
  else
    {
      static NSCharacterSet	*illegal = nil;
      NSRange			r;

      if (illegal == nil)
	{
	  NSMutableCharacterSet	*tmp = [NSMutableCharacterSet new];

	  [tmp addCharactersInRange: NSMakeRange('0', 10)];
	  [tmp addCharactersInRange: NSMakeRange('a', 26)];
	  [tmp addCharactersInRange: NSMakeRange('A', 26)];
	  [tmp addCharactersInString: @"_.:/"];
	  [tmp invert];
	  illegal = [tmp copy];
	  RELEASE(tmp);
	}
      r = [method rangeOfCharacterFromSet: illegal];
      if (r.length > 0)
	{
	  return nil;	// Bad method name.
	}
    }
  [str appendString: @"<?xml version='"1.0'"?>'n"];
  [str appendString: @"<methodCall>"];
  NL;
  INDENT(1);
  [str appendFormat: @"<methodName>%@</methodName>",
    [method stringByEscapingXML]];
  NL;
  if (c > 0)
    {
      INDENT(1);
      [str appendString: @"<params>"];
      NL;
      for (i = 0; i < c; i++)
      	{
	  INDENT(2);
	  [str appendString: @"<param>"];
	  NL;
	  INDENT(3);
	  [str appendString: @"<value>"];
	  NL;
	  [[params objectAtIndex: i] appendToXMLRPC: str indent: 3 for: self];
	  NL;
	  INDENT(3);
	  [str appendString: @"</value>"];
	  NL;
	  INDENT(2);
	  [str appendString: @"</param>"];
	  NL;
	}
      INDENT(1);
      [str appendString: @"</params>"];
      NL;
    }
  [str appendString: @"</methodCall>"];
  NL;
  return str;
}

http://www.google.com/codesearch?hl=en&q=NSURLConnection+initWithRequest+show:thO0Gy4XKz8:WITO_lYqkRQ:OGAQEqv7aks&sa=N&cd=3&ct=rc&cs_p=ftp://ftp.gnustep.org/pub/daily-snapshots/core.current.tar.bz2&cs_f=core/base/Source/Additions/GSXML.m