1
+ package main
2
+ import (
3
+ "encoding/json"
4
+ "log"
5
+ "net/http"
6
+ "io/ioutil"
7
+ "strconv"
8
+ "fmt"
9
+
10
+
11
+ "github.com/gorilla/mux"
12
+ )
13
+
14
+
15
+ //struct used to send the id of the message in json format
16
+ type messageID struct {
17
+ Id int `json:"id"`
18
+ }
19
+
20
+
21
+ //Store for the Messages
22
+ var msgStore = make (map [string ]string )
23
+
24
+ //int used as key into message store
25
+ var idSeq int = 0
26
+
27
+ //==============================================================================
28
+ // Struct Error handling
29
+ type ErrorMessage struct {
30
+ Status string `json:"status"`
31
+ Message string `json:"error_message"`
32
+ }
33
+
34
+ func genericErrorHandler (w http.ResponseWriter , r * http.Request ) {
35
+ if p := recover (); p != nil {
36
+ s := fmt .Sprintf ("internal error>> %s" , p )
37
+ e := & ErrorMessage {Status :"error occured" ,Message : s }
38
+ writeErrorResponse (w , e ,http .StatusInternalServerError )
39
+ }
40
+
41
+ }
42
+ func writeErrorResponse (w http.ResponseWriter ,e * ErrorMessage , status int ) {
43
+ j , err := json .Marshal (e )
44
+ if err != nil {
45
+ panic (err )
46
+ }
47
+ fmt .Printf (e .Status ,e .Message )
48
+ w .Header ().Set ("Content-Type" , "application/json" )
49
+ w .WriteHeader (status )
50
+ w .Write (j )
51
+ }
52
+ //==============================================================================
53
+
54
+
55
+ //POST method handler
56
+ func PostMsgHandler (w http.ResponseWriter , r * http.Request ) {
57
+ defer genericErrorHandler (w ,r )
58
+
59
+ msgReader := http .MaxBytesReader (w ,r .Body ,4096 ) //Limit the max number of chars in message
60
+ reqDump , err := ioutil .ReadAll (msgReader )
61
+
62
+ if err != nil {
63
+ panic (fmt .Sprintf ("PostMsgHandler:[Max content length 4096] err[%s]" , err ))
64
+ }
65
+
66
+ msgContent := string (reqDump [:])
67
+ idSeq ++
68
+ k := strconv .Itoa (idSeq )
69
+ msgStore [k ] = msgContent
70
+
71
+ log .Printf ("Received message %d => %s" , idSeq , msgContent )
72
+ resp := & messageID {idSeq }
73
+ j , err := json .Marshal (resp )
74
+ if err != nil {
75
+ panic (err )
76
+ }
77
+ w .Header ().Set ("Content-Type" , "application/json" )
78
+ w .WriteHeader (http .StatusCreated )
79
+ w .Write (j )
80
+ }
81
+
82
+
83
+ //HTTP GET - /messages/{id}
84
+ func GetMsgHandler (w http.ResponseWriter , r * http.Request ) {
85
+ defer genericErrorHandler (w ,r )
86
+ vars := mux .Vars (r )
87
+ k := vars ["id" ]
88
+ log .Printf ("key %s" ,k )
89
+ if msgContent , ok := msgStore [k ]; ok {
90
+ log .Printf ("Key found [%s]=>[%s]" ,k ,msgContent )
91
+ w .WriteHeader (http .StatusOK )
92
+ fmt .Fprintf (w , msgContent ) // Escape HTML special chars
93
+ } else {
94
+ log .Printf ("Key Not found %s" ,k )
95
+ w .WriteHeader (http .StatusNotFound )
96
+ }
97
+
98
+ }
99
+
100
+ //Entry point of the program
101
+ func main () {
102
+
103
+ r := mux .NewRouter ().StrictSlash (false )
104
+ r .HandleFunc ("/messages/{id}" , GetMsgHandler ).Methods ("GET" )
105
+ r .HandleFunc ("/messages" , PostMsgHandler ).Methods ("POST" )
106
+
107
+ server := & http.Server {
108
+ Addr : ":8080" ,
109
+ Handler : r ,
110
+ }
111
+ log .Println ("Listening..." )
112
+ server .ListenAndServe ()
113
+ }
0 commit comments