C语言URL解析器(代码分享)

                 By qianghaohao(Xqiang)


       本程序可以解析出URL中每个字段的值然后存入结构体
 中.也可以调用提供的API只获取需要的部分.
       本URL解析器代码来自https://github.com/jwerle/url.h
  在此基础上进行了大量的修改,修复了很多bug.总体思路
 没有改变,就是把很多细节改了下,现在可以正常使用了.
       -->可能还存在bug,如果网友发现了可以及时指正.

     感受:花了一天多的时间修复,充分地感受到了IDE对编程
的效率的影响,一个很奇葩的越界导致的问题结果调了半天
没找到问题。。。结果人家五分钟搞定。。。
   话不多说,直接上源代码:
  接口文件:url_parser.h:
#ifndef URL_PARSER
#define URL_PARSER

/**
 * Dependencies
 */

#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
#include <string.h>


/**
 * url.h version
 */

#define URL_VERSION 0.0.2


/**
 * Max length of a url protocol scheme
 */

#define URL_PROTOCOL_MAX_LENGTH 16


/**
 * Max length of a url host part
 */

#define URL_HOSTNAME_MAX_LENGTH 128


/**
 * Max length of a url tld part
 */

#define URL_TLD_MAX_LENGTH 16


/**
 * Max length of a url auth part
 */

#define URL_AUTH_MAX_LENGTH 32

/**
 * `url_data` struct that defines parts
 * of a parsed URL such as host and protocol
 */


#define URL_MAX_LENGTH 1024

//  url结构信息
typedef struct url_data {
  char *href;
  char *protocol;
  char *host;
  char *auth;
  char *hostname;
  char *pathname;
  char *search;
  char *path;
  char *hash;
  char *query;
  char *port;
} url_data_t;


// prototype

/**
 * Parses a url into parts and returns
 * a `url_data_t *` pointer
 */

url_data_t *
url_parse (char *url);

char *
url_get_protocol (char *url);

char *
url_get_auth (char *url);

char *
url_get_hostname (char *url);

char *
url_get_host (char *url);

char *
url_get_pathname (char *url);

char *
url_get_path (char *url);

char *
url_get_search (char *url);

char *
url_get_query (char *url);

char *
url_get_hash (char *url);

char *
url_get_port (char *url);

void
url_free (url_data_t *data);

bool
url_is_protocol (char *str);

bool
url_is_ssh (char *str);

void
url_inspect (char *url);

void
url_data_inspect (url_data_t *data);

#endif

    实现文件:url_parser.c:

  使用用例:main.c:
/*************************************************************************
	> File Name: main.c
	> Author: qianghaohao(Xqiang)
	> Program: url_parser
	> Readme: 本URL解析器代码来自https://github.com/jwerle/url.h
	>         在此基础上进行了大量的修改,修复了很多bug.
	>         总体思路没有改变,就是把很多细节改了下,现在可以正常使用了.
	>    -->可能还存在bug,如果网友发现了可以及时指正.
	> Platform: 可以跨平台使用
	> Created Time: 2016年06月11日 星期六 18时39分14秒
 ************************************************************************/

#include"url_parser.h"
url_data_t *url_info = NULL;
int main(int argc, char **argv) {
	if (argc != 2) {
		fprintf(stderr, "usage:%s <url>", argv[0]);
		return -1;
	}

	 url_info = url_parse(argv[1]);
	if (NULL == url_info) {
		fprintf(stderr, "%s error...\n", argv[1]);
		return -1;
	}
	url_data_inspect(url_info);

	//  测试用例:http://www.baidu.com:80/cig-bin/index.html?sdkfj#283sjkdf
	printf("\n================= API Demo ================\n");


	printf("herf:%s\n", argv[1]);

    char *hostname = url_get_host(argv[1]);
    printf("hostname:%s\n", hostname);

    char *path = url_get_path(argv[1]);
    printf("path:%s\n", path);

    char *host = url_get_host(argv[1]);
    printf("host:%s\n", host);

    char *proto = url_get_protocol(argv[1]);
    printf("protocol:%s\n", proto);

    char *auth = url_get_auth(argv[1]);
    printf("auth:%s\n", auth);

    char *search = url_get_search(argv[1]);
    printf("search:%s\n", search);

    char *hash = url_get_hash(argv[1]);
    printf("hash:%s\n", hash);

    char *query = url_get_query(argv[1]);
    printf("query:%s\n", query);

    char *port = url_get_port(argv[1]);
    printf("port:%s\n", port);
	return 0;
}
     运行结果:
  C语言URL解析器(代码分享)

相关文章:

  • 2021-05-21
  • 2021-08-30
  • 2021-06-22
  • 2022-12-23
  • 2022-02-11
  • 2021-11-27
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-01-04
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案