| 
									
										
										
										
											2016-07-25 08:37:26 +08:00
										 |  |  | # Request Based SFTP API
 | 
					
						
							| 
									
										
										
										
											2016-07-25 08:34:15 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | The request based API allows for custom backends in a way similar to the http | 
					
						
							|  |  |  | package. In order to create a backend you need to implement 4 handler | 
					
						
							|  |  |  | interfaces; one for reading, one for writing, one for misc commands and one for | 
					
						
							|  |  |  | listing files. Each has 1 required method and in each case those methods take | 
					
						
							|  |  |  | the Request as the only parameter and they each return something different. | 
					
						
							|  |  |  | These 4 interfaces are enough to handle all the SFTP traffic in a simplified | 
					
						
							|  |  |  | manner. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The Request structure has 5 public fields which you will deal with. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | - Method (string) - string name of incoming call | 
					
						
							| 
									
										
										
										
											2018-01-05 05:30:43 +08:00
										 |  |  | - Filepath (string) - POSIX path of file to act on | 
					
						
							|  |  |  | - Flags (uint32) - 32bit bitmask value of file open/create flags | 
					
						
							| 
									
										
										
										
											2016-07-25 08:34:15 +08:00
										 |  |  | - Attrs ([]byte) - byte string of file attribute data | 
					
						
							|  |  |  | - Target (string) - target path for renames and sym-links | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Below are the methods and a brief description of what they need to do. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-25 08:37:26 +08:00
										 |  |  | ### Fileread(*Request) (io.Reader, error)
 | 
					
						
							| 
									
										
										
										
											2016-07-25 08:34:15 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | Handler for "Get" method and returns an io.Reader for the file which the server | 
					
						
							|  |  |  | then sends to the client. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-25 08:37:26 +08:00
										 |  |  | ### Filewrite(*Request) (io.Writer, error)
 | 
					
						
							| 
									
										
										
										
											2016-07-25 08:34:15 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | Handler for "Put" method and returns an io.Writer for the file which the server | 
					
						
							| 
									
										
										
										
											2018-01-03 07:52:16 +08:00
										 |  |  | then writes the uploaded file to. The file opening "pflags" are currently | 
					
						
							|  |  |  | preserved in the Request.Flags field as a 32bit bitmask value. See the [SFTP | 
					
						
							| 
									
										
										
										
											2023-03-28 01:05:24 +08:00
										 |  |  | spec](https://filezilla-project.org/specs/draft-ietf-secsh-filexfer-02.txt#section-6.3) for | 
					
						
							| 
									
										
										
										
											2018-01-03 07:52:16 +08:00
										 |  |  | details. | 
					
						
							| 
									
										
										
										
											2016-07-25 08:34:15 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-25 08:37:26 +08:00
										 |  |  | ###    Filecmd(*Request) error
 | 
					
						
							| 
									
										
										
										
											2016-07-25 08:34:15 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | Handles "SetStat", "Rename", "Rmdir", "Mkdir"  and "Symlink" methods. Makes the | 
					
						
							|  |  |  | appropriate changes and returns nil for success or an filesystem like error | 
					
						
							| 
									
										
										
										
											2018-01-03 07:52:16 +08:00
										 |  |  | (eg. os.ErrNotExist). The attributes are currently propagated in their raw form | 
					
						
							|  |  |  | ([]byte) and will need to be unmarshalled to be useful. See the respond method | 
					
						
							|  |  |  | on sshFxpSetstatPacket for example of you might want to do this. | 
					
						
							| 
									
										
										
										
											2016-07-25 08:34:15 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-25 08:37:26 +08:00
										 |  |  | ### Fileinfo(*Request) ([]os.FileInfo, error)
 | 
					
						
							| 
									
										
										
										
											2016-07-25 08:34:15 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | Handles "List", "Stat", "Readlink" methods. Gathers/creates FileInfo structs | 
					
						
							|  |  |  | with the data on the files and returns in a list (list of 1 for Stat and | 
					
						
							|  |  |  | Readlink). | 
					
						
							| 
									
										
										
										
											2016-07-25 08:37:26 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ## TODO
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | - Add support for API users to see trace/debugging info of what is going on | 
					
						
							|  |  |  | inside SFTP server. | 
					
						
							| 
									
										
										
										
											2018-01-03 07:52:16 +08:00
										 |  |  | - Unmarshal the file attributes into a structure on the Request object. |