root index SignPuddle 3 API https://signpuddle.com/server line > v3.0.0 line line Welcome to the SignPuddle 3 API. line The API is defined with two types of source, two types of documentation, and a live page of HTML and JavaScript. line line + Source: [ApiTxt format](../src/index.txt) and [JSON objects](../src/index.json) line + Documents: [API Blueprint](../doc/index.md) and [Stand Alone HTML](../doc/index.htm) line + Live Page: [API Interface](../api/index.html) and [JavaScript](../api/index.js) line line The API is divided into several sections. line This main document includes all of the sections. line Each section is available separately as well. line line ## HTTP Request Methods line line The SignPuddle 3 server accepts HTTP request methods of GET, POST, PUT, and DELETE. line + GET - retrieve information without altering the server line + POST - add information to the server with each request line + PUT - update information on the server line + DELETE - remove information on the server. line ## HTTP Response Statuses line line The SignPuddle 3 server responds with status codes. line line ### Success Codes line line + 200 OK line + 201 Created line + 202 Accepted line + 204 No Content line line ### Redirect Codes line line + 300 Multiple Choices line + 304 No Modified line + 307 Temporary Redirect line + 308 Permanent Redirect line line ### Client Error Codes line line + 400 Bad Request line + 403 Forbidden line + 404 Not Found line + 409 Conflict line + 429 Too Many Requests line line ### Server Error Codes line line + 500 Internal Server Error line + 501 Not Implemented line + 503 Service Unavailable line line ## HTTP Headers line line Headers pass additional information about the request or response. line line ### Headers line line + Content-Type - the MIME type of the response line + ETag - an entity tag used to validate cached values line + Expires - date after which response is stale line + Location - used for redirect or for newly created resource line + If-None-Match - request header compared to ETag value, response status 304 if matching line + If-Modified-Since - request header, causes response status 304 if unmodified line + Last-Modified - response header, used with If-Modified-Since request header line group user SignPuddle 3 collections are organized by country and language codes line + Source: [ApiTxt format](../src/user.txt) and [JSON objects](../src/user.json) line + Documents: [API Blueprint](../doc/user.md) and [Stand Alone HTML](../doc/user.htm) line + Live Page: [API Interface](../api/user.html) and [JavaScript](../api/user.js) route /user/who Who uses SignWriting? List of countries with size and activity. method GET Retrieve country list The available countries where signs are available. request user-who response 200 text/plain body BR body US route /user/pass User pass A string for accounting and validation method POST String for accounting and validation code echo json_pretty(userPass()); request user pass response 200 text/plain body {"pass": "90c19ce2076db097c75b3406e966a6b6","ip": "192.168.254.2"} method PUT Check pass against user code $data = $app->request->getbody(); code $data = json_decode($data,true); code verifyPass($data['username'],$data['pass']); code $app->response->setStatus(204); code return; request user pass verify line + Attributes line + username: anonymous (string) - name of the user line + pass: af77... (string) - pass for session validation body {"username":"anonymous","pass":"af77..."} response 204 route /user/login User login Validation of user with validated password method PUT Process log in to server code $data = $app->request->getbody(); code $data = json_decode($data,true); code $results = userVerify($data['username'],$data['pass'],$data['validated']); code echo json_pretty($results); request verify user application/json line + Attributes line + username: anonymous (string) - name of the user line + pass: af77... (string) - pass for session validation line + validated: 2793f... (string) - validated pass mixed with password body {"username":"anonymous","pass":"af77...","validated":"2793f..."} response 200 application/json line response text here body {"user-profile":""} route /user/{name} User profile User details parameter name slevinski string The name of a user method PUT Update user profile Updates the profile of the user code $headers = getHeaders(); code $pass = isset($headers['Pass'])?$headers['Pass']:''; code $user = userVerified($pass); code if ($user!=$name) haltForbidden($user . " not " . $name); code $data = $app->request->getbody(); code $data = json_decode($data,true); code userProfileUpdate($name,$data); code $app->response->setStatus(204); code return; request user-update header Pass 5ffab638bde372b4fa63bb6f8484595d response 204 method POST Register new user Creates and returns a new user request user-add header Pass 5ffab638bde372b4fa63bb6f8484595d response 200 text/plain body profile created and returned route /user/{name}/password User password User password resource parameter name slevinski string The name of a user method POST Update user password Updates the password of the user code $headers = getHeaders(); code $pass = isset($headers['Pass'])?$headers['Pass']:''; code $user = userVerified($pass,true); code if (!$user) haltForbidden(); code $data = $app->request->getbody(); code $data = json_decode($data,true); code $old = isset($data['old'])?$data['old']:''; code $new = isset($data['new'])?$data['new']:''; code if ($old && $new){ code userPasswordUpdate($name,$old,$new); code $app->response->setStatus(204); code return; code } else { code haltBadRequest(); code } request user-update-password plain/text header Pass 5ffab638bde372b4fa63bb6f8484595d body {"old":"149603e6c03516362a8da23f624db945","new":"22af645d1859cb5ca6da0c484f1f37ea"} response 204 method PUT Reset user password Creates a temporary password for the user code $headers = getHeaders(); code $pass = isset($headers['Pass'])?$headers['Pass']:''; code $user = userVerified($pass,true); code if (!$user) haltForbidden(); code $data = $app->request->getbody(); code $data = json_decode($data,true); code $user = isset($data['user'])?$data['user']:''; code if ($user){ code userPasswordReset($user); code $app->response->setStatus(204); code return; code } else { code haltBadRequest(); code } request user-password-reset plain/text header Pass 5ffab638bde372b4fa63bb6f8484595d response 204 route /user/email User email requests Requests for email of username or password reset method GET List of user email requests User email requests for username or passwords code $headers = getHeaders(); code $pass = isset($headers['Pass'])?$headers['Pass']:''; code rightscheck("",$pass,SP_ADMIN); code $users = userEmailRequests(); code echo json_pretty($users); code return; request user-email-request header Pass 5ffab638bde372b4fa63bb6f8484595d response 200 text/plain body [{"name":"slevinski","email":"slevinski@signwriting.org","temp":"username"}] route /user/email/{email} Username lookup Forgot username email lookup parameter email slevinski@signwriting.org string The email for a user method PUT Lookup username Creates a request for email of username code $headers = getHeaders(); code $pass = isset($headers['Pass'])?$headers['Pass']:''; code $user = userVerified($pass,true); code if (!$user) haltForbidden(); code userNameLookup($email); code $app->response->setStatus(204); code return; request user-name-lookup header Pass 5ffab638bde372b4fa63bb6f8484595d response 204 group collection Resources related to collections in general line + Source: [ApiTxt format](../src/collection.txt) and [JSON objects](../src/collection.json) line + Documents: [API Blueprint](../doc/collection.md) and [Stand Alone HTML](../doc/collection.htm) line + Live Page: [API Interface](../api/collection.html) and [JavaScript](../api/collection.js) route /collection{?name} Collections available parameter name sp3 string partial collection name method GET Get available collections code $collections = collectionListing($name); code if (count($collections)){ code echo json_pretty($collections); code } else { code $app->response->setStatus(204); code } code return; response 200 text/plain body ["en-US-interface-sp3"] route /collection/{name} Collection resource Specific collection parameter name `en-US-interface-sp3` string The name of a collection method DELETE delete collection code $err = invalidName($name); code if ($err){ code haltBadRequest($err); code } code $headers = getHeaders(); code $pass = isset($headers['Pass'])?$headers['Pass']:''; code collectionDelete($name,$pass); code collectionSecurityDelete($name,$pass); code collectionManageDelete($name,$pass); code $app->response->setStatus(204); request the removal of a collection header Pass 5ffab638bde372b4fa63bb6f8484595d response 204 route /collection/{name}/entry/{ik}/image/{num} Collection entry image resource Specific image for collection entry parameter name `ase-US-dictionary-public` string The name of an dictionary parameter ik 11244 string An id number or key string parameter num 1 string The image number of 1 thru 4 method PUT update image for collection entry code $err = invalidName($name); code if ($err){ code haltBadRequest($err); code } code $headers = getHeaders(); code $pass = isset($headers['Pass'])?$headers['Pass']:''; code $data = $app->request->getbody(); code $data = json_decode($data,true); code collectionImageUpdate($name,$ik,$num,$data,$pass); code $app->response->setStatus(204); code return; request an update for an existing dictionary entry application/json header Pass 724fd4b4438fba9d0c5ab89d0833e5c9 body { body "file": "name.png", body "data": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEASABIAAD..." body } response 204 method DELETE remove dictionary entry code $err = invalidName($name); code if ($err){ code haltBadRequest($err); code } code $headers = getHeaders(); code $pass = isset($headers['Pass'])?$headers['Pass']:''; code collectionImageDelete($name,$ik,$num,$pass); code $app->response->setStatus(204); request the removal of a collection entry image header Pass 724fd4b4438fba9d0c5ab89d0833e5c9 response 204 route /collection/{name}/stats Collection statistics Statistics about the collection parameter name `ase-US-dictionary-public` required,string The name of a dictionary method GET Get collection statistics code $headers = getHeaders(); code $pass = isset($headers['Pass'])?$headers['Pass']:''; code rightsCheck($name,$pass,SP_VIEW); code $check = isset($headers['If-Modified-Since'])?$headers['If-Modified-Since']:''; code $err = invalidName($name); code if ($err){ code haltBadRequest($err); code } code $lastModified = lastModified($name); code if ($lastModified <= $check){ code haltNotModified(); code } code header('Last-Modified: ' . $lastModified); code $output = json_pretty(collectionStats($name)); code $searchTime = searchtime($timein); code header("Search-Time: " . $searchTime); code echo $output; request collections statistics header If-Modified-Since 2019-01-16T16:56:19.175Z response 200 text/plain body [{"name": "en-US-interface-sp3","code": "ui1","title": "English Interface for SignPuddle 3","user": "slevinski","created_at": "","view_pass": 0,"add_pass": 1,"edit_pass": 1,"register_level": 0,"upload_level": 4}] route /collection/security Collections security Security settings for all collections method GET Get collections security code $headers = getHeaders(); code $check = isset($headers['If-Modified-Since'])?$headers['If-Modified-Since']:''; code $lastModified = lastModifiedCollection(); code if ($lastModified <= $check){ code haltNotModified(); code } code header('Last-Modified: ' . $lastModified); code echo json_pretty(collectionsSecurity()); request collections security header If-Modified-Since 2019-01-16T16:56:19.175Z response 200 text/plain body [{"name": "en-US-interface-sp3","code": "ui1","title": "English Interface for SignPuddle 3","user": "slevinski","created_at": "","view_pass": 0,"add_pass": 1,"edit_pass": 1,"register_level": 0,"upload_level": 4}] route /collection/{name}/security Collection security Details about the collection security parameter name `en-US-interface-sp3` required,string The name of the collection method GET retrieve collection security code $err = invalidName($name); code if ($err){ code haltBadRequest($err); code } code echo json_pretty(collectionSecurity($name)); request interface security response 200 text/plain body {"name": "en-US-interface-sp3","code": "ui1","title": "English Interface for SignPuddle 3","user": "slevinski","created_at": "","view_pass": 0,"add_pass": 1,"edit_pass": 1,"register_level": 0,"upload_level": 4} method PUT Update collection security code $err = invalidName($name); code if ($err){ code haltBadRequest($err); code } code $headers = getHeaders(); code $pass = isset($headers['Pass'])?$headers['Pass']:''; code $data = $app->request->getbody(); code $data = json_decode($data,true); code collectionSecurityUpdate($name,$data,$pass); code $app->response->setStatus(204); code return; request an update for an existing entry text/plain header Pass 5ffab638bde372b4fa63bb6f8484595d body {"name": "en-US-interface-sp3","code": "ui1","title": "English Interface for SignPuddle 3","user": "slevinski","created_at": "","view_pass": 0,"add_pass": 1,"edit_pass": 1,"register_level": 0,"upload_level": 4} response 204 method DELETE Remove security for collection code $err = invalidName($name); code if ($err){ code haltBadRequest($err); code } code $headers = getHeaders(); code $pass = isset($headers['Pass'])?$headers['Pass']:''; code collectionSecurityDelete($name,$pass); code $app->response->setStatus(204); request the deletion of collection security header Pass 5ffab638bde372b4fa63bb6f8484595d response 204 route /collection/{name}/users Collection users parameter name `ase-US-dictionary-public` string collection name method GET Get collection users code $err = invalidName($name); code if ($err){ code haltBadRequest($err); code } code echo json_pretty(collectionUsers($name)); response 200 text/plain body [{"user": "test_user","security": 3}] route /collection/manage/unknown Management for unknown collections method GET Get list of unknown collections with user management code echo json_pretty(collectionManageUnknown()); response 200 text/plain body ["es-US-interface-sp3"] route /collection/{name}/manage Collection users management parameter name `ase-US-dictionary-public` string collection name method GET Get collection management code $err = invalidName($name); code if ($err){ code haltBadRequest($err); code } code $headers = getHeaders(); code $pass = isset($headers['Pass'])?$headers['Pass']:''; code echo json_pretty(collectionUsersDetail($name,$pass)); request collection management header Pass 5ffab638bde372b4fa63bb6f8484595d response 200 text/plain body [{"name": "test_user","display": "Test Editor","email": "testing@gmail.com","security": 3}] method PUT Update collection management code $err = invalidName($name); code if ($err){ code haltBadRequest($err); code } code $headers = getHeaders(); code $pass = isset($headers['Pass'])?$headers['Pass']:''; code $data = $app->request->getbody(); code $data = json_decode($data,true); code collectionManageUpdate($name,$data,$pass); code $app->response->setStatus(204); code return; request an update for collection management header Pass 5ffab638bde372b4fa63bb6f8484595d body {"user":"slevinski","security":4} response 204 method DELETE Remove user management for collection code $err = invalidName($name); code if ($err){ code haltBadRequest($err); code } code $headers = getHeaders(); code $pass = isset($headers['Pass'])?$headers['Pass']:''; code collectionManageDelete($name,$pass); code $app->response->setStatus(204); request the removal of user management for a collection header Pass 5ffab638bde372b4fa63bb6f8484595d response 204 route /collection/{name}/manage/{user} Collection user parameter name `ase-US-dictionary-public` string collection name parameter user `slevinski` string user name method DELETE Remove user from collection management code $err = invalidName($name); code if ($err){ code haltBadRequest($err); code } code $headers = getHeaders(); code $pass = isset($headers['Pass'])?$headers['Pass']:''; code collectionManageRemove($name,$user,$pass); code $app->response->setStatus(204); request the removal of a user from collection management header Pass 5ffab638bde372b4fa63bb6f8484595d response 204 route /collection/{name}/request/{source} Collection Request Copy parameter name `es-US-interface-sp3` required,string The name of the new collection parameter source `en-US-interface-sp3` required,string The name of the source collection method POST request the creation of a new collection code $headers = getHeaders(); code $pass = isset($headers['Pass'])?$headers['Pass']:''; code $user = userVerified($pass); code if (!$user) haltForbidden(); code rightsCheck($source,$pass,SP_VIEW); code $err = invalidName($source); code if ($err){ code haltBadRequest($err); code } code $parts = explode("-",$source); code $err = invalidName($name,$parts[2]); code if ($err){ code haltBadRequest($err); code } code $dir = 'data/db/'; code $infile = $dir . $source . ".db"; code $outfile = $dir . $name . ".db"; code if (!file_exists($infile)) haltBadRequest('Source collection does not exist: ' . $source); code if (file_exists($outfile)) haltBadRequest('Collection already exists: ' . $name); code if (copy($infile,$outfile)){ code $data = array(); code $data["user"] = $user; code $data["security"] = SP_EDIT; code collectionManageUpdate($name,$data,$pass,true); code code $data = $app->request->getbody(); code $data = json_decode($data,true); code $title = isset($data['title'])?$data['title']:'New Collection'; code $data = array(); code $data["title"] = $title; code $data["user"] = "admin"; code $data["view_pass"] = 0; code $data["add_pass"] = 1; code $data["edit_pass"] = 1; code $data["register_level"] = 0; code $data["upload_level"] = 4; code collectionSecurityUpdate($name,$data,$pass,true); code $app->response->setStatus(204); code return; code } else { code haltForbidden(); code } request new collection from source header Pass 5ffab638bde372b4fa63bb6f8484595d response 204 group interface Resources related to interface collections line + Source: [ApiTxt format](../src/interface.txt) and [JSON objects](../src/interface.json) line + Documents: [API Blueprint](../doc/interface.md) and [Stand Alone HTML](../doc/interface.htm) line + Live Page: [API Interface](../api/interface.html) and [JavaScript](../api/interface.js) route /interface{?name} Interfaces available parameter name sp3 string partial interface name method GET Get available interfaces code $dir = 'data/db/'; code $ext = '.db'; code $out = []; code if ($name){ code if (strpos($name,"interface")!==false){ code $interfaces = $dir . '*' . $name . '*' . $ext; code $files = glob($interfaces); code } else { code $interfaces = $dir . '*interface*' . $name . '*' . $ext; code $files = glob($interfaces); code if (count($files)==0) { code $interfaces = $dir . '*' . $name . '*interface*' . $ext; code $files = glob($interfaces); code } code } code } else { code $interfaces = $dir . '*interface*' . $ext; code $files = glob($interfaces); code } code foreach ($files as $filename) { code $out[] = str_replace($ext,'',str_replace($dir,'',$filename)); code } code if (count($out)){ code echo json_pretty($out); code } else { code $app->response->setStatus(204); code } code return; response 200 text/plain body ["en-US-interface-sp3"] route /interface/{name}{?update} Interface resource Access to available interfaces parameter name `en-US-interface-sp3` required,string The name of an interface parameter update 1 optional,number Forces a rewrite of the interface for json and txt formats method GET retrieve interface code $headers = getHeaders(); code $pass = isset($headers['Pass'])?$headers['Pass']:''; code rightsCheck($name,$pass,SP_VIEW); code $check = isset($headers['If-Modified-Since'])?$headers['If-Modified-Since']:''; code if (strpos($name,'.')){ code $parts = explode('.',$name); code $name = $parts[0]; code $format = $parts[1]; code if (!in_array($format,['db','txt','json'])){ code haltNotFound(); code } code } else { code $format = 'json'; code } code $dir = 'data/' . $format . '/'; code $ext = '.' . $format; code $file = $dir . $name . $ext; code $err = invalidName($name); code if ($err){ code $files = glob('data/db/' . $name . '*interface-sp3.db'); code if (count($files)==0){ code haltBadRequest($err); code } else { code $name = str_replace(".db",'',str_replace('data/db/','',$files[0])); code } code } code $lastModified = lastModified($name); code if ($lastModified <= $check && !$update){ code haltNotModified(); code } code if ($format=='json' && (!file_exists($file) || $update)) { code $json = interface2json($name); code file_put_contents($file,$json); code } else if ($format=='txt' && (!file_exists($file) || $update)) { code $txt = interface2txt($name); code file_put_contents($file,$txt); code } code if(file_exists($file)) { code header('Last-Modified: ' . $lastModified); code $searchTime = searchtime($timein); code header("Search-Time: " . $searchTime); code getFile($file); code } else { code haltNotFound(); code } request interface text header If-Modified-Since 2019-01-16T16:56:19.175Z response 200 text/plain body print.buttons.mainmessagedescriptionicon route /interface/{name}/key Interface keys Access to interface keys parameter name `en-US-interface-sp3` required,string The name of an interface method GET retrieve interface keys code $headers = getHeaders(); code $pass = isset($headers['Pass'])?$headers['Pass']:''; code $check = isset($headers['If-Modified-Since'])?$headers['If-Modified-Since']:''; code $err = invalidName($name); code if ($err){ code haltBadRequest($err); code } code $lastModified = lastModified($name); code if ($lastModified <= $check){ code haltNotModified(); code } code header('Last-Modified: ' . $lastModified); code echo json_pretty(interfaceKeys($name,$pass)); request interface keys header If-Modified-Since 2019-01-16T16:56:19.175Z header Pass 724fd4b4438fba9d0c5ab89d0833e5c9 response 200 text/plain body ["print.buttons.main"] route /interface/{name}/search/{text} Interface entries search Search interface for text parameter name `en-US-interface-sp3` required,string The name of an interface parameter text `SignPuddle` required,string The text for searching method GET retrieve matching entries code $headers = getHeaders(); code $pass = isset($headers['Pass'])?$headers['Pass']:''; code $err = invalidName($name); code if ($err){ code haltBadRequest($err); code } code echo json_pretty(interfaceSearch($name,$text,$pass)); request matching interface entries header Pass 724fd4b4438fba9d0c5ab89d0833e5c9 response 200 text/plain body [ body { body "key": "print.buttons.main", body "message": "Print it!" body } body ] route /interface/{name}/entry Interface entry resource Entries for interface parameter name `en-US-interface-sp3` string The name of an interface method POST add interface entry code $headers = getHeaders(); code $pass = isset($headers['Pass'])?$headers['Pass']:''; code if (!$pass){ code haltForbidden(); code } code $err = invalidName($name); code if ($err){ code haltBadRequest($err); code } code $data = $app->request->getbody(); code $data = json_decode($data,true); code interfaceEntryNew($name,$data,$pass); code $app->response->setStatus(201); code return; request add new interface entry application/json header Pass 724fd4b4438fba9d0c5ab89d0833e5c9 body {"key":"new.key.one", "message":"UI text","description":"about the text","icon":"search"} response 201 text/plain body ... route /interface/{name}/entry/{key} Interface entry resource for key Specific entries for interface parameter name `en-US-interface-sp3` string The name of an interface parameter key system.button.open string The name of an interface key method GET retrieve interface entry code $headers = getHeaders(); code $pass = isset($headers['Pass'])?$headers['Pass']:''; code $check = isset($headers['If-Modified-Since'])?$headers['If-Modified-Since']:''; code $err = invalidName($name); code if ($err){ code haltBadRequest($err); code } code $entries = interfaceKeySearch($name,$key,$pass); code if (!$entries){ code haltNoContent(); code } code $lastModified = max(array_map(function($o) {return $o->updated_at;},$entries)); code if ($lastModified <= $check){ code haltNotModified(); code } code header('Last-Modified: ' . $lastModified); code echo json_pretty($entries); request an interface entry header If-Modified-Since 2019-01-16T16:56:19.175Z header Pass 724fd4b4438fba9d0c5ab89d0833e5c9 response 200 text/plain body ... method PUT update interface entry code $err = invalidName($name); code if ($err){ code haltBadRequest($err); code } code $headers = getHeaders(); code $pass = isset($headers['Pass'])?$headers['Pass']:''; code $data = $app->request->getbody(); code $data = json_decode($data,true); code interfaceEntryUpdate($name,$key,$data,$pass); code $app->response->setStatus(204); code return; request an update for an existing entry header Pass 724fd4b4438fba9d0c5ab89d0833e5c9 body {"key":"new.key.one", "message":"UI text","description":"about the text","icon":"search"} response 204 method DELETE remove interface entry code $err = invalidName($name); code if ($err){ code haltBadRequest($err); code } code $headers = getHeaders(); code $pass = isset($headers['Pass'])?$headers['Pass']:''; code interfaceEntryDelete($name,$key,$pass); code $app->response->setStatus(204); request the removal of an interface entry header Pass 724fd4b4438fba9d0c5ab89d0833e5c9 response 204 group dictionary Resources related to dictionary collections line + Source: [ApiTxt format](../src/dictionary.txt) and [JSON objects](../src/dictionary.json) line + Documents: [API Blueprint](../doc/dictionary.md) and [Stand Alone HTML](../doc/dictionary.htm) line + Live Page: [API Dictionary](../api/dictionary.html) and [JavaScript](../api/dictionary.js) route /dictionary{?name} Dictionaries available parameter name public string partial dictionary name method GET Get available dictionaries code $dir = 'data/db/'; code $ext = '.db'; code $out = []; code if ($name){ code if (strpos($name,"dictionary")!==false){ code $dictionaries = $dir . '*' . $name . '*' . $ext; code $files = glob($dictionaries); code } else { code $dictionaries = $dir . '*dictionary*' . $name . '*' . $ext; code $files = glob($dictionaries); code if (count($files)==0) { code $dictionaries = $dir . '*' . $name . '*dictionary*' . $ext; code $files = glob($dictionaries); code } code } code } else { code $dictionaries = $dir . '*dictionary*' . $ext; code $files = glob($dictionaries); code } code foreach ($files as $filename) { code $out[] = str_replace($ext,'',str_replace($dir,'',$filename)); code } code if (count($out)){ code echo json_pretty($out); code } else { code $app->response->setStatus(204); code } code return; response 200 text/plain body ["ase-US-dictionary-public"] route /dictionary/{name}{?update} Dictionary resource Access to available dictionaries parameter name `ase-US-dictionary-public` required,string The name of an dictionary parameter update 1 optional,number Forces a rewrite of the dictionary for json and txt formats method GET retrieve dictionary code $headers = getHeaders(); code $pass = isset($headers['Pass'])?$headers['Pass']:''; code rightsCheck($name,$pass,SP_VIEW); code $check = isset($headers['If-Modified-Since'])?$headers['If-Modified-Since']:''; code if (strpos($name,'.')){ code $parts = explode('.',$name); code $name = $parts[0]; code $format = $parts[1]; code if (!in_array($format,['db','txt','json'])){ code haltNotFound(); code } code } else { code $format = 'json'; code } code $dir = 'data/' . $format . '/'; code $ext = '.' . $format; code $file = $dir . $name . $ext; code $err = invalidName($name); code if ($err){ code haltBadRequest($err); code } code $lastModified = lastModified($name); code if ($lastModified <= $check && !$update){ code haltNotModified(); code } code if ($format=='json' && (!file_exists($file) || $update)) { code $json = dictionary2json($name); code file_put_contents($file,$json); code } else if ($format=='txt' && (!file_exists($file) || $update)) { code $txt = dictionary2txt($name); code file_put_contents($file,$txt); code } code if(file_exists($file)) { code header('Last-Modified: ' . $lastModified); code $searchTime = searchtime($timein); code header("Search-Time: " . $searchTime); code getFile($file); code } else { code haltNotFound(); code } request dictionary text header If-Modified-Since 2019-01-16T16:56:19.175Z response 200 text/plain body 1𝠀ρ‚±‘ρ‚‡™ρ†Ώƒπ ƒπ€π€”ρ‚‡™π£°π£Ήρ†Ώƒπ€Žπ€ρ‚±‘𝣽𝀀test zerotest zerowe are testing SignPuddle 1.6Val ;-){"video":"