-
-
[原创]uriScheme类实现的简单版本[URI资料解析类]。
-
发表于:
2013-10-6 13:02
7756
-
[原创]uriScheme类实现的简单版本[URI资料解析类]。
上午发了一篇文章讲解解析URL小技巧,但aqtata大侠发了一个标准文档出来,于是根据标准文档编写代码,花了几个小时,写了一个简单版本的uri Scheme,接下来请看代码。
原文地址:
http://bbs.pediy.com/showthread.php?t=179681
PS:只负责解析标准的HTTPS、HTTP链接,其他的链接如果崩溃了一律不负责。
void testScheme() {
Scheme::uriScheme* uri = new Scheme::uriScheme("foo://example.com:8042/over/there/index.dtb?type=animal&name=narwhal#nose");
printf("%s\r\n", uri->getSchemeName());
printf("%s\r\n", uri->getHostName());
printf("%s\r\n", uri->getHostPort());
printf("%s\r\n", uri->getInfoPath());
printf("%s\r\n", uri->getQueueInfo());
printf("%s\r\n", uri->getFragment());
delete uri;
补充一下:
以上依次输出:foo、example.com、8042(如果没有端口默认80、443,这是标准的端口)、/over/there/index.dtb、type=animal&name=narwhal、nose
}
uriScheme.h
/*
* uriScheme.h
*
* Created on: Oct 5, 2013
* Author: vscen
*/
#ifndef URISCHEME_H_
#define URISCHEME_H_
#include "xxxxxxxx.h"
namespace Scheme {
class uriScheme {
char* uri_;
size_t urilen_;
public:
explicit uriScheme(const char* uri);
virtual ~uriScheme();
const char* getSchemeName();
const char* getHostName();
const char* getHostPort();
const char* getInfoPath();
const char* getQueueInfo();
const char* getFragment();
private:
bool createsUriScheme(const char* uri);
void destroyUriScheme();
bool isEmptyUriScheme() const;
size_t getUriLength() const;
const char* getUriString() const;
bool parsedSchemeName();
bool parsedHostName();
bool parsedHostPort();
bool parsedInfoPath();
bool parsedQueueInfo();
bool parsedFragment();
};
}
uriScheme.cc
/*
* uriScheme.cc
*
* Created on: Oct 5, 2013
* Author: vscen
*/
#include "uriScheme.h"
namespace Scheme {
namespace uriSchemeConst {
char* kPos = NULL;
const unsigned long kMaxUriScheme = 1024;
char kSchemeName[kMaxUriScheme] = { 0 };
char kHostName[kMaxUriScheme] = { 0 };
char kHostPort[kMaxUriScheme] = { 0 };
char kInfoPath[kMaxUriScheme] = { 0 };
char kQueueInfo[kMaxUriScheme] = { 0 };
char kFragment[kMaxUriScheme] = { 0 };
}
uriScheme::uriScheme(const char* uri) {
if (uriScheme::createsUriScheme(uri)) {
uriScheme::parsedSchemeName();
uriScheme::parsedHostName();
uriScheme::parsedHostPort();
uriScheme::parsedInfoPath();
uriScheme::parsedQueueInfo();
uriScheme::parsedFragment();
}
}
uriScheme::~uriScheme() {
uriScheme::destroyUriScheme();
}
const char* uriScheme::getSchemeName() {
return (uriSchemeConst::kSchemeName);
}
const char* uriScheme::getHostName() {
return (uriSchemeConst::kHostName);
}
const char* uriScheme::getHostPort() {
return (uriSchemeConst::kHostPort);
}
const char* uriScheme::getInfoPath() {
return (uriSchemeConst::kInfoPath);
}
const char* uriScheme::getQueueInfo() {
return (uriSchemeConst::kQueueInfo);
}
const char* uriScheme::getFragment() {
return (uriSchemeConst::kFragment);
}
bool uriScheme::createsUriScheme(const char* uri) {
uriScheme::urilen_ = strlen(uri);
uriScheme::uri_ = (char*) malloc(uriScheme::getUriLength() + 1);
if (!uriScheme::isEmptyUriScheme()) {
return false;
} else {
memcpy(uriScheme::uri_, uri, uriScheme::getUriLength());
uriScheme::uri_[uriScheme::getUriLength()] = 0;
uriSchemeConst::kPos = uriScheme::uri_;
return (uriScheme::getUriLength() < uriSchemeConst::kMaxUriScheme);
}
}
void uriScheme::destroyUriScheme() {
if (uriScheme::isEmptyUriScheme()) {
free(uriScheme::uri_);
uriScheme::urilen_ = 0;
uriSchemeConst::kPos = NULL;
}
}
bool uriScheme::isEmptyUriScheme() const {
return (uriScheme::getUriString() != NULL && uriScheme::getUriLength() > 0);
}
size_t uriScheme::getUriLength() const {
return (uriScheme::urilen_);
}
const char* uriScheme::getUriString() const {
return (uriScheme::uri_);
}
bool uriScheme::parsedSchemeName() {
char* buf = uriSchemeConst::kPos;
if (buf == NULL) {
return false;
} else {
int i = 0;
for (i = 0; *buf != 0; buf++, i++) {
uriSchemeConst::kSchemeName[i] = *buf;
if (isalpha(*buf)) {
continue;
} else if (isdigit(*buf)) {
continue;
} else if (*buf == '+' || *buf == '.' || *buf == '-') {
continue;
} else if (*buf == ':') {
break;
} else {
return false;
}
}
uriSchemeConst::kSchemeName[i] = 0;
uriSchemeConst::kPos = buf;
return true;
}
}
bool uriScheme::parsedHostName() {
char* buf = uriSchemeConst::kPos;
if (buf == NULL || strncmp(buf, "://", 3) != 0) {
return false;
} else {
buf += 3;
int i = 0;
for (i = 0; *buf != 0; buf++, i++) {
uriSchemeConst::kHostName[i] = *buf;
if (*buf == ':' || *buf == '/') {
break;
}
}
uriSchemeConst::kHostName[i] = 0;
uriSchemeConst::kPos = buf;
return true;
}
}
bool uriScheme::parsedHostPort() {
char* buf = uriSchemeConst::kPos;
if (buf == NULL || *buf != ':') {
if (strncasecmp(uriSchemeConst::kSchemeName, "http", 4) == 0) {
strncat(uriSchemeConst::kHostPort, "80\0", 3);
return true;
} else if (strncasecmp(uriSchemeConst::kSchemeName, "https", 5) == 0) {
strncat(uriSchemeConst::kHostPort, "443\0", 4);
return true;
} else {
return false;
}
} else {
buf += 1;
int i = 0;
for (i = 0; *buf != 0; buf++, i++) {
uriSchemeConst::kHostPort[i] = *buf;
if (*buf == '/') {
break;
}
}
uriSchemeConst::kHostPort[i] = 0;
uriSchemeConst::kPos = buf;
return true;
}
}
bool uriScheme::parsedInfoPath() {
char* buf = uriSchemeConst::kPos;
if (buf == NULL || *buf != '/') {
return false;
} else {
int i = 0;
for (i = 0; *buf != 0; buf++, i++) {
uriSchemeConst::kInfoPath[i] = *buf;
if ((*buf == '/') && (*(buf + 1) == 0)) {
break;
} else if (*buf == '?') {
break;
} else {
continue;
}
}
uriSchemeConst::kInfoPath[i] = 0;
uriSchemeConst::kPos = buf;
return true;
}
}
bool uriScheme::parsedQueueInfo() {
char* buf = uriSchemeConst::kPos;
if (buf == NULL || *buf != '?') {
return false;
} else {
buf += 1;
int i = 0;
for (i = 0; *buf != 0; buf++, i++) {
uriSchemeConst::kQueueInfo[i] = *buf;
if (*buf == '#') {
break;
} else {
continue;
}
}
uriSchemeConst::kQueueInfo[i] = 0;
uriSchemeConst::kPos = buf;
return true;
}
}
bool uriScheme::parsedFragment() {
char* buf = uriSchemeConst::kPos;
if (buf == NULL || *buf != '#') {
return false;
} else {
buf += 1;
int i = 0;
for (i = 0; *buf != 0; buf++, i++) {
uriSchemeConst::kFragment[i] = *buf;
continue;
}
uriSchemeConst::kFragment[i] = 0;
uriSchemeConst::kPos = buf;
return true;
}
}
}
[课程]Android-CTF解题方法汇总!