abaco: url handling

front
cinap_lenrek 2012-05-18 18:19:33 +02:00
parent 3b2b18328b
commit feca854317
1 changed files with 118 additions and 52 deletions

View File

@ -29,13 +29,14 @@ urlalloc(Runestr *src, Runestr *post, int m)
void
urlfree(Url *u)
{
if(u && decref(u)==0){
if(u==nil || decref(u) > 0)
return;
closerunestr(&u->src);
closerunestr(&u->act);
closerunestr(&u->post);
closerunestr(&u->ctype);
free(u);
}
}
Url *
@ -52,19 +53,16 @@ urldup(Url *a)
return b;
}
static
Runestr
static Runestr
getattr(int conn, char *s)
{
char buf[BUFSIZE];
int fd, n;
n = 0;
snprint(buf, sizeof(buf), "%s/%d/%s", webmountpt, conn, s);
fd = open(buf, OREAD);
if(fd >= 0){
n = read(fd, buf, sizeof(buf)-1);
if(n < 0)
snprint(buf, sizeof buf, "%s/%d/%s", webmountpt, conn, s);
if((fd = open(buf, OREAD)) >= 0){
if((n = read(fd, buf, sizeof(buf)-1)) < 0)
n = 0;
close(fd);
}
@ -72,12 +70,57 @@ getattr(int conn, char *s)
return (Runestr){runesmprint("%s", buf), n};
}
// tired of typing http://, tired of going to google first.
void
justgoogleit(Url *u)
{
Rune *s;
s = ucvt(u->src.r+2);
free(u->src.r);
u->src.r = runesmprint("http://www.google.com/search?hl=en&ie=UTF-8&q=%S", s);
free(s);
u->src.nr = runestrlen(u->src.r);
}
void
addhttp(Url *u)
{
Rune *s;
if(validurl(u->src.r))
return;
s = u->src.r;
u->src.r = runesmprint("http://%S", u->src.r);
free(s);
u->src.nr = runestrlen(u->src.r);
}
struct{
void (*f)(Url*);
Rune *lead;
int len;
} ctab[] = {
justgoogleit, L"g ", 2,
addhttp, L"", 0,
};
void
urlconvience(Url *u)
{
int i;
for(i = 0; u->src.nr >= ctab[i].len && runestrncmp(u->src.r, ctab[i].lead, ctab[i].len) != 0; i++)
;
ctab[i].f(u);
}
int
urlopen(Url *u)
{
char buf[BUFSIZE];
int cfd, fd, conn, n;
urlconvience(u);
snprint(buf, sizeof(buf), "%s/clone", webmountpt);
cfd = open(buf, ORDWR);
if(cfd < 0)
@ -125,61 +168,81 @@ urlopen(Url *u)
}
void
urlcanon(Rune *name){
Rune *s, *t;
urlcanon(Rune *name)
{
Rune *s, *e, *tail, tailr;
Rune **comp, **p, **q;
int rooted;
int n;
name = runestrstr(name, L"://");
if(name == nil)
return;
name = runestrchr(name+3, '/');
if(name == nil)
return;
if(*name == L'/')
name++;
n = 0;
for(e = name; *e != 0; e++)
if(*e == L'/')
n++;
comp = emalloc((n+2)*sizeof *comp);
name = runestrchr(name, L'/')+2;
rooted=name[0]==L'/';
/*
* Break the name into a list of components
*/
comp=emalloc(runestrlen(name)*sizeof(char *));
p=comp;
*p++=name;
for(s=name;;s++){
if(*s==L'/'){
*p++=s+1;
*s='\0';
}
else if(*s=='\0')
p = comp;
*p++ = name;
tail = nil;
tailr = L''; /* silence compiler */
for(s = name; *s != 0; s++){
if(*s == '?' || *s == '#'){
tail = s+1;
tailr = *s;
*s = 0;
break;
}
*p=0;
else if(*s == L'/'){
*p++ = s+1;
*s = 0;
}
}
/*
* go through the component list, deleting components that are empty (except
* the last component) or ., and any .. and its non-.. predecessor.
* the last component) or ., and any .. and its predecessor.
*/
p=q=comp;
while(*p){
if(runestrcmp(*p, L"")==0 && p[1]!=0
|| runestrcmp(*p, L".")==0)
p++;
else if(runestrcmp(*p, L"..")==0 && q!=comp && runestrcmp(q[-1], L"..")!=0){
--q;
p++;
}
for(p = q = comp; *p != nil; p++){
if(runestrcmp(*p, L"") == 0 && p[1] != nil
|| runestrcmp(*p, L".") == 0)
continue;
else if(q>comp && runestrcmp(*p, L"..") == 0 && runestrcmp(q[-1], L"..") != 0)
q--;
else
*q++=*p++;
*q++ = *p;
}
*q=0;
*q = nil;
/*
* rebuild the path name
*/
s=name;
if(rooted) *s++='/';
for(p=comp;*p;p++){
t=*p;
while(*t) *s++=*t++;
if(p[1]!=0) *s++='/';
s = name;
for(p = comp; p<q; p++){
n = runestrlen(*p);
memmove(s, *p, sizeof(Rune)*n);
s += n;
if(p[1] != nil)
*s++ = '/';
}
*s='\0';
*s = 0;
if(tail)
runeseprint(s, e+1, "%C%S", tailr, tail);
free(comp);
}
/* this is a HACK */
Rune *
Rune*
urlcombine(Rune *b, Rune *u)
{
Rune *p, *q, *sep, *s;
@ -199,7 +262,9 @@ urlcombine(Rune *b, Rune *u)
q = runestrchr(b, L':');
return runesmprint("%.*S:%S", (int)(q-b), b, u);
}
p = runestrstr(b, L"://")+3;
p = runestrstr(b, L"://");
if(p != nil)
p += 3;
sep = L"";
q = nil;
if(*u ==L'/')
@ -208,7 +273,7 @@ urlcombine(Rune *b, Rune *u)
for(i=0; i<nelem(endrune); i++)
if(q = runestrchr(p, endrune[i]))
break;
}else{
}else if(p != nil){
sep = L"/";
restore = 0;
s = runestrchr(p, L'?');
@ -219,7 +284,8 @@ urlcombine(Rune *b, Rune *u)
q = runestrrchr(p, L'/');
if(restore)
*s = L'?';
}
}else
sep = L"/";
if(q == nil)
p = runesmprint("%S%S%S", b, sep, u);
else