+ int html_mime_len = strlen (HTML_HDR_CONTENT);
+ int cookie_hdr_len = strlen (MHD_HTTP_HEADER_SET_COOKIE);
+ char hdr_mime[html_mime_len+1];
+ char hdr_generic[bytes+1];
+ char new_cookie_hdr[bytes+strlen (ctask->leho)+1];
+ char new_location[MAX_HTTP_URI_LENGTH+500];
+ char real_host[264];
+ char leho_host[264];
+ char* ndup;
+ char* tok;
+ char* cookie_domain;
+ char* hdr_type;
+ char* hdr_val;
+ int delta_cdomain;
+ size_t offset = 0;
+ char cors_hdr[strlen (ctask->leho) + strlen ("https://")];
+
+ if (NULL == ctask->response)
+ {
+ /* FIXME: get total size from curl (if available) */
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Creating response for %s\n", ctask->url);
+ ctask->response = MHD_create_response_from_callback (MHD_SIZE_UNKNOWN,
+ sizeof (ctask->buffer),
+ &mhd_content_cb,
+ ctask,
+ NULL);
+
+ /* if we have a leho add a CORS header */
+ if (0 != strcmp ("", ctask->leho))
+ {
+ /* We could also allow ssl and http here */
+ if (ctask->mhd->is_ssl)
+ sprintf (cors_hdr, "https://%s", ctask->leho);
+ else
+ sprintf (cors_hdr, "http://%s", ctask->leho);
+
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "MHD: Adding CORS header field %s\n",
+ cors_hdr);
+
+ if (GNUNET_NO == MHD_add_response_header (ctask->response,
+ "Access-Control-Allow-Origin",
+ cors_hdr))
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "MHD: Error adding CORS header field %s\n",
+ cors_hdr);
+ }
+ }
+ ctask->ready_to_queue = GNUNET_YES;
+ }
+
+ if (html_mime_len <= bytes)
+ {
+ memcpy (hdr_mime, buffer, html_mime_len);
+ hdr_mime[html_mime_len] = '\0';
+
+ if (0 == strcmp (hdr_mime, HTML_HDR_CONTENT))
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Got HTML HTTP response header\n");
+ ctask->parse_content = GNUNET_YES;
+ }
+ }
+
+ if (cookie_hdr_len > bytes)
+ return bytes;
+
+ memcpy (hdr_generic, buffer, bytes);
+ hdr_generic[bytes] = '\0';
+ /* remove crlf */
+ if ('\n' == hdr_generic[bytes-1])
+ hdr_generic[bytes-1] = '\0';
+
+ if (hdr_generic[bytes-2] == '\r')
+ hdr_generic[bytes-2] = '\0';
+
+ if (0 == memcmp (hdr_generic,
+ MHD_HTTP_HEADER_SET_COOKIE,
+ cookie_hdr_len))
+ {
+ ndup = GNUNET_strdup (hdr_generic+cookie_hdr_len+1);
+ memset (new_cookie_hdr, 0, sizeof (new_cookie_hdr));
+ tok = strtok (ndup, ";");
+
+ GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+ "Looking for cookie in : %s\n", hdr_generic);
+
+ for (; tok != NULL; tok = strtok (NULL, ";"))
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+ "Got Cookie token: %s\n", tok);
+ //memcpy (new_cookie_hdr+offset, tok, strlen (tok));
+ if (0 == memcmp (tok, " domain", strlen (" domain")))
+ {
+ cookie_domain = tok + strlen (" domain") + 1;
+
+ GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+ "Got Set-Cookie Domain: %s\n", cookie_domain);
+
+ if (strlen (cookie_domain) < strlen (ctask->leho))
+ {
+ delta_cdomain = strlen (ctask->leho) - strlen (cookie_domain);
+ if (0 == strcmp (cookie_domain, ctask->leho + (delta_cdomain)))
+ {
+ GNUNET_snprintf (new_cookie_hdr+offset,
+ sizeof (new_cookie_hdr),
+ " domain=%s", ctask->authority);
+ offset += strlen (" domain=") + strlen (ctask->authority);
+ new_cookie_hdr[offset] = ';';
+ offset++;
+ continue;
+ }
+ }
+ else if (strlen (cookie_domain) == strlen (ctask->leho))
+ {
+ if (0 == strcmp (cookie_domain, ctask->leho))
+ {
+ GNUNET_snprintf (new_cookie_hdr+offset,
+ sizeof (new_cookie_hdr),
+ " domain=%s", ctask->host);
+ offset += strlen (" domain=") + strlen (ctask->host);
+ new_cookie_hdr[offset] = ';';
+ offset++;
+ continue;
+ }
+ }
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Cookie domain invalid\n");
+
+
+ }
+ memcpy (new_cookie_hdr+offset, tok, strlen (tok));
+ offset += strlen (tok);
+ new_cookie_hdr[offset] = ';';
+ offset++;
+ }
+
+ GNUNET_free (ndup);
+
+ GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+ "Got Set-Cookie HTTP header %s\n", new_cookie_hdr);
+
+ if (GNUNET_NO == MHD_add_response_header (ctask->response,
+ MHD_HTTP_HEADER_SET_COOKIE,
+ new_cookie_hdr))
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "MHD: Error adding set-cookie header field %s\n",
+ hdr_generic+cookie_hdr_len+1);
+ }
+ return bytes;
+ }
+
+ ndup = GNUNET_strdup (hdr_generic);
+ hdr_type = strtok (ndup, ":");
+
+ if (NULL == hdr_type)
+ {
+ GNUNET_free (ndup);
+ return bytes;
+ }
+
+ hdr_val = strtok (NULL, "");
+
+ if (NULL == hdr_val)
+ {
+ GNUNET_free (ndup);
+ return bytes;
+ }
+
+ hdr_val++;
+
+ if (0 == strcasecmp (MHD_HTTP_HEADER_LOCATION, hdr_type))
+ {
+ if (ctask->mhd->is_ssl)
+ {
+ sprintf (leho_host, "https://%s", ctask->leho);
+ sprintf (real_host, "https://%s", ctask->host);
+ }
+ else
+ {
+ sprintf (leho_host, "http://%s", ctask->leho);
+ sprintf (real_host, "http://%s", ctask->host);
+ }
+
+ if (0 == memcmp (leho_host, hdr_val, strlen (leho_host)))
+ {
+ sprintf (new_location, "%s%s", real_host, hdr_val+strlen (leho_host));
+ hdr_val = new_location;
+ }
+ }