a609673ce8
When URLs combine a base URL with a relative part, the relative part's path component was being pre-processed. This removed any ".." from the path and in some cases in the unit test cases, the ".." should have been retained and then only later applied to the base URL. This changes fixes this so that the relative part is not pre-processed and is applied with it's path in a raw state. Completes Fixes for #14377 Change-Id: I9cebb8599889494e11f40a3b54c87ebca3ed1a21 Reviewed-on: https://review.haiku-os.org/529 Reviewed-by: Jérôme Duval <jerome.duval@gmail.com>
159 lines
4.4 KiB
C++
159 lines
4.4 KiB
C++
/*
|
|
* Copyright 2010-2018 Haiku Inc. All rights reserved.
|
|
* Distributed under the terms of the MIT License.
|
|
*/
|
|
#ifndef _B_URL_H_
|
|
#define _B_URL_H_
|
|
|
|
|
|
#include <Archivable.h>
|
|
#include <Message.h>
|
|
#include <Path.h>
|
|
#include <String.h>
|
|
|
|
|
|
class BUrl : public BArchivable {
|
|
public:
|
|
BUrl(const char* url);
|
|
BUrl(BMessage* archive);
|
|
BUrl(const BUrl& other);
|
|
BUrl(const BUrl& base, const BString& relative);
|
|
BUrl(const BPath& path);
|
|
BUrl();
|
|
virtual ~BUrl();
|
|
|
|
// URL fields modifiers
|
|
BUrl& SetUrlString(const BString& url);
|
|
BUrl& SetProtocol(const BString& scheme);
|
|
BUrl& SetUserName(const BString& user);
|
|
BUrl& SetPassword(const BString& password);
|
|
void SetAuthority(const BString& authority);
|
|
BUrl& SetHost(const BString& host);
|
|
BUrl& SetPort(int port);
|
|
BUrl& SetPath(const BString& path);
|
|
BUrl& SetRequest(const BString& request);
|
|
BUrl& SetFragment(const BString& fragment);
|
|
|
|
// URL fields access
|
|
const BString& UrlString() const;
|
|
const BString& Protocol() const;
|
|
const BString& UserName() const;
|
|
const BString& Password() const;
|
|
const BString& UserInfo() const;
|
|
const BString& Host() const;
|
|
int Port() const;
|
|
const BString& Authority() const;
|
|
const BString& Path() const;
|
|
const BString& Request() const;
|
|
const BString& Fragment() const;
|
|
|
|
// URL fields tests
|
|
bool IsValid() const;
|
|
bool HasProtocol() const;
|
|
bool HasUserName() const;
|
|
bool HasPassword() const;
|
|
bool HasUserInfo() const;
|
|
bool HasHost() const;
|
|
bool HasPort() const;
|
|
bool HasAuthority() const;
|
|
bool HasPath() const;
|
|
bool HasRequest() const;
|
|
bool HasFragment() const;
|
|
|
|
// Url encoding/decoding of needed fields
|
|
void UrlEncode(bool strict = false);
|
|
void UrlDecode(bool strict = false);
|
|
|
|
status_t IDNAToAscii();
|
|
status_t IDNAToUnicode();
|
|
|
|
// Url encoding/decoding of strings
|
|
static BString UrlEncode(const BString& url,
|
|
bool strict = false,
|
|
bool directory = false);
|
|
static BString UrlDecode(const BString& url,
|
|
bool strict = false);
|
|
|
|
// utility functionality
|
|
bool HasPreferredApplication() const;
|
|
BString PreferredApplication() const;
|
|
status_t OpenWithPreferredApplication(
|
|
bool onProblemAskUser = true) const;
|
|
|
|
// BArchivable members
|
|
virtual status_t Archive(BMessage* into,
|
|
bool deep = true) const;
|
|
static BArchivable* Instantiate(BMessage* archive);
|
|
|
|
// URL comparison
|
|
bool operator==(BUrl& other) const;
|
|
bool operator!=(BUrl& other) const;
|
|
|
|
// URL assignment
|
|
const BUrl& operator=(const BUrl& other);
|
|
const BUrl& operator=(const BString& string);
|
|
const BUrl& operator=(const char* string);
|
|
|
|
// URL to string conversion
|
|
operator const char*() const;
|
|
|
|
private:
|
|
void _ResetFields();
|
|
bool _ContainsDelimiter(const BString& url);
|
|
status_t _ExplodeUrlString(const BString& urlString,
|
|
uint32 flags);
|
|
BString _MergePath(const BString& relative) const;
|
|
void _SetPathUnsafe(const BString& path);
|
|
|
|
static BString _DoUrlEncodeChunk(const BString& chunk,
|
|
bool strict, bool directory = false);
|
|
static BString _DoUrlDecodeChunk(const BString& chunk,
|
|
bool strict);
|
|
|
|
bool _IsHostValid() const;
|
|
bool _IsHostIPV6Valid(size_t offset,
|
|
int32 length) const;
|
|
bool _IsProtocolValid() const;
|
|
static bool _IsUnreserved(char c);
|
|
static bool _IsGenDelim(char c);
|
|
static bool _IsSubDelim(char c);
|
|
static bool _IsIPV6Char(char c);
|
|
static bool _IsUsernameChar(char c);
|
|
static bool _IsPasswordChar(char c);
|
|
static bool _IsHostChar(char c);
|
|
static bool _IsPortChar(char c);
|
|
|
|
static void _RemoveLastPathComponent(BString& path);
|
|
|
|
BString _UrlMimeType() const;
|
|
|
|
private:
|
|
mutable BString fUrlString;
|
|
mutable BString fAuthority;
|
|
mutable BString fUserInfo;
|
|
|
|
BString fProtocol;
|
|
BString fUser;
|
|
BString fPassword;
|
|
BString fHost;
|
|
int fPort;
|
|
BString fPath;
|
|
BString fRequest;
|
|
BString fFragment;
|
|
|
|
mutable bool fUrlStringValid : 1;
|
|
mutable bool fAuthorityValid : 1;
|
|
mutable bool fUserInfoValid : 1;
|
|
|
|
bool fHasProtocol : 1;
|
|
bool fHasUserName : 1;
|
|
bool fHasPassword : 1;
|
|
bool fHasHost : 1;
|
|
bool fHasPort : 1;
|
|
bool fHasPath : 1;
|
|
bool fHasRequest : 1;
|
|
bool fHasFragment : 1;
|
|
};
|
|
|
|
#endif // _B_URL_H_
|