/**
Author: Mark George <mark.george@otago.ac.nz>
Warranty: None. Works for me. If it doesn't work for you then you already have the source code...
License: WTFPL v2 <http://www.wtfpl.net/txt/copying/>
*/
package main
// import (
// "flag"
// "fmt"
// "io/ioutil"
// "net/http"
// "net/http/httputil"
// "os"
// "strconv"
// )
// var (
// port int
// status int
// body string
// entire bool
// verbose bool
// server bool
// uri string
// accept string
// separator string
// cors bool
// )
// func requestHandler(resp http.ResponseWriter, req *http.Request) {
// if verbose {
// fmt.Printf("Received a %s request to %s\n", req.Method, req.RequestURI)
// }
// // print entire request
// if entire {
// dump, _ := httputil.DumpRequest(req, true)
// fmt.Println(string(dump[:]))
// // print only request body
// } else {
// body, _ := ioutil.ReadAll(req.Body)
// fmt.Println(string(body[:]))
// }
// // cors
// if cors && req.Method == http.MethodOptions {
// if verbose {
// fmt.Println("CORS preflight")
// }
// if origin := req.Header.Get("Origin"); origin != "" {
// resp.Header().Set("Access-Control-Allow-Origin", origin)
// if headers := req.Header.Get("Access-Control-Request-Headers"); headers != "" {
// resp.Header().Set("Access-Control-Allow-Headers", headers)
// }
// if method := req.Header.Get("Access-Control-Request-Method"); method != "" {
// resp.Header().Set("Access-Control-Allow-Method", method)
// }
// resp.WriteHeader(200)
// return
// } else {
// if verbose {
// fmt.Println("Preflight did not contain 'Origin' header!")
// }
// }
// }
// // send response
// if body != "" {
// if status == 204 {
// status = 200
// } // if we have a body then we don't want to return the default 204 status
// resp.WriteHeader(status)
// fmt.Fprintf(resp, body)
// } else {
// resp.WriteHeader(status)
// }
// if separator != "" {
// fmt.Println(separator)
// }
// }
// func startServer() {
// http.HandleFunc("/", requestHandler)
// if err := http.ListenAndServe(":"+strconv.Itoa(port), nil); err != nil {
// fmt.Fprintf(os.Stderr, "Could not start server. Is port %d available?\n", port)
// }
// }
// func parseCommandLine() {
// flag.IntVar(&port, "port", 8080, "")
// flag.IntVar(&port, "p", 8080, "")
// flag.IntVar(&status, "response", 204, "")
// flag.IntVar(&status, "r", 204, "")
// flag.StringVar(&body, "body", "", "")
// flag.StringVar(&body, "b", "", "")
// flag.BoolVar(&entire, "entire", false, "")
// flag.BoolVar(&entire, "e", false, "")
// flag.StringVar(&separator, "separator", "", "")
// flag.StringVar(&separator, "s", "", "")
// flag.BoolVar(&verbose, "verbose", false, "")
// flag.BoolVar(&verbose, "v", false, "")
// flag.StringVar(&accept, "accept", "", "")
// flag.StringVar(&accept, "a", "", "")
// flag.BoolVar(&cors, "cors", false, "")
// flag.BoolVar(&cors, "c", false, "")
// serverMode := flag.Bool("server", false, "")
// clientMode := flag.Bool("client", false, "")
// flag.Usage = usage
// flag.Parse()
// if !(*serverMode || *clientMode) || (*serverMode && *clientMode) {
// usage()
// os.Exit(1)
// } else {
// server = *serverMode
// }
// if *clientMode {
// uri = flag.Arg(0)
// if uri == "" {
// usage()
// os.Exit(1)
// }
// }
// }
// var usage = func() {
// fmt.Fprintf(os.Stderr, "Usage:\n")
// fmt.Fprintf(os.Stderr, "\n")
// fmt.Fprintf(os.Stderr, " Client mode\n")
// fmt.Fprintf(os.Stderr, " httpcat -client [options] http://uri-to-send-request-to.com\n")
// fmt.Fprintf(os.Stderr, "\n")
// fmt.Fprintf(os.Stderr, " Currently only supports GET requests.\n")
// fmt.Fprintf(os.Stderr, "\n")
// fmt.Fprintf(os.Stderr, " Server mode\n")
// fmt.Fprintf(os.Stderr, " httpcat -server [options]\n")
// fmt.Fprintf(os.Stderr, "\n")
// fmt.Fprintf(os.Stderr, " Options (either mode)\n")
// fmt.Fprintf(os.Stderr, " -entire or -e : Display entire request/response instead of just the body.\n")
// fmt.Fprintf(os.Stderr, " -verbose or -v : Be verbose.\n")
// fmt.Fprintf(os.Stderr, "\n")
// fmt.Fprintf(os.Stderr, " Options (client mode only)\n")
// fmt.Fprintf(os.Stderr, " -accept or -a [accept string] : Adds 'Accept' header to request.\n")
// fmt.Fprintf(os.Stderr, "\n")
// fmt.Fprintf(os.Stderr, " Options (server mode only)\n")
// fmt.Fprintf(os.Stderr, " -body or -b [body message] : Body to respond with. Response code will default to 200.\n")
// fmt.Fprintf(os.Stderr, " -port or -p [port] : Port to listen on.\n")
// fmt.Fprintf(os.Stderr, " -response or -r [response code] : Status code to respond with. Defaults to 204.\n")
// fmt.Fprintf(os.Stderr, " -cors or -c : Enable Cross Origin Resource Sharing support.\n")
// fmt.Fprintf(os.Stderr, " -separator or -s [separator string] : Use the provided separator to separate messages.\n")
// }
// func xmain() {
// parseCommandLine()
// if server {
// // server mode
// if verbose {
// fmt.Printf("Listening on port %d.\n", port)
// if entire {
// fmt.Println("Displaying entire request details.\n")
// } else {
// fmt.Println("Displaying bodies only.\n")
// }
// }
// startServer()
// } else {
// // client mode
// if verbose {
// fmt.Println("Sending GET request to " + uri)
// }
// sendRequest(uri)
// }
// }