Example #1
0
/**
 * xmlNanoHTTPSave:
 * @ctxt:  the HTTP context
 * @filename:  the filename where the content should be saved
 *
 * This function saves the output of the HTTP transaction to a file
 * It closes and free the context at the end
 *
 * Returns -1 in case of failure, 0 incase of success.
 */
int
xmlNanoHTTPSave(void *ctxt, const char *filename) {
    char *buf = NULL;
    int fd;
    int len;
    int ret = 0;

    if ((ctxt == NULL) || (filename == NULL)) return(-1);

    if (!strcmp(filename, "-")) 
        fd = 0;
    else {
        fd = open(filename, O_CREAT | O_WRONLY, 0666);
	if (fd < 0) {
	    xmlNanoHTTPClose(ctxt);
	    return(-1);
	}
    }

    xmlNanoHTTPFetchContent( ctxt, &buf, &len );
    if ( len > 0 ) {
	if (write(fd, buf, len) == -1) {
	    ret = -1;
	}
    }

    xmlNanoHTTPClose(ctxt);
    close(fd);
    return(ret);
}
Example #2
0
/**
 * xmlNanoHTTPFetch:
 * @URL:  The URL to load
 * @filename:  the filename where the content should be saved
 * @contentType:  if available the Content-Type information will be
 *                returned at that location
 *
 * This function try to fetch the indicated resource via HTTP GET
 * and save it's content in the file.
 *
 * Returns -1 in case of failure, 0 incase of success. The contentType,
 *     if provided must be freed by the caller
 */
int
xmlNanoHTTPFetch(const char *URL, const char *filename, char **contentType) {
    void *ctxt = NULL;
    char *buf = NULL;
    int fd;
    int len;

    if (filename == NULL) return(-1);
    ctxt = xmlNanoHTTPOpen(URL, contentType);
    if (ctxt == NULL) return(-1);

    if (!strcmp(filename, "-"))
        fd = 0;
    else {
        fd = open(filename, O_CREAT | O_WRONLY, 00644);
	if (fd < 0) {
	    xmlNanoHTTPClose(ctxt);
	    if ((contentType != NULL) && (*contentType != NULL)) {
	        xmlFree(*contentType);
		*contentType = NULL;
	    }
	    return(-1);
	}
    }

    xmlNanoHTTPFetchContent( ctxt, &buf, &len );
    if ( len > 0 ) {
	    if (write(fd, buf, len)) {}
    }

    xmlNanoHTTPClose(ctxt);
    close(fd);
    return(0);
}
Example #3
0
int
raptor_www_libxml_fetch(raptor_www *www) 
{
  if(www->proxy)
    xmlNanoHTTPScanProxy(www->proxy);

  www->ctxt=xmlNanoHTTPOpen((const char*)raptor_uri_as_string(www->uri), &www->type);
  if(!www->ctxt)
    return 1;
  
  if(www->type) {
    if(www->content_type) {
      www->content_type(www, www->content_type_userdata, www->type);
      if(www->failed) {
        xmlNanoHTTPClose(www->ctxt);
        return 1;
      }
    }
  }

  www->status_code=xmlNanoHTTPReturnCode(www->ctxt);
  
  while(1) {
    int len=xmlNanoHTTPRead(www->ctxt, www->buffer, RAPTOR_WWW_BUFFER_SIZE);
    if(len<0)
      break;
    
    www->total_bytes += len;

    if(www->write_bytes)
      www->write_bytes(www, www->write_bytes_userdata, www->buffer, len, 1);
    
    if(len < RAPTOR_WWW_BUFFER_SIZE || www->failed)
      break;
  }
  
  xmlNanoHTTPClose(www->ctxt);

  return www->failed;
}
Example #4
0
/**
 * Cleans up the nano HTTP state
 *
 * @param pContext HTTP Context
 * @param pContentType Content-type container
 */
static void
cleanup(void * pContext, char * pContentType)
{
    if (pContext)
    {
        xmlNanoHTTPClose(pContext);
    }

    if (pContentType)
    {
        xmlFree(pContentType);
    }

    xmlNanoHTTPCleanup();
}
void GetXMLHttp() {
	void * Ctxt;
	char *contentType;
	
	xmlNanoHTTPInit();
	
	Ctxt = xmlNanoHTTPOpen(XML_URL, &contentType);

	if (Ctxt == 0)
		printf("ERROR: xmlNanoHTTPOpen() == 0\n");

	if (xmlNanoHTTPReturnCode(Ctxt) != 200)
		printf("ERROR: HTTP Code != OK\n");

	// open output file
	FILE *fp;
	fp=fopen("test_get.xml","w");
	

	// Write to file
	const int Size = 2048;
	char Buffer[Size];
	int Count;

	while ((Count = xmlNanoHTTPRead(Ctxt, Buffer, Size)) > 0)
		fprintf(fp,"%s",Buffer);	
		//File.write(Buffer, Count);
		
	fclose(fp);

	if (Count == 0)
		printf("STATUS: Connection closed\n");

	if (Count == -1)
		printf("ERROR: xmlNanoHTTPRead() == -1\n");
	
		
	// Free ressources
	xmlFree(contentType);
	xmlNanoHTTPClose(Ctxt);
	xmlNanoHTTPCleanup();
}
Example #6
0
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));
}
int
raptor_www_libxml_fetch(raptor_www *www)
{
    char* headers=NULL;

    if(www->proxy)
        xmlNanoHTTPScanProxy(www->proxy);

    if(www->http_accept || www->user_agent) {
        size_t accept_len=0;
        size_t ua_len=0;
        size_t cc_len=0;
        size_t len=0;
        char *p;

        if(www->http_accept) {
            accept_len=strlen(www->http_accept);
            len+=accept_len+2; /* \r\n */
        }

        if(www->user_agent) {
            ua_len=strlen(www->user_agent);
            len+=12+ua_len+2; /* strlen("User-Agent: ") + \r\n */
        }

        if(www->cache_control) {
            cc_len=strlen(www->cache_control);
            len+=cc_len+2; /* \r\n */
        }

        headers=(char*)RAPTOR_MALLOC(cstring, len+1);
        if(!headers)
            return 1;

        p=headers;
        if(www->http_accept) {
            strncpy(p, www->http_accept, accept_len);
            p+= accept_len;
            *p++='\r';
            *p++='\n';
        }
        if(www->user_agent) {
            strncpy(p, "User-Agent: ", 12);
            p+=12;
            strncpy(p, www->user_agent, ua_len);
            p+= ua_len;
            *p++='\r';
            *p++='\n';
        }
        if(www->cache_control) {
            strncpy(p, www->cache_control, cc_len);
            p+= cc_len;
            *p++='\r';
            *p++='\n';
        }
        *p='\0';
    }

    www->ctxt=xmlNanoHTTPMethod((const char*)raptor_uri_as_string_v2(www->world, www->uri),
                                NULL, /* HTTP method (default GET) */
                                NULL, /* input string */
                                &www->type,
                                headers,
                                0); /* input length - ilen */

    if(headers)
        RAPTOR_FREE(cstring, headers);

    if(!www->ctxt)
        return 1;

    if(www->type) {
        if(www->content_type) {
            www->content_type(www, www->content_type_userdata, www->type);
            if(www->failed) {
                xmlNanoHTTPClose(www->ctxt);
                return 1;
            }
        }
        xmlFree(www->type);
        www->type=NULL;
    }

    www->status_code=xmlNanoHTTPReturnCode(www->ctxt);

    while(1) {
        int len=xmlNanoHTTPRead(www->ctxt, www->buffer, RAPTOR_WWW_BUFFER_SIZE);
        if(len<0)
            break;

        www->total_bytes += len;

        if(www->write_bytes)
            www->write_bytes(www, www->write_bytes_userdata, www->buffer, len, 1);

        if(len < RAPTOR_WWW_BUFFER_SIZE || www->failed)
            break;
    }

    xmlNanoHTTPClose(www->ctxt);

    return www->failed;
}
Example #8
0
static void* cacheopen(char const* url) {
    const char* basename = strrchr(url,'/');
    assert(basename);

    static char dest[508];
    snprintf(dest,508,"%s/%s",cacheDir,basename);

    bool didtemp = false;

    int doopen(void) {
        int result = open(dest,O_RDONLY);
        if(result<0) {
            char temp[512];
            snprintf(temp,512,"%s.temp",dest);

            if(xmlIOHTTPMatch(url)) {
                void* ctx = NULL;
#if W3_ARE_NOT_MORONS
                ctx = xmlNanoHTTPOpen(url, NULL);
                if(xmlNanoHTTPReturnCode(ctx) != 200)
#else
                if(true)
#endif
                {
                    // XXX: it always is... w3.org dies on HTTP/1.0
#if W3_ARE_NOT_MORONS
                    xmlNanoHTTPClose(ctx);
#endif
                    fprintf(stderr,"Curl fallback for %s\n",url);
                    int pid = fork();
                    if(pid == 0) {
                        execlp("curl","curl","-o",temp,url,NULL);
                        abort();
                    }
                    int status = 0;
                    waitpid(pid,&status,0);
                    if(!(WIFEXITED(status) && (0 == WEXITSTATUS(status)))) {
                        fprintf(stderr,"CUrl failed! %x %d\n",status,WEXITSTATUS(status));
                        abort();
                    }
                } else {
                    assert(0==xmlNanoHTTPSave(ctx,temp));
                }
            } else if(xmlIOFTPMatch(url)) {
                void* ftp = xmlNanoFTPOpen(url);
                int out = open(temp,O_WRONLY|O_TRUNC|O_CREAT,0644);
                assert(out>0);
                char buf[0x1000];
                for(;;) {
                    int amt = xmlNanoFTPRead(ftp, buf, 0x1000);
                    if(amt==0) break;
                    assert(amt>0);
                    write(out,buf,amt);
                }
                close(out);            
            } else {
                FILE* fp = xmlFileOpen(url);
                struct stat fpstat;
                if(!fp) {
                    fprintf(stderr,"No idea what to do with url %s\n",url);
                    abort();
                }
                int inp = fileno(fp);
                assert(0==fstat(inp,&fpstat));
                off_t left = fpstat.st_size;
                int out = open(temp,O_WRONLY|O_TRUNC|O_CREAT,0644);
                assert(out>0);
                do {
                    ssize_t amt = sendfile(out,inp,NULL,left);
                    if(amt<0) {
                        perror(url);
                    }
                    assert(amt>=0);
                    left -= amt;
                } while(left > 0);
                fclose(fp);
                close(out);
            }
            rename(temp,dest); // doesn't matter if fails
            unlink(temp); // in case it failed
            return doopen();
        }
        return result;
    }
Example #9
0
void CheckVersionNumber()
{
	//==== Init Nano HTTP ====//
	xmlNanoHTTPInit();
	xmlNanoHTTPScanProxy(NULL);

	//==== Compute Version Number ====//
	int ver_no = 10000*VSP_VERSION_MAJOR + 100*VSP_VERSION_MINOR + VSP_VERSION_CHANGE;

	char cCurrentPath[FILENAME_MAX];
	GetCurrentDir(cCurrentPath, sizeof(cCurrentPath));

	int user_id = 0;
	int path_len = strlen(cCurrentPath);

	for ( int i = 0 ; i < path_len ; i++ )
	{
		srand ( (unsigned int)cCurrentPath[i] );
		user_id += rand() % 100000 + 1;
	}

	//==== Post User Info To Server ====//
	char poststr[256];
	sprintf( poststr, "postvar1=%d&postvar2=%d\r\n", user_id, ver_no);
	int poststrlen = strlen(poststr);
	char*  headers = "Content-Type: application/x-www-form-urlencoded \n";

	void * ctx = 0;
	ctx = xmlNanoHTTPMethod("http://www.openvsp.org/vspuse_post.php", "POST", poststr, NULL, headers, poststrlen );

	if ( ctx )
		xmlNanoHTTPClose(ctx);

	ctx = 0;

	//==== Open Settings File ====//
	bool check_version_flag = true;
	FILE* vsptime_fp = fopen( ".vsptime", "r" );
	if ( vsptime_fp )
	{
		char str[256];
		fgets( str, 256, vsptime_fp );
		int vsp_time = atoi( str );
		int del_time =  (int)time(NULL) - vsp_time;
		if ( del_time < 60*60*24*7 )				// Check Every Week
			check_version_flag = false;

		fclose( vsptime_fp );
	}

	//==== Enough Time Has Passed - Check For New Version ====//
	if ( check_version_flag )
	{
		//==== Webpage with Version Info ====//
		char * pContentType = 0;
		ctx = xmlNanoHTTPOpen("http://www.openvsp.org/latest_version.html", &pContentType);

		int retCode = xmlNanoHTTPReturnCode(ctx);

		//==== Http Return Code 200 -> OK  ====//
		string contentStr;
		if ( retCode == 200 )
		{
			char buf[2048];
			int len = 1;
			while (len > 0 && contentStr.size() < 10000 )
			{
				len = xmlNanoHTTPRead(ctx, buf, sizeof(buf));
				contentStr.append( buf, len );
			}
		}

		//==== Pulled A String From Server =====//
		if ( contentStr.size() > 0 )
		{
			int major_ver, minor_ver, change_ver;
			bool valid = ExtractVersionNumber( contentStr, &major_ver, &minor_ver, &change_ver );

			if ( valid )
			{
				if ( major_ver != VSP_VERSION_MAJOR ||minor_ver != VSP_VERSION_MINOR || change_ver != VSP_VERSION_CHANGE )
				{
					if ( screenMgrPtr )
						screenMgrPtr->MessageBox("A new version of OpenVSP is available at http://www.openvsp.org/");
				}
			}
		}
		//===== Write Time =====//
		FILE* vsptime_fp = fopen( ".vsptime", "w" );
		if ( vsptime_fp )
		{
			fprintf( vsptime_fp, "%d", time(NULL) );
			fclose( vsptime_fp );
		}
	}

	if ( ctx )
		xmlNanoHTTPClose(ctx);

	xmlNanoHTTPCleanup();
}