Files
htwkalender/services/data-manager/service/fetch/htmlDownloader.go
2024-06-24 10:25:34 +02:00

77 lines
2.1 KiB
Go

//Calendar implementation for the HTWK Leipzig timetable. Evaluation and display of the individual dates in iCal format.
//Copyright (C) 2024 HTWKalender support@htwkalender.de
//This program is free software: you can redistribute it and/or modify
//it under the terms of the GNU Affero General Public License as published by
//the Free Software Foundation, either version 3 of the License, or
//(at your option) any later version.
//This program is distributed in the hope that it will be useful,
//but WITHOUT ANY WARRANTY; without even the implied warranty of
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
//GNU Affero General Public License for more details.
//You should have received a copy of the GNU Affero General Public License
//along with this program. If not, see <https://www.gnu.org/licenses/>.
package fetch
import (
"fmt"
"io"
"log/slog"
"net/http"
"time"
)
// getPlanHTML Get the HTML document from the specified URL
func GetHTML(url string) (string, error) {
// Create HTTP client with timeout of 5 seconds
client := http.Client{
Timeout: 30 * time.Second,
}
return GetHTMLWithClient(url, &client)
}
func GetHTMLWithClient(url string, client *http.Client) (string, error) {
// Send GET request
response, err := client.Get(url)
if err != nil {
slog.Error("Error occurred while fetching the HTML document:", "error", err)
return "", err
}
if response.StatusCode != 200 {
slog.Warn("While fetching the HTML document, the server responded with status code: ", "status", response.StatusCode)
return "", fmt.Errorf("server responded with status code: %d", response.StatusCode)
}
defer func(Body io.ReadCloser) {
err := Body.Close()
if err != nil {
return
}
}(response.Body)
// Read the response body
body, err := io.ReadAll(response.Body)
if err != nil {
fmt.Printf("Error occurred while reading the response: %s\n", err.Error())
return "", err
}
return toUtf8(body), err
}
func toUtf8(iso88591Buf []byte) string {
buf := make([]rune, len(iso88591Buf))
for i, b := range iso88591Buf {
buf[i] = rune(b)
}
return string(buf)
}