Skip to content

Instantly share code, notes, and snippets.

@marshyon
Created August 26, 2019 14:10
Show Gist options
  • Save marshyon/8781d19da13fa7fa0ff917ff34cbca8e to your computer and use it in GitHub Desktop.
Save marshyon/8781d19da13fa7fa0ff917ff34cbca8e to your computer and use it in GitHub Desktop.
Deploy a Go web service as an Azure Web Application using Docker - server.go
package main
/*
*
* this uses a file in it's current directory called 'jobs.txt' which may be formed as :
*
* https://jsonplaceholder.typicode.com:443/photos/1
* https://jsonplaceholder.typicode.com:443/todos/1
* https://jsonplaceholder.typicode.com:443/albums/6
*
*/
import (
"bufio"
"context"
"fmt"
"io/ioutil"
"log"
"net/http"
"os"
"os/signal"
"syscall"
"time"
"github.com/gorilla/mux"
"gopkg.in/natefinch/lumberjack.v2"
)
func handler(w http.ResponseWriter, r *http.Request) {
query := r.URL.Query()
name := query.Get("name")
if name == "" {
name = "Guest"
}
log.Printf("Received request for %s\n", name)
var logStr string
jobList := []string{}
file, err := os.Open("jobs.txt")
if err != nil {
log.Fatal(err)
}
defer file.Close()
scanner := bufio.NewScanner(file)
for scanner.Scan() {
fmt.Println(scanner.Text())
jobList = append(jobList, fmt.Sprintf("%s", scanner.Text()))
}
if err := scanner.Err(); err != nil {
log.Fatal(err)
}
for _, job := range jobList {
logStr += testURL(job)
}
fmt.Println(logStr)
w.Write([]byte(fmt.Sprintf("Hello, %s\n%s\n", name, logStr)))
}
func main() {
// Create Server and Route Handlers
r := mux.NewRouter()
r.HandleFunc("/", handler)
srv := &http.Server{
Handler: r,
Addr: ":8080",
ReadTimeout: 10 * time.Second,
WriteTimeout: 10 * time.Second,
}
// Configure Logging
LOG_FILE_LOCATION := os.Getenv("LOG_FILE_LOCATION")
if LOG_FILE_LOCATION != "" {
log.SetOutput(&lumberjack.Logger{
Filename: LOG_FILE_LOCATION,
MaxSize: 500, // megabytes
MaxBackups: 3,
MaxAge: 28, //days
Compress: true, // disabled by default
})
}
// Start Server
go func() {
log.Println("Starting Server")
if err := srv.ListenAndServe(); err != nil {
log.Fatal(err)
}
}()
// Graceful Shutdown
waitForShutdown(srv)
}
func waitForShutdown(srv *http.Server) {
interruptChan := make(chan os.Signal, 1)
signal.Notify(interruptChan, os.Interrupt, syscall.SIGINT, syscall.SIGTERM)
// Block until we receive our signal.
<-interruptChan
// Create a deadline to wait for.
ctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
defer cancel()
srv.Shutdown(ctx)
log.Println("Shutting down")
os.Exit(0)
}
func testURL(url string) (logStr string) {
logStr = fmt.Sprintf("\n%s\n", url)
var netClient = &http.Client{
Timeout: time.Second * 5,
}
resp, err := netClient.Get(url)
if err != nil {
return fmt.Sprintf("big problemo : %s\n", err)
}
defer resp.Body.Close()
if resp.StatusCode == http.StatusOK {
bodyBytes, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
bodyString := string(bodyBytes)
logStr += fmt.Sprintf("%s\n", bodyString)
}
logStr += fmt.Sprintf("Status Code : %d\n", resp.StatusCode)
logStr += fmt.Sprintf("Status Text : %s\n", resp.Status)
return logStr
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment