summary refs log blame commit diff stats
path: root/svc/post.go
blob: 90508591c43a6c79347831aa96f919dc9e13dcd2 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
                                                      














                                                             
                                                                                                         

                      
 


                                       
                                                                                           






                                                           
                                                                                                              


                      

                               


                                                                           
 
                                                                            


                                                                                                                                    
                 
 


                                                                         
 



                                                                                                                       
 






                                                                          
 
package svc // import "github.com/getwtxt/getwtxt/svc"

import (
	"fmt"
	"net/http"

	"github.com/getwtxt/registry"
)

// Requests to apiEndpointPOSTHandler are passed off to this
// function. apiPostUser then fetches the twtxt data, then if
// it's an individual user's file, adds it. If it's registry
// output, it scrapes the users/urls/statuses from the remote
// registry before adding each user to the local cache.
func apiPostUser(w http.ResponseWriter, r *http.Request) {
	if err := r.ParseForm(); err != nil {
		errHTTP(w, r, fmt.Errorf("error parsing values: %v", err.Error()), http.StatusBadRequest)
		return
	}

	nick := r.FormValue("nickname")
	urls := r.FormValue("url")
	if nick == "" || urls == "" {
		errHTTP(w, r, fmt.Errorf("nickname or URL missing"), http.StatusBadRequest)
		return
	}

	uip := getIPFromCtx(r.Context())

	out, remoteRegistry, err := registry.GetTwtxt(urls)
	if err != nil {
		errHTTP(w, r, fmt.Errorf("error fetching twtxt Data: %v", err.Error()), http.StatusBadRequest)
		return
	}

	switch remoteRegistry {
	case true:
		remoteRegistries.Mu.Lock()
		remoteRegistries.List = append(remoteRegistries.List, urls)
		remoteRegistries.Mu.Unlock()

		if err := twtxtCache.CrawlRemoteRegistry(urls); err != nil {
			errHTTP(w, r, fmt.Errorf("error crawling remote registry: %v", err.Error()), http.StatusInternalServerError)
		} else {
			log200(r)
		}

	case false:
		statuses, err := registry.ParseUserTwtxt(out, nick, urls)
		errLog("Error Parsing User Data: ", err)

		if err := twtxtCache.AddUser(nick, urls, "", uip, statuses); err != nil {
			errHTTP(w, r, fmt.Errorf("error adding user to cache: %v", err.Error()), http.StatusBadRequest)
			return
		}

		_, err = w.Write([]byte(fmt.Sprintf("200 OK\n")))
		if err != nil {
			errHTTP(w, r, err, http.StatusInternalServerError)
		} else {
			log200(r)
		}
	}
}
class="mh">#00a0a0; } .Delimiter { color: #800080; } .Identifier { color: #c0a020; } .Normal { color: #aaaaaa; background-color: #080808; padding-bottom: 1px; } .Comment { color: #9090ff; } .Comment a { color:#0000ee; text-decoration:underline; } --> </style> <script type='text/javascript'> <!-- /* function to open any folds containing a jumped-to line before jumping to it */ function JumpToLine() { var lineNum; lineNum = window.location.hash; lineNum = lineNum.substr(1); /* strip off '#' */ if (lineNum.indexOf('L') == -1) { lineNum = 'L'+lineNum; } lineElem = document.getElementById(lineNum); /* Always jump to new location even if the line was hidden inside a fold, or * we corrected the raw number to a line ID. */ if (lineElem) { lineElem.scrollIntoView(true); } return true; } if ('onhashchange' in window) { window.onhashchange = JumpToLine; } --> </script> </head> <body onload='JumpToLine();'> <pre id='vimCodeElement'> <span id="L1" class="LineNr"> 1 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span> <span id="L2" class="LineNr"> 2 </span>REAL_RANDOM<span class="Delimiter">,</span> <span id="L3" class="LineNr"> 3 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span> <span id="L4" class="LineNr"> 4 </span><a href='001help.cc.html#L221'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;real-random&quot;</span><span class="Delimiter">,</span> REAL_RANDOM<span class="Delimiter">);</span> <span id="L5" class="LineNr"> 5 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span> <span id="L6" class="LineNr"> 6 </span><span class="Normal">case</span> REAL_RANDOM: <span class="Delimiter">{</span> <span id="L7" class="LineNr"> 7 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L8" class="LineNr"> 8 </span><span class="Delimiter">}</span> <span id="L9" class="LineNr"> 9 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span> <span id="L10" class="LineNr">10 </span><span class="Normal">case</span> REAL_RANDOM: <span class="Delimiter">{</span> <span id="L11" class="LineNr">11 </span> <span class="Comment">// todo: limited range of numbers, might be imperfectly random</span> <span id="L12" class="LineNr">12 </span> <span class="Comment">// todo: thread state in extra ingredients and products</span> <span id="L13" class="LineNr">13 </span> products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span> <span id="L14" class="LineNr">14 </span> products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span>rand<span class="Delimiter">());</span> <span id="L15" class="LineNr">15 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L16" class="LineNr">16 </span><span class="Delimiter">}</span> <span id="L17" class="LineNr">17 </span> <span id="L18" class="LineNr">18 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span> <span id="L19" class="LineNr">19 </span>MAKE_RANDOM_NONDETERMINISTIC<span class="Delimiter">,</span> <span id="L20" class="LineNr">20 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span> <span id="L21" class="LineNr">21 </span><a href='001help.cc.html#L221'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;make-random-nondeterministic&quot;</span><span class="Delimiter">,</span> MAKE_RANDOM_NONDETERMINISTIC<span class="Delimiter">);</span> <span id="L22" class="LineNr">22 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span> <span id="L23" class="LineNr">23 </span><span class="Normal">case</span> MAKE_RANDOM_NONDETERMINISTIC: <span class="Delimiter">{</span> <span id="L24" class="LineNr">24 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L25" class="LineNr">25 </span><span class="Delimiter">}</span> <span id="L26" class="LineNr">26 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span> <span id="L27" class="LineNr">27 </span><span class="Normal">case</span> MAKE_RANDOM_NONDETERMINISTIC: <span class="Delimiter">{</span> <span id="L28" class="LineNr">28 </span> srand<span class="Delimiter">(</span>time<span class="Delimiter">(</span><span class="Constant">NULL</span><span class="Delimiter">));</span> <span id="L29" class="LineNr">29 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L30" class="LineNr">30 </span><span class="Delimiter">}</span> <span id="L31" class="LineNr">31 </span> <span id="L32" class="LineNr">32 </span><span class="Comment">// undo non-determinism in later tests</span> <span id="L33" class="LineNr">33 </span><span class="Delimiter">:(before &quot;End Reset&quot;)</span> <span id="L34" class="LineNr">34 </span>srand<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span> </pre> </body> </html> <!-- vim: set foldmethod=manual : -->