36 if (localFile ==
File())
43 while (! localFile.
isRoot())
54 url =
url.fromFirstOccurrenceOf (
"/",
false,
false);
59 if (!
url.startsWithChar (L
'/'))
70 auto i =
url.indexOfChar (
'?');
76 auto nextAmp =
url.indexOfChar (
i + 1,
'&');
77 auto equalsPos =
url.indexOfChar (
i + 1,
'=');
84 else if (nextAmp > 0 && equalsPos < nextAmp)
94 url =
url.upToFirstOccurrenceOf (
"?",
false,
false);
105bool URL::operator== (
const URL& other)
const
114bool URL::operator!= (
const URL& other)
const
116 return ! operator== (other);
135 if (
val.isNotEmpty())
147 || url[
i] ==
'+' || url[
i] ==
'-' || url[
i] ==
'.')
157 while (url[
start] ==
'/')
184 if (lastSlash > startOfPath && lastSlash == url.
length() - 1)
190 return url.
substring (0, std::max (startOfPath, lastSlash));
202 if (includeGetParameters)
210 return url.isEmpty();
216 return url.isNotEmpty();
227 auto subPath = startOfPath <= 0 ?
String()
228 :
url.substring (startOfPath);
230 if (includeGetParameters)
262 return toString (
false).fromLastOccurrenceOf (
"/",
false,
true);
289 for (
auto urlElement : urlElements)
294 path =
"\\\\" + path;
304 return colonPos > 0 ?
url.substring (colonPos + 1).getIntValue() : 0;
321 u.url =
url.substring (0, startOfPath);
348 bool addParametersToBody)
const
359 headers <<
"Content-Type: multipart/form-data; boundary=" << boundary <<
"\r\n";
361 data <<
"--" << boundary;
367 <<
"\r\n--" << boundary;
372 data <<
"\r\nContent-Disposition: form-data; name=\"" <<
f->parameterName
373 <<
"\"; filename=\"" <<
f->filename <<
"\"\r\n";
375 if (
f->mimeType.isNotEmpty())
376 data <<
"Content-Type: " <<
f->mimeType <<
"\r\n";
378 data <<
"Content-Transfer-Encoding: binary\r\n\r\n";
380 if (
f->data !=
nullptr)
385 data <<
"\r\n--" << boundary;
392 if (addParametersToBody)
399 headers <<
"Content-Type: application/x-www-form-urlencoded\r\n";
401 headers <<
"Content-length: " << (
int)
data.getDataSize() <<
"\r\n";
408 for (
auto* protocol : {
"http:",
"https:",
"ftp:" })
418 return topLevelDomain.
isNotEmpty() && topLevelDomain.length() <= 3;
423 auto atSign = possibleEmailAddress.
indexOfChar (
'@');
433 auto end1 =
url.indexOfChar (
start,
'/');
434 auto end2 = ignorePort ? -1 :
url.indexOfChar (
start,
':');
436 auto end = (end1 < 0 && end2 < 0) ? std::numeric_limits<int>::max()
437 : ((end1 < 0 || end2 < 0) ?
jmax (end1, end2)
438 :
jmin (end1, end2));
443URL::Bookmark::Bookmark (
void* bookmarkToUse) :
data (bookmarkToUse)
447URL::Bookmark::~Bookmark()
449 [(NSData*)
data release];
452void setURLBookmark (URL&
u,
void* bookmark)
454 u.bookmark =
new URL::Bookmark (bookmark);
457void* getURLBookmark (URL&
u)
459 if (
u.bookmark.get() ==
nullptr)
462 return u.bookmark.get()->data;
465template <
typename Stream>
struct iOSFileStreamWrapperFlush {
static void flush (Stream*) {} };
466template <>
struct iOSFileStreamWrapperFlush<FileOutputStream> {
static void flush (OutputStream* o) { o->flush(); } };
468template <
typename Stream>
469class iOSFileStreamWrapper :
public Stream
472 iOSFileStreamWrapper (URL& urlToUse)
473 : Stream (getLocalFileAccess (urlToUse)),
477 ~iOSFileStreamWrapper()
479 iOSFileStreamWrapperFlush<Stream>::flush (
this);
481 if (NSData* bookmark = (NSData*) getURLBookmark (url))
483 BOOL isBookmarkStale =
false;
484 NSError*
error = nil;
486 auto nsURL = [NSURL URLByResolvingBookmarkData: bookmark
489 bookmarkDataIsStale: &isBookmarkStale
495 updateStaleBookmark (nsURL, url);
497 [nsURL stopAccessingSecurityScopedResource];
501 auto desc = [
error localizedDescription];
510 bool securityAccessSucceeded =
false;
512 File getLocalFileAccess (URL& urlToUse)
514 if (NSData* bookmark = (NSData*) getURLBookmark (urlToUse))
516 BOOL isBookmarkStale =
false;
517 NSError*
error = nil;
519 auto nsURL = [NSURL URLByResolvingBookmarkData: bookmark
522 bookmarkDataIsStale: &isBookmarkStale
527 securityAccessSucceeded = [nsURL startAccessingSecurityScopedResource];
530 updateStaleBookmark (nsURL, urlToUse);
532 return urlToUse.getLocalFile();
535 auto desc = [
error localizedDescription];
540 return urlToUse.getLocalFile();
543 void updateStaleBookmark (NSURL* nsURL, URL& juceUrl)
545 NSError*
error = nil;
547 NSData* bookmark = [nsURL bookmarkDataWithOptions: NSURLBookmarkCreationSuitableForBookmarkFile
548 includingResourceValuesForKeys: nil
553 setURLBookmark (juceUrl, (
void*) bookmark);
560template <
typename Member,
typename Item>
563 options.*member = std::forward<Item> (item);
611 return std::make_unique<iOSFileStreamWrapper<FileInputStream>> (
const_cast<URL&
> (*this));
626 return std::make_unique<iOSFileStreamWrapper<FileOutputStream>> (
const_cast<URL&
> (*this));
628 return std::make_unique<FileOutputStream> (
getLocalFile());
643 in->readIntoMemoryBlock (destData);
656 return in->readEntireStreamAsString();
668 const String& parameterValue)
const
671 u.addParameter (parameterName, parameterValue);
679 for (
int i = 0;
i < parametersToAdd.
size(); ++
i)
694 u.postData = newPostData;
709 for (
int i =
u.filesToUpload.size(); --
i >= 0;)
710 if (
u.filesToUpload.getObjectPointerUnchecked (
i)->parameterName ==
f->parameterName)
711 u.filesToUpload.remove (
i);
713 u.filesToUpload.add (
f);
718 const String& mimeType)
const
721 mimeType, fileToUpload,
nullptr));
734 auto result =
s.replaceCharacter (
'+',
' ');
736 if (!
result.containsChar (
'%'))
743 for (
int i = 0;
i < utf8.
size(); ++
i)
750 if (hexDigit1 >= 0 && hexDigit2 >= 0)
752 utf8.
set (
i, (
char) ((hexDigit1 << 4) + hexDigit2));
763 String legalChars (isParameter ?
"_-.~"
766 if (roundBracketsAreLegal)
769 Array<char> utf8 (
s.toRawUTF8(), (
int)
s.getNumBytesAsUTF8());
771 for (
int i = 0;
i < utf8.
size(); ++
i)
780 utf8.
insert (++
i,
"0123456789ABCDEF" [
c & 15]);
792 if (
u.containsChar (
'@') && !
u.containsChar (
':'))
806 int numRedirectsToFollow,
807 String httpRequestCmd)
const
809 std::function<bool (
int,
int)>
callback;
812 callback = [context, cb] (
int sent,
int total) {
return cb (context, sent, total); };
815 .withProgressCallback (std::move (
callback))
816 .withExtraHeaders (headers)
817 .withConnectionTimeoutMs (timeOutMs)
818 .withResponseHeaders (responseHeaders)
819 .withStatusCode (statusCode)
820 .withNumRedirectsToFollow(numRedirectsToFollow)
821 .withHttpRequestCmd (httpRequestCmd));
Type jmin(const Type a, const Type b)
Definition MathsFunctions.h:60
Type jmax(const Type a, const Type b)
Definition MathsFunctions.h:48
#define noexcept
Definition DistrhoDefines.h:72
static StringArray fromTokens(StringRef stringToTokenise, bool preserveQuotedStrings)
Definition StringArray.cpp:369
static String toHexString(int number)
Definition String.cpp:1830
static String fromUTF8(const char *utf8buffer, int bufferSizeBytes=-1)
Definition String.cpp:1961
Definition juce_Array.h:56
ElementType getUnchecked(int index) const
Definition juce_Array.h:252
int size() const noexcept
Definition juce_Array.h:215
void removeRange(int startIndex, int numberToRemove)
Definition juce_Array.h:919
void insert(int indexToInsertAt, ParameterType newElement)
Definition juce_Array.h:462
ElementType * getRawDataPointer() noexcept
Definition juce_Array.h:310
void set(int indexToChange, ParameterType newValue)
Definition juce_Array.h:542
static int getHexDigitValue(juce_wchar digit) noexcept
Definition juce_CharacterFunctions.cpp:112
static bool isLetterOrDigit(char character) noexcept
Definition juce_CharacterFunctions.cpp:90
Definition juce_File.h:45
static StringRef getSeparatorString()
Definition juce_posix_SharedCode.h:114
const String & getFullPathName() const noexcept
Definition juce_File.h:153
String getFileName() const
Definition juce_File.cpp:364
bool isRoot() const
Definition juce_File.cpp:125
File getParentDirectory() const
Definition juce_File.cpp:358
Definition juce_MemoryBlock.h:33
Definition juce_MemoryOutputStream.h:36
static bool JUCE_CALLTYPE openDocument(const String &documentURL, const String ¶meters)
Definition juce_linux_Files.cpp:200
static Random & getSystemRandom() noexcept
Definition juce_Random.cpp:67
int size() const noexcept
Definition juce_StringArray.h:136
Definition juce_String.h:53
int indexOfChar(juce_wchar characterToLookFor) const noexcept
Definition juce_String.cpp:874
String upToFirstOccurrenceOf(StringRef substringToEndWith, bool includeSubStringInResult, bool ignoreCase) const
Definition juce_String.cpp:1585
int length() const noexcept
Definition juce_String.cpp:511
bool endsWithChar(juce_wchar character) const noexcept
Definition juce_String.cpp:1410
const char * toRawUTF8() const
Definition juce_String.cpp:2074
bool containsIgnoreCase(StringRef text) const noexcept
Definition juce_String.cpp:1045
bool startsWithChar(juce_wchar character) const noexcept
Definition juce_String.cpp:1403
bool startsWith(StringRef text) const noexcept
Definition juce_String.cpp:1393
bool containsChar(juce_wchar character) const noexcept
Definition juce_String.cpp:1040
bool startsWithIgnoreCase(StringRef text) const noexcept
Definition juce_String.cpp:1398
size_t getNumBytesAsUTF8() const noexcept
Definition juce_String.cpp:2120
String dropLastCharacters(int numberToDrop) const
Definition juce_String.cpp:1555
int lastIndexOfChar(juce_wchar character) const noexcept
Definition juce_String.cpp:899
String substring(int startIndex, int endIndex) const
Definition juce_String.cpp:1498
String fromLastOccurrenceOf(StringRef substringToFind, bool includeSubStringInResult, bool ignoreCase) const
Definition juce_String.cpp:1575
bool isNotEmpty() const noexcept
Definition juce_String.h:316
Definition juce_StringPairArray.h:35
const StringArray & getAllValues() const noexcept
Definition juce_StringPairArray.h:90
int size() const noexcept
Definition juce_StringPairArray.h:93
const StringArray & getAllKeys() const noexcept
Definition juce_StringPairArray.h:87
DownloadTaskListener Listener
Definition juce_URL.h:493
JUCE_NODISCARD URL withParameter(const String ¶meterName, const String ¶meterValue) const
Definition juce_URL.cpp:667
static URL createWithoutParsing(const String &url)
Definition juce_URL.cpp:100
File getLocalFile() const
Definition juce_URL.cpp:255
bool isWellFormed() const
Definition juce_URL.cpp:213
bool readEntireBinaryStream(MemoryBlock &destData, bool usePostCommand=false) const
Definition juce_URL.cpp:636
int getPort() const
Definition juce_URL.cpp:300
URL withUpload(Upload *) const
Definition juce_URL.cpp:705
JUCE_NODISCARD URL withDataToUpload(const String ¶meterName, const String &filename, const MemoryBlock &fileContentToUpload, const String &mimeType) const
Definition juce_URL.cpp:724
String getFileName() const
Definition juce_URL.cpp:260
URL getChildURL(const String &subPath) const
Definition juce_URL.cpp:334
static String removeEscapeChars(const String &stringToRemoveEscapeCharsFrom)
Definition juce_URL.cpp:732
static String addEscapeChars(const String &stringToAddEscapeCharsTo, bool isParameter, bool roundBracketsAreLegal=true)
Definition juce_URL.cpp:761
ParameterHandling
Definition juce_URL.h:302
@ inPostData
Definition juce_URL.h:304
@ inAddress
Definition juce_URL.h:303
String toString(bool includeGetParameters) const
Definition juce_URL.cpp:200
std::unique_ptr< OutputStream > createOutputStream() const
Definition juce_URL.cpp:620
String getSubPath(bool includeGetParameters=false) const
Definition juce_URL.cpp:224
URL getParentURL() const
Definition juce_URL.cpp:327
String getDomainInternal(bool) const
Definition juce_URL.cpp:430
String getQueryString() const
Definition juce_URL.cpp:236
ReferenceCountedArray< Upload > filesToUpload
Definition juce_URL.h:727
JUCE_NODISCARD URL withNewSubPath(const String &newPath) const
Definition juce_URL.cpp:314
static File fileFromFileSchemeURL(const URL &)
Definition juce_URL.cpp:271
static bool isProbablyAnEmailAddress(const String &possibleEmailAddress)
Definition juce_URL.cpp:421
JUCE_NODISCARD URL withNewDomainAndPath(const String &newFullPath) const
Definition juce_URL.cpp:307
String readEntireTextStream(bool usePostCommand=false) const
Definition juce_URL.cpp:650
bool isEmpty() const noexcept
Definition juce_URL.cpp:208
static bool isProbablyAWebsiteURL(const String &possibleURL)
Definition juce_URL.cpp:406
std::unique_ptr< InputStream > createInputStream(const InputStreamOptions &options) const
Definition juce_URL.cpp:605
const StringArray & getParameterValues() const noexcept
Definition juce_URL.h:254
std::unique_ptr< DownloadTask > downloadToFile(const File &targetLocation, String extraHeaders=String(), DownloadTaskListener *listener=nullptr, bool usePostCommand=false)
Definition juce_URL.cpp:824
bool(void *context, int bytesSent, int totalBytes) OpenStreamProgressCallback
Definition juce_URL.h:660
String getDomain() const
Definition juce_URL.cpp:219
static ParameterHandling toHandling(bool)
Definition juce_URL.cpp:266
bool isLocalFile() const
Definition juce_URL.cpp:250
void addParameter(const String &, const String &)
Definition juce_URL.cpp:194
JUCE_NODISCARD URL withFileToUpload(const String ¶meterName, const File &fileToUpload, const String &mimeType) const
Definition juce_URL.cpp:717
JUCE_NODISCARD URL withPOSTData(const String &postData) const
Definition juce_URL.cpp:686
bool hasBodyDataToSend() const
Definition juce_URL.cpp:341
JUCE_NODISCARD URL withParameters(const StringPairArray ¶metersToAdd) const
Definition juce_URL.cpp:675
void createHeadersAndPostData(String &, MemoryBlock &, bool) const
Definition juce_URL.cpp:346
const StringArray & getParameterNames() const noexcept
Definition juce_URL.h:240
String url
Definition juce_URL.h:723
std::unique_ptr< XmlElement > readEntireXmlStream(bool usePostCommand=false) const
Definition juce_URL.cpp:661
StringArray parameterValues
Definition juce_URL.h:725
String getScheme() const
Definition juce_URL.cpp:244
bool launchInDefaultBrowser() const
Definition juce_URL.cpp:788
MemoryBlock postData
Definition juce_URL.h:724
void init()
Definition juce_URL.cpp:68
URL()
Definition juce_URL.cpp:27
StringArray parameterNames
Definition juce_URL.h:725
struct huft * u[BMAX]
Definition inflate.c:1583
register unsigned i
Definition inflate.c:1575
unsigned s
Definition inflate.c:1555
unsigned f
Definition inflate.c:1572
static char filename[]
Definition features.c:5
static PuglViewHint int value
Definition pugl.h:1708
static double timeout
Definition pugl.h:1799
static const char * name
Definition pugl.h:1582
virtual ASIOError start()=0
int val
Definition jpeglib.h:956
JSAMPIMAGE data
Definition jpeglib.h:945
float in
Definition lilv_test.c:1460
Definition juce_URL.cpp:120
static String removeLastPathSection(const String &url)
Definition juce_URL.cpp:179
static int findEndOfScheme(const String &url)
Definition juce_URL.cpp:142
static int findStartOfPath(const String &url)
Definition juce_URL.cpp:163
static int findStartOfNetLocation(const String &url)
Definition juce_URL.cpp:153
static void concatenatePaths(String &path, const String &suffix)
Definition juce_URL.cpp:168
static String getMangledParameters(const URL &url)
Definition juce_URL.cpp:121
Definition carla_juce.cpp:31
RangedDirectoryIterator end(const RangedDirectoryIterator &)
Definition juce_RangedDirectoryIterator.h:184
wchar_t juce_wchar
Definition juce_CharacterFunctions.h:42
std::unique_ptr< XmlElement > parseXML(const String &textToParse)
Definition juce_XmlDocument.cpp:41
void ignoreUnused(Types &&...) noexcept
Definition juce_MathsFunctions.h:333
static URL::InputStreamOptions with(URL::InputStreamOptions options, Member &&member, Item &&item)
Definition juce_URL.cpp:561
unsigned char uint8
Definition juce_MathsFunctions.h:37
Definition juce_URL.h:699
String mimeType
Definition juce_URL.h:701
String parameterName
Definition juce_URL.h:701
Upload(const String &, const String &, const String &, const File &, MemoryBlock *)
Definition juce_URL.cpp:698
File file
Definition juce_URL.h:702
String filename
Definition juce_URL.h:701
std::unique_ptr< MemoryBlock > data
Definition juce_URL.h:703
RECT const char void(* callback)(const char *droppath))) SWELL_API_DEFINE(BOOL
Definition swell-functions.h:1004
signed char BOOL
Definition swell-types.h:160
uch * p
Definition crypt.c:594
return c
Definition crypt.c:175
int flush(__G__ rawbuf, size, unshrink) __GDEF uch *rawbuf
int result
Definition process.c:1455
typedef int(UZ_EXP MsgFn)()
#define const
Definition zconf.h:137