url.createInputStream


#1

I am using the following code to get information from my server where uuid is a machine id;

void validateSerial( const String &sn, const String &sku )
{
URL url( “https://website.com” );
url = url.withParameter( “wc-api”, “validate_serial_key” );
url = url.withParameter( “serial”, sn );
url = url.withParameter( “sku”, sku );
url = url.withParameter( “uuid”, uuidStr );

ScopedPointer is = url.createInputStream( false );
}

On a few machines mac and pc, maybe one out of a a hundred, url.createInputStream is returning nullPtr;

Is there a better method of doing this or why would a few machines return nullPtr


#2

From the docs:

Returns an input stream that the caller must delete, or a null pointer if there was an error trying to open it.

Maybe try to evaluate the http status code:

int status;
if (ScopedPointeryImputStream> is = url.createInputStream( false,
    nullptr /* progressCallback */,
    nullptr /* progressCallbackContext */,
    String() /*extraHeaders  */,
    0 /* connectionTimeOutMs */,
    nullptr /* responseHeaders */,
    &status /* statusCode */) )
{
    // do your stuff
} else {
    DBG ("Http error: " + String (status));
}

That should tell you more…


#3

Thanks, but I am not on my customers machines so I can’t see the status.
Weird, that I have several machines here and there is no error on any of them.

I was hoping to avoid using a customer as a tester, but I guess there is no other alternative.
I’ll report back with the error in a while.


#4

Yes, it always pays off to present usefull error messages to the users :wink:


#5

OK it returns a status code of 0, immediately.

That is not an https status code, correct?

What now?


#6

You win :wink:
I have no idea. Digging into the sources tells me, that WebInputStream has no common implementation but is implemented in each platform differently, e.g. mac:

So I think createConnection failed (see line 615).

In line 406 you find the condition for URLConnectionState::start() to fail:

And if you follow that trail you end up deep in ObjectiveC code I don’t dare to interpret.
So maybe someone else can give you a more qualified answer…


#7

99% of the cases, when createInputStream retuns nullptr it means that there was a connection error. Probably the customers have their firewalls on or their internet connection is intermittent.


#8

Well their firewalls are turned off and the antivirus stuff is turned off.

That was the first thing I asked of them.

Is there another juce method of sending the request?

If not I’ll have to use something like cURL. Oouch!


#9

Well you can make JUCE use curl by setting JUCE_USE_CURL in the Projucer and shuffling around a few include files in the JUCE/modules/juce_core/juce_core.cpp. Here is a patch:

 diff --git a/modules/juce_core/juce_core.cpp b/modules/juce_core/juce_core.cpp
 index 370e7d7..d1ac894 100644
 --- a/modules/juce_core/juce_core.cpp
 +++ b/modules/juce_core/juce_core.cpp
 @@ -45,6 +45,10 @@
  #include <cctype>
  #include <cstdarg>
  
 +#if JUCE_USE_CURL
 +#include <curl/curl.h>
 +#endif
 +
  #if ! JUCE_ANDROID
   #include <sys/timeb.h>
   #include <cwctype>
 @@ -87,9 +91,6 @@
    #include <ifaddrs.h>
    #include <sys/resource.h>
  
 -  #if JUCE_USE_CURL
 -   #include <curl/curl.h>
 -  #endif
   #endif
  
   #include <pwd.h>
 @@ -185,6 +186,10 @@ namespace juce
  #include "zip/juce_ZipFile.cpp"
  #include "files/juce_FileFilter.cpp"
  #include "files/juce_WildcardFileFilter.cpp"
 +    
 +#if JUCE_USE_CURL
 + #include "native/juce_curl_Network.cpp"
 +#endif
  
  //==============================================================================
  #if JUCE_ANDROID
 @@ -199,7 +204,7 @@ namespace juce
  //==============================================================================
  #if JUCE_MAC || JUCE_IOS
  #include "native/juce_mac_Files.mm"
 -#include "native/juce_mac_Network.mm"
 +//#include "native/juce_mac_Network.mm"
  #include "native/juce_mac_Strings.mm"
  #include "native/juce_mac_SystemStats.mm"
  #include "native/juce_mac_Threads.mm"
 @@ -217,9 +222,6 @@ namespace juce
  #include "native/juce_linux_CommonFile.cpp"
  #include "native/juce_linux_Files.cpp"
  #include "native/juce_linux_Network.cpp"
 -#if JUCE_USE_CURL
      - #include "native/juce_curl_Network.cpp"
 -#endif
  #include "native/juce_linux_SystemStats.cpp"
 #include "native/juce_linux_Threads.cpp"

You’ll also need to link to libcurl: