http-url.h revision d82ad7143c057c565e1fd5f3580645556ed0bcc9
b355dcb54194f498921743ca33304eac35d89718Stephen Gallagher#ifndef HTTP_URL_H
bde69429374859acff41273c0771d2b5f5c199b1Yuri Chornoivan#define HTTP_URL_H
bde69429374859acff41273c0771d2b5f5c199b1Yuri Chornoivan
bde69429374859acff41273c0771d2b5f5c199b1Yuri Chornoivan#include "net.h"
b355dcb54194f498921743ca33304eac35d89718Stephen Gallagher
2cb6f28b3a12bb714bf14494d31eb6b6fff64b8bJakub Hrozekstruct http_request_target;
b20208b80e99abb79c00d5ec526caa9465859c52Jakub Hrozek
2cb6f28b3a12bb714bf14494d31eb6b6fff64b8bJakub Hrozekstruct http_url {
bde69429374859acff41273c0771d2b5f5c199b1Yuri Chornoivan /* server */
bde69429374859acff41273c0771d2b5f5c199b1Yuri Chornoivan const char *host_name;
b355dcb54194f498921743ca33304eac35d89718Stephen Gallagher struct ip_addr host_ip;
bde69429374859acff41273c0771d2b5f5c199b1Yuri Chornoivan in_port_t port;
b20208b80e99abb79c00d5ec526caa9465859c52Jakub Hrozek
b20208b80e99abb79c00d5ec526caa9465859c52Jakub Hrozek /* userinfo (not parsed by default) */
e59e09b5010f262228bbdeb92a79b733bf5854b3Stephen Gallagher const char *user;
b355dcb54194f498921743ca33304eac35d89718Stephen Gallagher const char *password;
c938f4ba417328fe62eded0806b2d9ca053f34a5Stephen Gallagher
bde69429374859acff41273c0771d2b5f5c199b1Yuri Chornoivan /* path */
bde69429374859acff41273c0771d2b5f5c199b1Yuri Chornoivan const char *path;
b355dcb54194f498921743ca33304eac35d89718Stephen Gallagher
b355dcb54194f498921743ca33304eac35d89718Stephen Gallagher /* ?query (still encoded) */
7a14e8f66c0e932fe2954d792614a3b61d444bd1Jakub Hrozek const char *enc_query;
bde69429374859acff41273c0771d2b5f5c199b1Yuri Chornoivan
cbe7c54c2caf718bdea7ca6660ba8193d759d2d5Stephen Gallagher /* #fragment (still encoded) */
cbe7c54c2caf718bdea7ca6660ba8193d759d2d5Stephen Gallagher const char *enc_fragment;
cbe7c54c2caf718bdea7ca6660ba8193d759d2d5Stephen Gallagher
65a9065538fd85e6ead925d344e6b421900eb8c2Jakub Hrozek unsigned int have_host_ip:1; /* URL uses IP address */
65a9065538fd85e6ead925d344e6b421900eb8c2Jakub Hrozek unsigned int have_port:1;
65a9065538fd85e6ead925d344e6b421900eb8c2Jakub Hrozek unsigned int have_ssl:1;
65a9065538fd85e6ead925d344e6b421900eb8c2Jakub Hrozek};
65a9065538fd85e6ead925d344e6b421900eb8c2Jakub Hrozek
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher/*
bde69429374859acff41273c0771d2b5f5c199b1Yuri Chornoivan * HTTP URL parsing
bde69429374859acff41273c0771d2b5f5c199b1Yuri Chornoivan */
bde69429374859acff41273c0771d2b5f5c199b1Yuri Chornoivan
cbe7c54c2caf718bdea7ca6660ba8193d759d2d5Stephen Gallagherenum http_url_parse_flags {
bde69429374859acff41273c0771d2b5f5c199b1Yuri Chornoivan /* Scheme part 'http:' is already parsed externally. This implies that
bde69429374859acff41273c0771d2b5f5c199b1Yuri Chornoivan this is an absolute HTTP URL. */
bde69429374859acff41273c0771d2b5f5c199b1Yuri Chornoivan HTTP_URL_PARSE_SCHEME_EXTERNAL = 0x01,
bde69429374859acff41273c0771d2b5f5c199b1Yuri Chornoivan /* Allow '#fragment' part in HTTP URL */
cbe7c54c2caf718bdea7ca6660ba8193d759d2d5Stephen Gallagher HTTP_URL_ALLOW_FRAGMENT_PART = 0x02,
cbe7c54c2caf718bdea7ca6660ba8193d759d2d5Stephen Gallagher /* Allow 'user:password@' part in HTTP URL */
cbe7c54c2caf718bdea7ca6660ba8193d759d2d5Stephen Gallagher HTTP_URL_ALLOW_USERINFO_PART = 0x04
cbe7c54c2caf718bdea7ca6660ba8193d759d2d5Stephen Gallagher};
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallagher
65a9065538fd85e6ead925d344e6b421900eb8c2Jakub Hrozekint http_url_parse(const char *url, struct http_url *base,
bde69429374859acff41273c0771d2b5f5c199b1Yuri Chornoivan enum http_url_parse_flags flags, pool_t pool,
bde69429374859acff41273c0771d2b5f5c199b1Yuri Chornoivan struct http_url **url_r, const char **error_r);
bde69429374859acff41273c0771d2b5f5c199b1Yuri Chornoivan
cbe7c54c2caf718bdea7ca6660ba8193d759d2d5Stephen Gallagherint http_url_request_target_parse(const char *request_target,
bde69429374859acff41273c0771d2b5f5c199b1Yuri Chornoivan const char *host_header, pool_t pool,
bde69429374859acff41273c0771d2b5f5c199b1Yuri Chornoivan struct http_request_target *target, const char **error_r);
bde69429374859acff41273c0771d2b5f5c199b1Yuri Chornoivan
bde69429374859acff41273c0771d2b5f5c199b1Yuri Chornoivan/*
cbe7c54c2caf718bdea7ca6660ba8193d759d2d5Stephen Gallagher * HTTP URL manipulation
bde69429374859acff41273c0771d2b5f5c199b1Yuri Chornoivan */
bde69429374859acff41273c0771d2b5f5c199b1Yuri Chornoivan
cbe7c54c2caf718bdea7ca6660ba8193d759d2d5Stephen Gallaghervoid http_url_copy_authority(pool_t pool, struct http_url *dest,
cbe7c54c2caf718bdea7ca6660ba8193d759d2d5Stephen Gallagher const struct http_url *src);
cbe7c54c2caf718bdea7ca6660ba8193d759d2d5Stephen Gallaghervoid http_url_copy(pool_t pool, struct http_url *dest,
bde69429374859acff41273c0771d2b5f5c199b1Yuri Chornoivan const struct http_url *src);
cbe7c54c2caf718bdea7ca6660ba8193d759d2d5Stephen Gallagherstruct http_url *http_url_clone(pool_t pool,const struct http_url *src);
cbe7c54c2caf718bdea7ca6660ba8193d759d2d5Stephen Gallagher
cbe7c54c2caf718bdea7ca6660ba8193d759d2d5Stephen Gallagher/*
bde69429374859acff41273c0771d2b5f5c199b1Yuri Chornoivan * HTTP URL construction
cbe7c54c2caf718bdea7ca6660ba8193d759d2d5Stephen Gallagher */
52261fe16203dec6e6f69177c6d0a810b47d073fStephen Gallagher
cbe7c54c2caf718bdea7ca6660ba8193d759d2d5Stephen Gallagherconst char *http_url_create(const struct http_url *url);
65a9065538fd85e6ead925d344e6b421900eb8c2Jakub Hrozek
65a9065538fd85e6ead925d344e6b421900eb8c2Jakub Hrozekconst char *http_url_create_host(const struct http_url *url);
65a9065538fd85e6ead925d344e6b421900eb8c2Jakub Hrozekconst char *http_url_create_authority(const struct http_url *url);
65a9065538fd85e6ead925d344e6b421900eb8c2Jakub Hrozekconst char *http_url_create_target(const struct http_url *url);
65a9065538fd85e6ead925d344e6b421900eb8c2Jakub Hrozek
2ea6196484055397cc4bc011c5960f790431fa9dStephen Gallaghervoid http_url_escape_param(string_t *out, const char *data);
bde69429374859acff41273c0771d2b5f5c199b1Yuri Chornoivan
bde69429374859acff41273c0771d2b5f5c199b1Yuri Chornoivan#endif
bde69429374859acff41273c0771d2b5f5c199b1Yuri Chornoivan