From 03541514a460e533ef6f3c1b7d5ba4ebe7532d7b Mon Sep 17 00:00:00 2001 From: Art Cancro Date: Fri, 25 Nov 2011 16:48:46 -0500 Subject: [PATCH] Parse HTTP headers to reveal X-XRDS-Location --- citadel/modules/openid/serv_openid_rp.c | 29 +++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/citadel/modules/openid/serv_openid_rp.c b/citadel/modules/openid/serv_openid_rp.c index 813cb9b63..65567de58 100644 --- a/citadel/modules/openid/serv_openid_rp.c +++ b/citadel/modules/openid/serv_openid_rp.c @@ -699,6 +699,32 @@ int parse_xrds_document(StrBuf *ReplyBuf) { } + +/* + * Callback function for perform_yadis_discovery() + * We're interested in HTTP headers returned from the server. + */ +size_t yadis_headerfunction(void *ptr, size_t size, size_t nmemb, void *userdata) { + char hdr[1024]; + + memcpy(hdr, ptr, (size*nmemb)); + hdr[size*nmemb] = 0; + + /* We are looking for a header like this: + * X-XRDS-Location: https://api.screenname.aol.com/auth/openid/xrds + */ + if (!strncasecmp(hdr, "X-XRDS-Location:", 16)) { + safestrncpy(hdr, &hdr[16], sizeof(hdr)); + striplt(hdr); + syslog(LOG_DEBUG, "\033[32m%s\033[0m", hdr); + /* FIXME now do something with it */ + } + + return(size * nmemb); +} + + + /* Attempt to perform Yadis discovery as specified in Yadis 1.0 section 6.2.5. * If successful, returns nonzero and calls parse_xrds_document() to act upon the received data. * If Yadis fails, returns 0 and does nothing else. @@ -729,6 +755,9 @@ int perform_yadis_discovery(StrBuf *YadisURL) { my_headers = curl_slist_append(my_headers, "Accept: application/xrds+xml"); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, my_headers); + curl_easy_setopt(curl, CURLOPT_WRITEHEADER, NULL); + curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, yadis_headerfunction); + result = curl_easy_perform(curl); if (result) { syslog(LOG_DEBUG, "libcurl error %d: %s", result, errmsg); -- 2.30.2