96 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			96 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
|   | // The MIT License (MIT) | ||
|  | // | ||
|  | // Copyright (c) 2016 Muhammed Thanish | ||
|  | // | ||
|  | // Permission is hereby granted, free of charge, to any person obtaining a copy | ||
|  | // of this software and associated documentation files (the "Software"), to deal | ||
|  | // in the Software without restriction, including without limitation the rights | ||
|  | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||
|  | // copies of the Software, and to permit persons to whom the Software is | ||
|  | // furnished to do so, subject to the following conditions: | ||
|  | // | ||
|  | // The above copyright notice and this permission notice shall be included in all | ||
|  | // copies or substantial portions of the Software. | ||
|  | // | ||
|  | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
|  | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
|  | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||
|  | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||
|  | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||
|  | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||
|  | // SOFTWARE. | ||
|  | 
 | ||
|  | package graphql | ||
|  | 
 | ||
|  | import ( | ||
|  | 	"bytes" | ||
|  | 	"fmt" | ||
|  | 	"net/http" | ||
|  | ) | ||
|  | 
 | ||
|  | // GraphiQL is an in-browser IDE for exploring GraphiQL APIs. | ||
|  | // This handler returns GraphiQL when requested. | ||
|  | // | ||
|  | // For more information, see https://github.com/graphql/graphiql. | ||
|  | type GraphiQL struct{} | ||
|  | 
 | ||
|  | func respond(w http.ResponseWriter, body []byte, code int) { | ||
|  | 	w.Header().Set("Content-Type", "application/json; charset=utf-8") | ||
|  | 	w.Header().Set("X-Content-Type-Options", "nosniff") | ||
|  | 	w.WriteHeader(code) | ||
|  | 	_, _ = w.Write(body) | ||
|  | } | ||
|  | 
 | ||
|  | func errorJSON(msg string) []byte { | ||
|  | 	buf := bytes.Buffer{} | ||
|  | 	fmt.Fprintf(&buf, `{"error": "%s"}`, msg) | ||
|  | 	return buf.Bytes() | ||
|  | } | ||
|  | 
 | ||
|  | func (h GraphiQL) ServeHTTP(w http.ResponseWriter, r *http.Request) { | ||
|  | 	if r.Method != "GET" { | ||
|  | 		respond(w, errorJSON("only GET requests are supported"), http.StatusMethodNotAllowed) | ||
|  | 		return | ||
|  | 	} | ||
|  | 
 | ||
|  | 	w.Write(graphiql) | ||
|  | } | ||
|  | 
 | ||
|  | var graphiql = []byte(` | ||
|  | <!DOCTYPE html> | ||
|  | <html> | ||
|  | 	<head> | ||
|  | 		<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/graphiql/0.11.11/graphiql.css"/> | ||
|  | 		<script src="https://cdnjs.cloudflare.com/ajax/libs/fetch/2.0.3/fetch.min.js"></script> | ||
|  | 		<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.2.0/umd/react.production.min.js"></script> | ||
|  | 		<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.2.0/umd/react-dom.production.min.js"></script> | ||
|  | 		<script src="https://cdnjs.cloudflare.com/ajax/libs/graphiql/0.11.11/graphiql.min.js"></script> | ||
|  | 	</head> | ||
|  | 	<body style="width: 100%; height: 100%; margin: 0; overflow: hidden;"> | ||
|  | 		<div id="graphiql" style="height: 100vh;">Loading...</div> | ||
|  | 		<script> | ||
|  | 			function fetchGQL(params) { | ||
|  | 				return fetch("/graphql", { | ||
|  | 					method: "post", | ||
|  | 					body: JSON.stringify(params), | ||
|  | 					credentials: "include", | ||
|  | 				}).then(function (resp) { | ||
|  | 					return resp.text(); | ||
|  | 				}).then(function (body) { | ||
|  | 					try { | ||
|  | 						return JSON.parse(body); | ||
|  | 					} catch (error) { | ||
|  | 						return body; | ||
|  | 					} | ||
|  | 				}); | ||
|  | 			} | ||
|  | 
 | ||
|  | 			ReactDOM.render( | ||
|  | 				React.createElement(GraphiQL, {fetcher: fetchGQL}), | ||
|  | 				document.getElementById("graphiql") | ||
|  | 			) | ||
|  | 		</script> | ||
|  | 	</body> | ||
|  | </html> | ||
|  | `) |