From 97ca224359ccb7ae3eb3aa29c035b78d2ad8ae17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Revol?= Date: Sat, 4 Apr 2009 11:24:03 +0000 Subject: [PATCH] Fixed googlefs, - it now reports as Mozilla/5 compatible to get classed tags to better identify results and make sure the server doesn't fallback to html4 - fixed parsing - the google servers are getting picky about http CRLF, so send them correctly. Now it needs to be ported to the Haiku VFS... git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@29895 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../kernel/file_systems/googlefs/http_cnx.c | 11 ++++- .../file_systems/googlefs/parse_google_html.c | 47 ++++++++++++++++--- 2 files changed, 50 insertions(+), 8 deletions(-) diff --git a/src/add-ons/kernel/file_systems/googlefs/http_cnx.c b/src/add-ons/kernel/file_systems/googlefs/http_cnx.c index 79de9ab922..3bbe3d19aa 100644 --- a/src/add-ons/kernel/file_systems/googlefs/http_cnx.c +++ b/src/add-ons/kernel/file_systems/googlefs/http_cnx.c @@ -26,7 +26,14 @@ #define HTTPVER "1.0" -#define GOOGLEFS_UA "GoogleFS" +//#define GOOGLEFS_UA "GoogleFS" +//Mozilla/3.0 (compatible; NetPositive/2.2.2; BeOS) +//Mozilla/5.0 (BeOS; U; BeOS BePC; en-US; rv:1.8.1.18) Gecko/20081114 BonEcho/2.0.0.18 +#ifdef __HAIKU__ +#define GOOGLEFS_UA "Mozilla/5.0 (compatible; GoogleFS/0.1; Haiku)" +#else +#define GOOGLEFS_UA "Mozilla/5.0 (compatible; GoogleFS/0.1; BeOS)" +#endif #ifdef TESTME #define BUFSZ (128*1024) @@ -125,7 +132,7 @@ status_t http_get(struct http_cnx *cnx, const char *url) if (!req) return B_NO_MEMORY; /* no snprintf in kernel :( */ - sprintf(req, "GET %s HTTP/"HTTPVER"\nUser-Agent: " GOOGLEFS_UA "/" "0.1" "\nAccept: */*\n\n", url); + sprintf(req, "GET %s HTTP/"HTTPVER"\r\nUser-Agent: " GOOGLEFS_UA "\r\nAccept: */*\r\n\r\n", url); reqlen = strlen(req); err = len = write(cnx->sock, req, reqlen); if (len < 1) diff --git a/src/add-ons/kernel/file_systems/googlefs/parse_google_html.c b/src/add-ons/kernel/file_systems/googlefs/parse_google_html.c index e14d9cf0d5..881fe6b8cb 100644 --- a/src/add-ons/kernel/file_systems/googlefs/parse_google_html.c +++ b/src/add-ons/kernel/file_systems/googlefs/parse_google_html.c @@ -24,12 +24,17 @@ #ifdef TESTME #define BUFSZ (128*1024) +int dbgstep = 0; +#define PRST printf(DBG "step %d\n", dbgstep++) +#else +#define PRST {} #endif //old //#define G_BEGIN_URL "

" #define G_END_URL "\" class=l>" //#define G_BEGIN_NAME @@ -55,26 +60,41 @@ int google_parse_results(const char *html, size_t htmlsize, struct google_result return EINVAL; /* sanity checks */ printf(DBG"sanity check...\n"); - if (strstr(html, "") != html) - return EINVAL; + PRST; + /* google now sends sometimes... */ + if (strstr(html, "") != html) { + if (strstr(html, "") != html) + return EINVAL; + } + PRST; // p = strstr(html, "Google Search:"); p = strstr(html, "Google"); if (!p) return EINVAL; - p = strstr(html, "</head><body"); + PRST; + p = strstr(html, "<body"); if (!p) return EINVAL; - p = strstr(html, ">Results <b>"); + PRST; + p = strstr(html, "> Results <b>"); if (!p) return EINVAL; - p+= strlen(">Results <b>"); + PRST; + p+= strlen("> Results <b>"); startid = strtol(p, &p, 10); if (!p) return EINVAL; + PRST; p = strstr(html, "</b> - <b>"); p+= strlen("</b> - <b>"); if (!p) return EINVAL; + PRST; lastid = strtol(p, &p, 10); if (!p) return EINVAL; + PRST; maxres = lastid - startid + 1; printf(DBG"getting %ld results (%ld to %ld)\n", maxres, startid, lastid); + p = strstr(html, "Search Results<"); + if (!p) return EINVAL; + PRST; + printf(DBG"parsing...\n"); do { @@ -82,6 +102,9 @@ int google_parse_results(const char *html, size_t htmlsize, struct google_result long itemlen; char *tmp; int i; +#ifdef TESTME + dbgstep = 0; +#endif nres = malloc(sizeof(struct google_result)); if (!nres) { // XXX: cleanup! @@ -90,6 +113,7 @@ int google_parse_results(const char *html, size_t htmlsize, struct google_result memset(nres, 0, sizeof(struct google_result)); nres->id = startid + numres; //- 1; + PRST; /* find url */ // <p class=g><a href=URL> if (!p) break; @@ -98,12 +122,14 @@ int google_parse_results(const char *html, size_t htmlsize, struct google_result else p = strstr(p, G_BEGIN_URL); if (!p) break; + PRST; p+= strlen(G_BEGIN_URL); nextresult = strstr(p, G_BEGIN_URL); //printf(DBG"[%ld] found token 1\n", numres); item = p; p = strstr(p, G_END_URL); if (!p) break; + PRST; p+= strlen(G_END_URL); //printf(DBG"[%ld] found token 2\n", numres); itemlen = p - item - strlen(G_END_URL); @@ -116,6 +142,7 @@ int google_parse_results(const char *html, size_t htmlsize, struct google_result item = p; p = strstr(p, G_END_NAME); if (!p) break; + PRST; p+= strlen(G_END_NAME); //printf(DBG"[%ld] found token 3\n", numres); itemlen = p - item - strlen(G_END_NAME); @@ -127,10 +154,17 @@ int google_parse_results(const char *html, size_t htmlsize, struct google_result strncpy(q, item, itemlen); q[itemlen] = '\0'; /* strip <*b> off */ + PRST; while ((tmp = strstr(q, "<b>"))) strcpy(tmp, tmp + 3); while ((tmp = strstr(q, "</b>"))) strcpy(tmp, tmp + 4); + /* strip <*em> off */ + PRST; + while ((tmp = strstr(q, "<em>"))) + strcpy(tmp, tmp + 4); + while ((tmp = strstr(q, "</em>"))) + strcpy(tmp, tmp + 5); /* strip &foo; */ tmp = unentitify_string(q); free(q); @@ -139,6 +173,7 @@ int google_parse_results(const char *html, size_t htmlsize, struct google_result strncpy(nres->name, tmp, GR_MAX_NAME-1); nres->name[GR_MAX_NAME-1] = '\0'; free(tmp); + PRST; #if 0 /* find snipset */