mirror of
https://github.com/warmcat/libwebsockets.git
synced 2025-03-30 00:00:16 +01:00
http: lws_http_rel_to_url
URL-level relative-to-absolute converter given a base url
This commit is contained in:
parent
63d2f844db
commit
3063fe84aa
2 changed files with 149 additions and 3 deletions
|
@ -335,6 +335,28 @@ typedef struct lhp_atr {
|
||||||
/* name+NUL then value+NUL follow */
|
/* name+NUL then value+NUL follow */
|
||||||
} lhp_atr_t;
|
} lhp_atr_t;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* In order to lay out the table, we have to incrementally adjust all foregoing
|
||||||
|
* DLOs as newer cells change the situation. So we have to keep track of all
|
||||||
|
* cell DLOs in a stack of tables until it's all done.
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
lws_dll2_t list; /* ps->table_cols */
|
||||||
|
|
||||||
|
lws_dll2_owner_t row_dlos; /* lws_dlo_t in column */
|
||||||
|
|
||||||
|
lws_fx_t height; /* currently computed row height */
|
||||||
|
} lhp_table_row_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
lws_dll2_t list; /* ps->table_cols */
|
||||||
|
|
||||||
|
lws_dll2_owner_t col_dlos; /* lws_dlo_t in column */
|
||||||
|
|
||||||
|
lws_fx_t width; /* currently computed column width */
|
||||||
|
} lhp_table_col_t;
|
||||||
|
|
||||||
struct lcsp_atr;
|
struct lcsp_atr;
|
||||||
|
|
||||||
#define CCPAS_TOP 0
|
#define CCPAS_TOP 0
|
||||||
|
@ -354,6 +376,10 @@ typedef struct lhp_pstack {
|
||||||
lws_fx_t curx;
|
lws_fx_t curx;
|
||||||
lws_fx_t cury;
|
lws_fx_t cury;
|
||||||
lws_fx_t widest;
|
lws_fx_t widest;
|
||||||
|
lws_fx_t deepest;
|
||||||
|
|
||||||
|
lws_dlo_t *dlo_set_curx;
|
||||||
|
lws_dlo_t *dlo_set_cury;
|
||||||
|
|
||||||
lws_dll2_owner_t atr; /* lhp_atr_t */
|
lws_dll2_owner_t atr; /* lhp_atr_t */
|
||||||
|
|
||||||
|
@ -373,12 +399,16 @@ typedef struct lhp_pstack {
|
||||||
const struct lcsp_atr *css_margin[4];
|
const struct lcsp_atr *css_margin[4];
|
||||||
const struct lcsp_atr *css_padding[4];
|
const struct lcsp_atr *css_padding[4];
|
||||||
|
|
||||||
uint8_t is_block; /* children use space in our drt */
|
uint16_t tr_idx; /* in table */
|
||||||
|
uint16_t td_idx; /* in current tr */
|
||||||
|
|
||||||
|
uint8_t is_block:1; /* children use space in our drt */
|
||||||
|
uint8_t is_table:1;
|
||||||
|
|
||||||
/* user layout owns these after initial values set */
|
/* user layout owns these after initial values set */
|
||||||
|
|
||||||
void *opaque1;
|
lws_dlo_t *dlo;
|
||||||
const void *opaque2;
|
const lws_display_font_t *font;
|
||||||
int oi[4];
|
int oi[4];
|
||||||
int positioned[4];
|
int positioned[4];
|
||||||
int rel_layout_cursor[4];
|
int rel_layout_cursor[4];
|
||||||
|
@ -504,6 +534,8 @@ typedef struct lhp_ctx {
|
||||||
const char *base_url; /* strdup of https://x.com/y.html */
|
const char *base_url; /* strdup of https://x.com/y.html */
|
||||||
sul_cb_t ssevcb; /* callback for ss events */
|
sul_cb_t ssevcb; /* callback for ss events */
|
||||||
lws_sorted_usec_list_t *ssevsul; /* sul to use to resume rz */
|
lws_sorted_usec_list_t *ssevsul; /* sul to use to resume rz */
|
||||||
|
sul_cb_t sshtmlevcb; /* callback for more html parse */
|
||||||
|
lws_sorted_usec_list_t *sshtmlevsul; /* sul for more html parse */
|
||||||
|
|
||||||
void *user;
|
void *user;
|
||||||
void *user1;
|
void *user1;
|
||||||
|
@ -545,6 +577,9 @@ typedef struct lhp_ctx {
|
||||||
int16_t cssval_state; /* private */
|
int16_t cssval_state; /* private */
|
||||||
|
|
||||||
uint8_t in_body:1;
|
uint8_t in_body:1;
|
||||||
|
uint8_t finish_css:1;
|
||||||
|
uint8_t is_css:1;
|
||||||
|
uint8_t await_css_done:1;
|
||||||
|
|
||||||
/* at end so we can memset members above it in one go */
|
/* at end so we can memset members above it in one go */
|
||||||
|
|
||||||
|
@ -636,6 +671,26 @@ lws_lhp_parse(lhp_ctx_t *ctx, const uint8_t **buf, size_t *len);
|
||||||
LWS_VISIBLE LWS_EXTERN const lcsp_atr_t *
|
LWS_VISIBLE LWS_EXTERN const lcsp_atr_t *
|
||||||
lws_css_cascade_get_prop_atr(lhp_ctx_t *ctx, lcsp_props_t prop);
|
lws_css_cascade_get_prop_atr(lhp_ctx_t *ctx, lcsp_props_t prop);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* lws_http_rel_to_url() - make absolute url from base and relative
|
||||||
|
*
|
||||||
|
* \param dest: place to store the result
|
||||||
|
* \param len: max length of result including NUL
|
||||||
|
* \param base: a reference url including a file part
|
||||||
|
* \param rel: the absolute or relative url or path to apply to base
|
||||||
|
*
|
||||||
|
* Copy the url formof rel into dest, using base to fill in missing context
|
||||||
|
*
|
||||||
|
* If base is https://x.com/y/z.html
|
||||||
|
*
|
||||||
|
* a.html -> https://x.com/y/a/html
|
||||||
|
* ../b.html -> https://x.com/b.html
|
||||||
|
* /c.html -> https://x.com/c.html
|
||||||
|
* https://y.com/a.html -> https://y.com/a.html
|
||||||
|
*/
|
||||||
|
LWS_VISIBLE LWS_EXTERN int
|
||||||
|
lws_http_rel_to_url(char *dest, size_t len, const char *base, const char *rel);
|
||||||
|
|
||||||
LWS_VISIBLE LWS_EXTERN lhp_pstack_t *
|
LWS_VISIBLE LWS_EXTERN lhp_pstack_t *
|
||||||
lws_css_get_parent_block(lhp_ctx_t *ctx, lhp_pstack_t *ps);
|
lws_css_get_parent_block(lhp_ctx_t *ctx, lhp_pstack_t *ps);
|
||||||
|
|
||||||
|
@ -651,6 +706,9 @@ lws_csp_px(const lcsp_atr_t *a, lhp_pstack_t *ps);
|
||||||
LWS_VISIBLE LWS_EXTERN void
|
LWS_VISIBLE LWS_EXTERN void
|
||||||
lws_lhp_tag_dlo_id(lhp_ctx_t *ctx, lhp_pstack_t *ps, lws_dlo_t *dlo);
|
lws_lhp_tag_dlo_id(lhp_ctx_t *ctx, lhp_pstack_t *ps, lws_dlo_t *dlo);
|
||||||
|
|
||||||
|
void
|
||||||
|
lhp_set_dlo_padding_margin(lhp_pstack_t *ps, lws_dlo_t *dlo);
|
||||||
|
|
||||||
#define LWS_LHPREF_WIDTH 0
|
#define LWS_LHPREF_WIDTH 0
|
||||||
#define LWS_LHPREF_HEIGHT 1
|
#define LWS_LHPREF_HEIGHT 1
|
||||||
#define LWS_LHPREF_NONE 2
|
#define LWS_LHPREF_NONE 2
|
||||||
|
|
|
@ -754,6 +754,94 @@ lws_urldecode(char *string, const char *escaped, int len)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copy the url formof rel into dest, using base to fill in missing context
|
||||||
|
*
|
||||||
|
* If base is https://x.com/y/z.html
|
||||||
|
*
|
||||||
|
* a.html -> https://x.com/y/a/html
|
||||||
|
* ../b.html -> https://x.com/b.html
|
||||||
|
* /c.html -> https://x.com/c.html
|
||||||
|
* https://y.com/a.html -> https://y.com/a.html
|
||||||
|
*/
|
||||||
|
|
||||||
|
int
|
||||||
|
lws_http_rel_to_url(char *dest, size_t len, const char *base, const char *rel)
|
||||||
|
{
|
||||||
|
size_t n = 0, ps = 0;
|
||||||
|
char d = 0;
|
||||||
|
|
||||||
|
// lwsl_err("%s: base %s, rel %s\n", __func__, base, rel);
|
||||||
|
|
||||||
|
if (!strncmp(rel, "https://", 8) ||
|
||||||
|
!strncmp(rel, "http://", 7) ||
|
||||||
|
!strncmp(rel, "file://", 7)) {
|
||||||
|
/* rel is already a full url, just copy it */
|
||||||
|
lws_strncpy(dest, rel, len);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* we're going to be using the first part of base at least */
|
||||||
|
|
||||||
|
while (n < len - 2 && base[n]) {
|
||||||
|
dest[n] = base[n];
|
||||||
|
if (d && base[n] == '/') {
|
||||||
|
n++;
|
||||||
|
ps = n;
|
||||||
|
//if (rel[0] == '/') {
|
||||||
|
break;
|
||||||
|
//}
|
||||||
|
}
|
||||||
|
if (n && base[n] == '/' && base[n - 1] == '/')
|
||||||
|
d = 1;
|
||||||
|
n++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!n || n >= len - 2)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
/* if we did not have a '/' after the hostname, add one */
|
||||||
|
if (dest[n - 1] != '/') {
|
||||||
|
ps = n;
|
||||||
|
dest[n++] = '/';
|
||||||
|
}
|
||||||
|
|
||||||
|
/* is rel an absolute path we should just use with the hostname? */
|
||||||
|
if (rel[0] != '/') {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Apply the rest of the basename, without the file part,
|
||||||
|
* end with last / if any
|
||||||
|
*/
|
||||||
|
|
||||||
|
ps = n;
|
||||||
|
while (n < len - 2 && base[n]) {
|
||||||
|
dest[n] = base[n];
|
||||||
|
n++;
|
||||||
|
if (base[n] == '/')
|
||||||
|
ps = n;
|
||||||
|
}
|
||||||
|
|
||||||
|
n = ps;
|
||||||
|
|
||||||
|
if (n >= len - 2)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
/* if we did not have a '/' after the base path, add one */
|
||||||
|
if (dest[n - 1] != '/')
|
||||||
|
dest[n++] = '/';
|
||||||
|
}
|
||||||
|
|
||||||
|
/* append rel */
|
||||||
|
|
||||||
|
if (len - n < strlen(rel) + 2)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
lws_strncpy(dest + n, rel, len - n);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
lws_finalize_startup(struct lws_context *context)
|
lws_finalize_startup(struct lws_context *context)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Reference in a new issue