diff --git a/coders/url.c b/coders/url.c
new file mode 100644
index 0000000..30919e4
--- /dev/null
+++ b/coders/url.c
@@ -0,0 +1,308 @@
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% U U RRRR L %
+% U U R R L %
+% U U RRRR L %
+% U U R R L %
+% UUU R R LLLLL %
+% %
+% %
+% Retrieve An Image Via URL. %
+% %
+% Software Design %
+% John Cristy %
+% Bill Radcliffe %
+% March 2000 %
+% %
+% %
+% Copyright 1999-2009 ImageMagick Studio LLC, a non-profit organization %
+% dedicated to making software imaging solutions freely available. %
+% %
+% You may not use this file except in compliance with the License. You may %
+% obtain a copy of the License at %
+% %
+% http://www.imagemagick.org/script/license.php %
+% %
+% Unless required by applicable law or agreed to in writing, software %
+% distributed under the License is distributed on an "AS IS" BASIS, %
+% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %
+% See the License for the specific language governing permissions and %
+% limitations under the License. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%
+*/
+
+/*
+ Include declarations.
+*/
+#include "magick/studio.h"
+#include "magick/blob.h"
+#include "magick/blob-private.h"
+#include "magick/constitute.h"
+#include "magick/exception.h"
+#include "magick/exception-private.h"
+#include "magick/image.h"
+#include "magick/image-private.h"
+#include "magick/list.h"
+#include "magick/magick.h"
+#include "magick/memory_.h"
+#include "magick/quantum-private.h"
+#include "magick/static.h"
+#include "magick/resource_.h"
+#include "magick/string_.h"
+#include "magick/module.h"
+#if defined(MAGICKCORE_XML_DELEGATE)
+# if defined(__WINDOWS__)
+# if defined(__MINGW32__)
+# define _MSC_VER
+# else
+# include <win32config.h>
+# endif
+# endif
+# include <libxml/parser.h>
+# include <libxml/xmlmemory.h>
+# include <libxml/nanoftp.h>
+# include <libxml/nanohttp.h>
+#endif
+
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% R e a d U R L I m a g e %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% ReadURLImage retrieves an image via URL, decodes the image, and returns
+% it. It allocates the memory necessary for the new Image structure and
+% returns a pointer to the new image.
+%
+% The format of the ReadURLImage method is:
+%
+% Image *ReadURLImage(const ImageInfo *image_info,ExceptionInfo *exception)
+%
+% A description of each parameter follows:
+%
+% o image_info: the image info.
+%
+% o exception: return any errors or warnings in this structure.
+%
+*/
+
+#if defined(__cplusplus) || defined(c_plusplus)
+extern "C" {
+#endif
+
+#if defined(MAGICKCORE_XML_DELEGATE) && defined(LIBXML_FTP_ENABLED)
+static void GetFTPData(void *userdata,const char *data,int size)
+{
+ FILE
+ *file;
+
+ size_t
+ length;
+
+ file=(FILE *) userdata;
+ if (file == (FILE *) NULL)
+ return;
+ if (size <= 0)
+ return;
+ length=fwrite(data,size,1,file);
+}
+#endif
+
+#if defined(__cplusplus) || defined(c_plusplus)
+}
+#endif
+
+static Image *ReadURLImage(const ImageInfo *image_info,ExceptionInfo *exception)
+{
+#define MaxBufferExtent 8192
+
+ char
+ filename[MaxTextExtent];
+
+ FILE
+ *file;
+
+ Image
+ *image;
+
+ ImageInfo
+ *read_info;
+
+ int
+ unique_file;
+
+ image=(Image *) NULL;
+ read_info=CloneImageInfo(image_info);
+ SetImageInfoBlob(read_info,(void *) NULL,0);
+ file=(FILE *) NULL;
+ unique_file=AcquireUniqueFileResource(read_info->filename);
+ if (unique_file != -1)
+ file=fdopen(unique_file,"wb");
+ if ((unique_file == -1) || (file == (FILE *) NULL))
+ {
+ read_info=DestroyImageInfo(read_info);
+ (void) CopyMagickString(image->filename,read_info->filename,
+ MaxTextExtent);
+ ThrowFileException(exception,FileOpenError,"UnableToCreateTemporaryFile",
+ image->filename);
+ image=DestroyImageList(image);
+ return((Image *) NULL);
+ }
+ (void) CopyMagickString(filename,image_info->magick,MaxTextExtent);
+ (void) ConcatenateMagickString(filename,":",MaxTextExtent);
+ LocaleLower(filename);
+ (void) ConcatenateMagickString(filename,image_info->filename,MaxTextExtent);
+ if (LocaleCompare(read_info->magick,"file") == 0)
+ {
+ (void) RelinquishUniqueFileResource(read_info->filename);
+ unique_file=(-1);
+ (void) CopyMagickString(read_info->filename,image_info->filename+2,
+ MaxTextExtent);
+ }
+#if defined(MAGICKCORE_XML_DELEGATE) && defined(LIBXML_FTP_ENABLED)
+ if (LocaleCompare(read_info->magick,"ftp") == 0)
+ {
+ void
+ *context;
+
+ xmlNanoFTPInit();
+ context=xmlNanoFTPNewCtxt(filename);
+ if (context != (void *) NULL)
+ {
+ if (xmlNanoFTPConnect(context) >= 0)
+ (void) xmlNanoFTPGet(context,GetFTPData,(void *) file,
+ (char *) NULL);
+ (void) xmlNanoFTPClose(context);
+ }
+ }
+#endif
+#if defined(MAGICKCORE_XML_DELEGATE) && defined(LIBXML_HTTP_ENABLED)
+ if (LocaleCompare(read_info->magick,"http") == 0)
+ {
+ char
+ buffer[MaxBufferExtent],
+ *type;
+
+ int
+ bytes;
+
+ void
+ *context;
+
+ type=(char *) NULL;
+ context=xmlNanoHTTPMethod(filename,(const char *) NULL,
+ (const char *) NULL,&type,(const char *) NULL,0);
+ if (context != (void *) NULL)
+ {
+ ssize_t
+ count;
+
+ while ((bytes=xmlNanoHTTPRead(context,buffer,MaxBufferExtent)) > 0)
+ count=(ssize_t) fwrite(buffer,bytes,1,file);
+ xmlNanoHTTPClose(context);
+ xmlFree(type);
+ xmlNanoHTTPCleanup();
+ }
+ }
+#endif
+ (void) fclose(file);
+ *read_info->magick='\0';
+ image=ReadImage(read_info,exception);
+ if (unique_file != -1)
+ (void) RelinquishUniqueFileResource(read_info->filename);
+ read_info=DestroyImageInfo(read_info);
+ if (image == (Image *) NULL)
+ (void) ThrowMagickException(exception,GetMagickModule(),CoderError,
+ "NoDataReturned","`%s'",filename);
+ return(GetFirstImageInList(image));
+}
+
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% R e g i s t e r U R L I m a g e %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% RegisterURLImage() adds attributes for the URL image format to
+% the list of supported formats. The attributes include the image format
+% tag, a method to read and/or write the format, whether the format
+% supports the saving of more than one frame to the same file or blob,
+% whether the format supports native in-memory I/O, and a brief
+% description of the format.
+%
+% The format of the RegisterURLImage method is:
+%
+% unsigned long RegisterURLImage(void)
+%
+*/
+ModuleExport unsigned long RegisterURLImage(void)
+{
+ MagickInfo
+ *entry;
+
+ entry=SetMagickInfo("HTTP");
+#if defined(MAGICKCORE_XML_DELEGATE) && defined(LIBXML_HTTP_ENABLED)
+ entry->decoder=(DecodeImageHandler *) ReadURLImage;
+#endif
+ entry->description=ConstantString("Uniform Resource Locator (http://)");
+ entry->module=ConstantString("URL");
+ entry->stealth=MagickTrue;
+ (void) RegisterMagickInfo(entry);
+ entry=SetMagickInfo("FTP");
+#if defined(MAGICKCORE_XML_DELEGATE) && defined(LIBXML_FTP_ENABLED)
+ entry->decoder=(DecodeImageHandler *) ReadURLImage;
+#endif
+ entry->description=ConstantString("Uniform Resource Locator (ftp://)");
+ entry->module=ConstantString("URL");
+ entry->stealth=MagickTrue;
+ (void) RegisterMagickInfo(entry);
+ entry=SetMagickInfo("FILE");
+ entry->decoder=(DecodeImageHandler *) ReadURLImage;
+ entry->description=ConstantString("Uniform Resource Locator (file://)");
+ entry->module=ConstantString("URL");
+ entry->stealth=MagickTrue;
+ (void) RegisterMagickInfo(entry);
+ return(MagickImageCoderSignature);
+}
+
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% U n r e g i s t e r U R L I m a g e %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% UnregisterURLImage() removes format registrations made by the
+% URL module from the list of supported formats.
+%
+% The format of the UnregisterURLImage method is:
+%
+% UnregisterURLImage(void)
+%
+*/
+ModuleExport void UnregisterURLImage(void)
+{
+ (void) UnregisterMagickInfo("HTTP");
+ (void) UnregisterMagickInfo("FTP");
+ (void) UnregisterMagickInfo("FILE");
+}