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
daniel
July 18, 2016, 7:42pm
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…
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.
daniel
July 18, 2016, 8:16pm
4
Yes, it always pays off to present usefull error messages to the users
OK it returns a status code of 0, immediately.
That is not an https status code, correct?
What now?
daniel
July 19, 2016, 7:05am
6
You win
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:
/*
==============================================================================
This file is part of the JUCE library.
Copyright (c) 2017 - ROLI Ltd.
JUCE is an open source library subject to commercial or open-source
licensing.
The code included in this file is provided under the terms of the ISC license
http://www.isc.org/downloads/software-support-policy/isc-license. Permission
To use, copy, modify, and/or distribute this software for any purpose with or
without fee is hereby granted provided that the above copyright notice and
this permission notice appear in all copies.
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
DISCLAIMED.
==============================================================================
This file has been truncated. show original
So I think createConnection failed (see line 615).
In line 406 you find the condition for URLConnectionState::start() to fail:
/*
==============================================================================
This file is part of the JUCE library.
Copyright (c) 2017 - ROLI Ltd.
JUCE is an open source library subject to commercial or open-source
licensing.
The code included in this file is provided under the terms of the ISC license
http://www.isc.org/downloads/software-support-policy/isc-license. Permission
To use, copy, modify, and/or distribute this software for any purpose with or
without fee is hereby granted provided that the above copyright notice and
this permission notice appear in all copies.
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
DISCLAIMED.
==============================================================================
This file has been truncated. show original
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…
fr810
July 19, 2016, 10:18am
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.
1 Like
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!
fr810
July 19, 2016, 2:53pm
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: