From 84bf55ab24de50bd9d9f5734cacb3c5d3f2d0779 Mon Sep 17 00:00:00 2001 From: partisan Date: Thu, 8 Aug 2024 23:09:07 +0200 Subject: [PATCH] send search request wip --- forums.go | 26 -------- images.go | 60 +++++++++++++++++- node-handle-search.go | 23 +++++-- node-request-search.go | 135 +++++++++++++++++++++-------------------- node.go | 14 +++-- 5 files changed, 152 insertions(+), 106 deletions(-) diff --git a/forums.go b/forums.go index 7f13fed..7c4b6c6 100644 --- a/forums.go +++ b/forums.go @@ -11,8 +11,6 @@ import ( "time" ) -var resultsChan = make(chan []ForumSearchResult) - func PerformRedditSearch(query string, safe string, page int) ([]ForumSearchResult, error) { const ( pageSize = 25 @@ -194,27 +192,3 @@ func sendSearchRequestToNode(nodeAddr, query, safe, lang string, page int) ([]Fo return nil, fmt.Errorf("timeout waiting for results from node %s", nodeAddr) } } - -func handleForumResultsMessage(msg Message) { - var results []ForumSearchResult - err := json.Unmarshal([]byte(msg.Content), &results) - if err != nil { - log.Printf("Error unmarshalling forum results: %v", err) - return - } - - log.Printf("Received forum results: %+v", results) - // Send results to resultsChan - go func() { - resultsChan <- results - }() -} - -func fetchForumResults(query, safe, lang string, page int) []ForumSearchResult { - results, err := PerformRedditSearch(query, safe, page) - if err != nil { - log.Printf("Error fetching forum results: %v", err) - return nil - } - return results -} diff --git a/images.go b/images.go index 84c1366..429b4df 100644 --- a/images.go +++ b/images.go @@ -1,6 +1,7 @@ package main import ( + "encoding/json" "fmt" "html/template" "log" @@ -40,6 +41,7 @@ func handleImageSearch(w http.ResponseWriter, query, safe, lang string, page int CurrentLang string HasPrevPage bool HasNextPage bool + NoResults bool }{ Results: combinedResults, Query: query, @@ -49,6 +51,7 @@ func handleImageSearch(w http.ResponseWriter, query, safe, lang string, page int CurrentLang: lang, HasPrevPage: page > 1, HasNextPage: len(combinedResults) >= 50, + NoResults: len(combinedResults) == 0, } err = tmpl.Execute(w, data) @@ -120,12 +123,67 @@ func fetchImageResults(query, safe, lang string, page int) []ImageSearchResult { // If no results found after trying all engines if len(results) == 0 { - log.Printf("No image results found for query: %s", query) + log.Printf("No image results found for query: %s, trying other nodes", query) + results = tryOtherNodesForImageSearch(query, safe, lang, page) } return results } +func tryOtherNodesForImageSearch(query, safe, lang string, page int) []ImageSearchResult { + for _, nodeAddr := range peers { + results, err := sendImageSearchRequestToNode(nodeAddr, query, safe, lang, page) + if err != nil { + log.Printf("Error contacting node %s: %v", nodeAddr, err) + continue + } + if len(results) > 0 { + return results + } + } + return nil +} + +func sendImageSearchRequestToNode(nodeAddr, query, safe, lang string, page int) ([]ImageSearchResult, error) { + searchParams := struct { + Query string `json:"query"` + Safe string `json:"safe"` + Lang string `json:"lang"` + Page int `json:"page"` + ResponseAddr string `json:"responseAddr"` + }{ + Query: query, + Safe: safe, + Lang: lang, + Page: page, + ResponseAddr: fmt.Sprintf("http://localhost:%d/node", config.Port), + } + + msgBytes, err := json.Marshal(searchParams) + if err != nil { + return nil, fmt.Errorf("failed to marshal search parameters: %v", err) + } + + msg := Message{ + ID: hostID, + Type: "search-image", + Content: string(msgBytes), + } + + err = sendMessage(nodeAddr, msg) + if err != nil { + return nil, fmt.Errorf("failed to send search request to node %s: %v", nodeAddr, err) + } + + // Wait for results + select { + case res := <-imageResultsChan: + return res, nil + case <-time.After(30 * time.Second): // Need to handle this better, setting a static number is stupid + return nil, fmt.Errorf("timeout waiting for results from node %s", nodeAddr) + } +} + func wrapImageSearchFunc(f func(string, string, string, int) ([]ImageSearchResult, time.Duration, error)) func(string, string, string, int) ([]SearchResult, time.Duration, error) { return func(query, safe, lang string, page int) ([]SearchResult, time.Duration, error) { imageResults, duration, err := f(query, safe, lang, page) diff --git a/node-handle-search.go b/node-handle-search.go index 248adba..d489a08 100644 --- a/node-handle-search.go +++ b/node-handle-search.go @@ -45,10 +45,11 @@ func handleSearchTextMessage(msg Message) { func handleSearchImageMessage(msg Message) { var searchParams struct { - Query string `json:"query"` - Safe string `json:"safe"` - Lang string `json:"lang"` - Page int `json:"page"` + Query string `json:"query"` + Safe string `json:"safe"` + Lang string `json:"lang"` + Page int `json:"page"` + ResponseAddr string `json:"responseAddr"` } err := json.Unmarshal([]byte(msg.Content), &searchParams) if err != nil { @@ -56,6 +57,8 @@ func handleSearchImageMessage(msg Message) { return } + log.Printf("Received search-image request. ResponseAddr: %s", searchParams.ResponseAddr) + results := fetchImageResults(searchParams.Query, searchParams.Safe, searchParams.Lang, searchParams.Page) resultsJSON, err := json.Marshal(results) if err != nil { @@ -69,9 +72,17 @@ func handleSearchImageMessage(msg Message) { Content: string(resultsJSON), } - err = sendMessage(msg.ID, responseMsg) + // Log the address to be used for sending the response + log.Printf("Sending image search results to %s", searchParams.ResponseAddr) + + if searchParams.ResponseAddr == "" { + log.Printf("Error: Response address is empty") + return + } + + err = sendMessage(searchParams.ResponseAddr, responseMsg) if err != nil { - log.Printf("Error sending image search results to %s: %v", msg.ID, err) + log.Printf("Error sending image search results to %s: %v", searchParams.ResponseAddr, err) } } diff --git a/node-request-search.go b/node-request-search.go index 18cf03b..2d61c1b 100644 --- a/node-request-search.go +++ b/node-request-search.go @@ -2,79 +2,80 @@ package main import ( "encoding/json" + "log" ) -// func sendSearchRequestToNode(nodeAddr, query, safe, lang string, page int, requestID string) ([]ForumSearchResult, error) { -// searchParams := struct { -// Query string `json:"query"` -// Safe string `json:"safe"` -// Lang string `json:"lang"` -// Page int `json:"page"` -// ResponseAddr string `json:"responseAddr"` -// }{ -// Query: query, -// Safe: safe, -// Lang: lang, -// Page: page, -// ResponseAddr: "http://localhost:5000/node", // Node 1's address -// } +////// FORUMS ///// -// msg := Message{ -// ID: requestID, -// Type: "search-forum", -// Content: toJSON(searchParams), -// } +var resultsChan = make(chan []ForumSearchResult) -// msgBytes, err := json.Marshal(msg) -// if err != nil { -// return nil, fmt.Errorf("failed to marshal search request: %v", err) -// } +func sendForumResults(responseAddr string, results []ForumSearchResult) { + resultsMsg := Message{ + ID: hostID, + Type: "forum-results", + Content: marshalResults(results), + } -// req, err := http.NewRequest("POST", nodeAddr, bytes.NewBuffer(msgBytes)) -// if err != nil { -// return nil, fmt.Errorf("failed to create search request: %v", err) -// } -// req.Header.Set("Content-Type", "application/json") -// req.Header.Set("Authorization", authCode) - -// client := &http.Client{ -// Timeout: time.Second * 10, -// } - -// resp, err := client.Do(req) -// if err != nil { -// return nil, fmt.Errorf("failed to send search request: %v", err) -// } -// defer resp.Body.Close() - -// if resp.StatusCode != http.StatusOK { -// body, _ := ioutil.ReadAll(resp.Body) -// return nil, fmt.Errorf("server error: %s", body) -// } - -// var responseMsg Message -// err = json.NewDecoder(resp.Body).Decode(&responseMsg) -// if err != nil { -// return nil, fmt.Errorf("failed to decode search response: %v", err) -// } - -// if responseMsg.Type != "forum-results" { -// return nil, fmt.Errorf("unexpected message type: %s", responseMsg.Type) -// } - -// var results []ForumSearchResult -// err = json.Unmarshal([]byte(responseMsg.Content), &results) -// if err != nil { -// return nil, fmt.Errorf("failed to unmarshal search results: %v", err) -// } - -// return results, nil -// } - -func toJSON(v interface{}) string { - data, err := json.Marshal(v) + err := sendMessage(responseAddr, resultsMsg) if err != nil { + log.Printf("Error sending forum search results to %s: %v", responseAddr, err) + } else { + log.Printf("Forum search results sent successfully to %s", responseAddr) + } +} + +func marshalResults(results []ForumSearchResult) string { + content, err := json.Marshal(results) + if err != nil { + log.Printf("Error marshalling forum results: %v", err) return "" } - return string(data) + return string(content) } + +func handleForumResultsMessage(msg Message) { + var results []ForumSearchResult + err := json.Unmarshal([]byte(msg.Content), &results) + if err != nil { + log.Printf("Error unmarshalling forum results: %v", err) + return + } + + log.Printf("Received forum results: %+v", results) + // Send results to resultsChan + go func() { + resultsChan <- results + }() +} + +func fetchForumResults(query, safe, lang string, page int) []ForumSearchResult { + results, err := PerformRedditSearch(query, safe, page) + if err != nil { + log.Printf("Error fetching forum results: %v", err) + return nil + } + return results +} + +////// FORUMS ////// + +////// IMAGES ///// + +var imageResultsChan = make(chan []ImageSearchResult) + +func handleImageResultsMessage(msg Message) { + var results []ImageSearchResult + err := json.Unmarshal([]byte(msg.Content), &results) + if err != nil { + log.Printf("Error unmarshalling image results: %v", err) + return + } + + log.Printf("Received image results: %+v", results) + // Send results to imageResultsChan + go func() { + imageResultsChan <- results + }() +} + +////// IMAGES ///// diff --git a/node.go b/node.go index 5fe0774..6f927d3 100644 --- a/node.go +++ b/node.go @@ -153,13 +153,15 @@ func interpretMessage(msg Message) { handleSearchForumMessage(msg) case "forum-results": handleForumResultsMessage(msg) + // case "text-results": + // handleTextResultsMessage(msg) // need to implement + case "image-results": + handleImageResultsMessage(msg) // need to implement + // case "video-results": + // handleVideoResultsMessage(msg) // need to implement + // case "file-results": + // handleFileResultsMessage(msg) // need to implement default: fmt.Println("Received unknown message type:", msg.Type) } } - -func generateRequestID() string { - bytes := make([]byte, 16) - rand.Read(bytes) - return fmt.Sprintf("%x", bytes) -}